拦截器它的主要作用是拦截用户的请求并进行相应的处理。在web应用中还是有很多场景需要使用到拦截器的(权限验证。。),spring mvc 的Interceptor跟struts2的Interceptor差不多
一、定义Interceptor实现类
SpringMVC中的Interceptor拦截请求是通过HandlerInterceptor来实现的。在SpringMVC中定义一个Interceptor非常简单,主要有两种方式,第一种方式是要定义的Interceptor类要实现了Spring的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor接口的类,比如Spring已经提供的实现了HandlerInterceptor接口的抽象类HandlerInterceptorAdapter ;第二种方式是实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。
postHandle在业务处理器处理请求执行完成后,生成视图之前执行,afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 。所以要想实现自己的权限管理逻辑,需要继承HandlerInterceptorAdapter并重写其三个方法。
<!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 拦截所有user的请求 --> <mvc:mapping path="/cart.html"/> <mvc:mapping path="/insertOrder.html"/> <mvc:mapping path="/updateState.html"/> <mvc:mapping path="/insertDiscuss.html"/> <bean class="com.daiingnan.interceptor.UserInterceptor"></bean><!--拦截器实现类--> </mvc:interceptor> <mvc:interceptor> <!-- 拦截座位选择--> <mvc:mapping path="/seat.html"/> <bean class="com.daiingnan.interceptor.SeatInterceptor"></bean> </mvc:interceptor> <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 --> <!-- mvc:interceptors下的拦截器默认拦截所有请求 <bean class="com.daiingnan.interceptor.UserInterceptor"></bean>--> </mvc:interceptors>UserInterceptor拦截器是用来作为权限验证的
具体实现
public class UserInterceptor implements HandlerInterceptor{ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // TODO Auto-generated method stub User user = (User) request.getSession().getAttribute("user"); if(user!=null){ return true; }else{ request.setAttribute("error", "您还未登录,请先登录!"); request.getRequestDispatcher("/jsp/login.jsp").forward(request, response); return false; } } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub } }拦截器放行返回true(与struts2不同,struts2通过调用invoke放行)