写在前面
Spring-MVC拦截器
interceptor
- 类似
Servlet开发中的Filter,用于对于处理器进行预处理和后处理
- 拦截器与过滤器的区别

1、Filter是基于函数回调(doFilter()方法)的,而Interceptor则是基于Java反射的(AOP思想)。
2、Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
3、Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
4、Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
5、在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
6、Filter在过滤是只能对request和response进行操作,而interceptor可以对request、response、handler、modelAndView、exception进行操作。
自定义拦截器
- 创建拦截器类实现
HandleInterceptor接口
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
```
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.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
拦截器拦截静态资源的解决方法
<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>
<mvc:default-servlet-handler/>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.java.interceptor.PrivilegeInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<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 {
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;
}
}
<bean class="com.java.reslover.MyExceptionResolver"></bean>