springmvc过滤器拦截器区别(SpringMVC之异常解析器拦截器)
springmvc过滤器拦截器区别(SpringMVC之异常解析器拦截器).....}catch(Exception1 e){public String xxx(){try{......
一、异常解析器项目中会面临各种异常
- 运行时异常,大多在开发测试阶段解决掉
 - 非运行时异常,是必须要处理的
 - 业务异常,是根据业务要求,在出现非法情况时,人为抛出的
 
DAO、service的所有异常,必须无条件上抛,全部集中到Controller
Controller中处理所有异常,将不同的异常转发到不同的错误处理结果中
2、方案方案一、Controller中的每个handler自己处理异常
public String xxx(){
try{
......
}catch(Exception1 e){
.....
}catch(Exception1 e){
.....
}
}
这种处理异常的方式,把异常处理的逻辑分散在各个handler中,不利于管理。
方案二:Controller中的每个handler不在自己处理异常,而是直接上抛所有异常。
定义一个“异常解析器”集中捕获处理所有异常
public class MyExResolver implements HandlerExceptionResolver {
    /**
     *
     * @param httpServletRequest
     * @param httpServletResponse
     * @param o    出现异常的handler
     * @param e
     * @return
     *
     * 异常解析器:主体逻辑
     * 执行时刻:当handler中抛出异常时,会执行,捕获异常,并可以跳转到错误页面
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest  HttpServletResponse httpServletResponse  Object o  Exception e) {
        ModelAndView mv = new ModelAndView();
        if (e instanceof SQLException){
            mv.setViewName("redirect:/dispatch/xxx");
        }else if (e instanceof NullPointerException){
            mv.setViewName("redirect:/dispatch/xxx");
        }else{
            mv.setViewName("redirect:/dispatch/xxx");
        }
        return mv;
    }
}
    
<!--在springmvc中声明异常解析器即可-->
<bean class="com.suyang.resolver.MyExResolver"></bean>二、拦截器
    
主要针对 handler 抽取controller中的冗余功能。
主要作用场景:登录判断(用的较少)
1、定义拦截器public class MyInterceptor implements HandlerInterceptor{
    //在handler之前执行
    public boolean preHandle(HttpServletRequest request  HttpServletResponse response  Object handler) throws Exception {
        //登录状态判断
        if (request.getSession().getAttribute("user") != null) {
            return true;
        }
        response.sendRedirect("/user/login"); //中断前响应
        return false;//拦截了,中断请求,后续的拦截器或handler都不在执行
    }
    //在handler之后执行
    public void postHandle(HttpServletRequest request  HttpServletResponse response  Object handler  @Nullable ModelAndView modelAndView) throws Exception {
    }
    //页面渲染完毕执行
    public void afterCompletion(HttpServletRequest request  HttpServletResponse response  Object handler  @Nullable Exception ex) throws Exception {
    }
}2、配置拦截路径
    
<!--声明拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/inter/**"/>
        <bean class="com.suyang.interceptor.MyInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>三、上传1、导入依赖
    
<!--======================上传下载======================-->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
</dependency>
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>
<!--======================上传下载======================-->2、表单
    
//上传文件时,enctype="multipart/form-data"
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
    <title>上传</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/upload/test1" method="post" enctype="multipart/form-data">
        <input type="text" name="username"/><br>
        <input type="file" name="source" /><br>
        <input type="submit" value="上传">
    </form>
</body>
</html>3、上传解析器
    
<!--上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--请求的编码格式,必须和jsp的pageEncoding属性一致,默认为ISO-8859-1-->
    <property name="defaultEncoding" value="utf-8"/>
    <!--最大上传文件大下,单位字节-->
    <property name="maxUploadSize" value="1048576"/>
</bean>4、Handler
    
配置上传解析器后,handler中形参MultipartFile source才会收到请求的文件
@RequestMapping("test1")
public String test1(MultipartFile source String username) throws IOException {
    //文件的原始名称
    String filename = source.getOriginalFilename();
    //定制全局唯一的命名
    String unique = java.util.UUID.randomUUID().toString();
    //获取文件的后缀
    String ext = FilenameUtils.getExtension(filename);
    //定制全局唯一文件名
    String uniqueFileName = unique  "."  ext;
    System.out.println("全局唯一文件名=" uniqueFileName);
    //文件类型
    String type = source.getContentType();
    System.out.println("filename:" filename "---type:" type);
    //将上传的文件存到指定目录中
    source.transferTo(new File("f:\\" filename));
    return "index";
}四、下载1、超链
    
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
    <title>下载</title>
</head>
<body>
    <a href="${pageContext.request.contextPath}/download/test1?name=20211111143240.jpg">免费下载</a>
</body>
</html>2、Handler
    
@RequestMapping("test1")
public void test1(String name  HttpServletResponse response) throws IOException {
    //下载文件存放路径
    String path = "f:";
    //文件的完整路径   File.separator="\"
    String filepath = path   File.separator   name;
    System.out.println(filepath);
    //设置响应头,告知浏览器,要以附件的形式保存内容,name为浏览器显示的下载文件名
    //不设置会默认打开文件
    response.setHeader("content-disposition" "attachment;filename=" name);
    //new FileInputStream()读取目标文件,response.getOutputStream()写出给客户端浏览器
    IOUtils.copy(new FileInputStream(filepath) response.getOutputStream());
}
    





