拦截器它的主要作用是拦截用户的请求并进行相应的处理。在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放行)