JAVA-第十部分-Spring-MVC拦截器和异常处理

433 阅读2分钟

写在前面

Spring-MVC拦截器

  • interceptor
  • 类似Servlet开发中的Filter,用于对于处理器进行预处理和后处理
  • 拦截器与过滤器的区别 image.png
1Filter是基于函数回调(doFilter()方法)的,而Interceptor则是基于Java反射的(AOP思想)。
2Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
3Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
4、Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
5、在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
6Filter在过滤是只能对request和response进行操作,而interceptor可以对request、response、handler、modelAndView、exception进行操作。

自定义拦截器

  • 创建拦截器类实现HandleInterceptor接口
//在目标方法执行之前 执行
//获取请求的内容,进行处理
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("preHandle");
    //返回false 不放行,直接拦截,通过请求进行重定向/转发
    ```
    String param = request.getParameter("param");
    if (param.equals("yes")) {
        return true;
    } else {
        //转发,地址不变
        request.getRequestDispatcher("/error.jsp").forward(request, response);
        return false;
    }
}

//在目标方法执行之后,视图对象返回之前执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    //获取视图模型modelAndView进行修改
    modelAndView.addObject("name","lisi");
    System.out.println("postHandle"); 
}

//在流程都执行完毕后,执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    System.out.println("afterCompletion");
}
  • 配置拦截器
<!--配置拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--对哪些资源执行拦截-->
        <mvc:mapping path="/**"/>
        <bean class="com.java.interceptor.MyInterceptor1"></bean>
    </mvc:interceptor>
</mvc:interceptors>
  • 效果
preHandle
//目标方法
show...
postHandle
afterCompletion

配置多个拦截器

  • 配置
<!--配置拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--对哪些资源执行拦截-->
        <mvc:mapping path="/**"/>
        <bean class="com.java.interceptor.MyInterceptor1"></bean>
    </mvc:interceptor>
    <mvc:interceptor>
        <!--对哪些资源执行拦截-->
        <mvc:mapping path="/**"/>
        <bean class="com.java.interceptor.MyInterceptor2"></bean>
    </mvc:interceptor>
</mvc:interceptors>
  • 效果
preHandle
preHandle22222
show...
postHandle22222
postHandle
afterCompletion2222222
afterCompletion

拦截器拦截静态资源的解决方法

  • web.xml配置
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.css</url-pattern>
    <url-pattern>/ass/*"</url-pattern>
    <url-pattern>/img/*</url-pattern>
</servlet-mapping>
  • spring-web.xml配置
<!--mvc静态资源-->
<mvc:default-servlet-handler/>

<!--配置拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.java.interceptor.PrivilegeInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>
  • inceptor排除拦截的访问
<!--配置哪些排除拦截-->
<mvc:exclude-mapping path="/user/login"/>

Spring-MVC异常处理机制

  • 前端控制器找到框架异常处理器进行处理

简单异常处理器

  • Spring-MVC提供的简单的异常处理器SimpleMappingExceptionResolver
  • spring-mvc.xml配置
<!--配置简单映射异常处理器-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <!--和指定异常不匹配的默认处理-->
    <property name="defaultErrorView" value="error"/>
    <property name="exceptionMappings">
        <map>
            <!--异常的类 跳转的界面-->
            <entry key="com.java.exception.MyException" value="error_myexception"></entry>
            <entry key="java.lang.ClassCastException" value="error_classCastexception"/>
        </map>
    </property>
</bean>

自定义异常处理

  • Sping的异常处理接口HandlerExceptionResolver定义自己的异常处理器
  • 创建自定义异常处理器类
public class MyExceptionResolver implements HandlerExceptionResolver {
    //参数exception 异常对象
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView modelAndView = new ModelAndView();
        if (e instanceof MyException) {
            modelAndView.addObject("info","自定义异常");
            modelAndView.setViewName("error_myexception");
        } else if (e instanceof ClassCastException) {
            modelAndView.addObject("info","ClassCastException");
            modelAndView.setViewName("error_classCastexception");
        }
        modelAndView.addObject("info","otherException");
        modelAndView.setViewName("error");
        return modelAndView;
    }
}
  • spring-mvc.xml配置
<!--自定义异常处理器-->
<bean class="com.java.reslover.MyExceptionResolver"></bean>