1.目的
在Spring MVC中interceptor用来拦截客户请求,进行处理实现某功能,如下图所示
2.实现
web应用开发时,继承spring MVC中的HandlerInterceptorAdapter抽象类,实现其中的抽象方法preHandler(),postHandler(),afterCompletion(),此时该类即可作为Interceptor()使用,在一个web应用中可以实现多个Interceptor,组成一个拦截器链,其中方法的执行顺序如下所示
3. 注册和映射
编写的Interceptor需要在spring MVC的配置文件中进行注册,如下配置节所示,可以配置需要拦截和不需要拦截的url地址
<mvc:interceptors> <mvc:interceptor> <!-- /**的意思是所有文件夹及里面的子文件夹 /*是所有文件夹,不含子文件夹 /是web项目的根目录 --> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/login"/> <mvc:exclude-mapping path="/js/**"/> <mvc:exclude-mapping path="/css/**" /> <mvc:exclude-mapping path="/image/**"/> <bean class="com.lpq.interceptorDemo.LoginInterceptor"/> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/login"/> <bean class="com.lpq.interceptorDemo.OtherInterceptor" /> </mvc:interceptor> </mvc:interceptors>
4.登录的例子
Interceptor的实现
//登录拦截器,判断用户是否登录
@Component
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
Object user=request.getSession().getAttribute("user");
if(user==null){
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);
return false;
}
System.out.println("LoginInterceptor preHandler()");
return true;
}
@Override
public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("LoginInterceptor postHandler()");
}
@Override
public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("LoginInterceptor afterCompletion()");
}
}
login Controller的实现
@Controller
public class LoginController {
@RequestMapping(value="/login",method= RequestMethod.GET)
public String loginGet(){
return "login";
}
@RequestMapping(value="/login",method=RequestMethod.POST)
public String loginPost(HttpServletRequest req,HttpServletResponse resp){
String user=req.getParameter("username");
req.getSession().setAttribute("user",user);
return "success";
}
@RequestMapping(value="/personalPage",method=RequestMethod.GET)
public String personalPage(){
return "personalPage";
}
}
Interceptor配置和映射如下
<mvc:interceptors> <mvc:interceptor> <!-- /**的意思是所有文件夹及里面的子文件夹 /*是所有文件夹,不含子文件夹 /是web项目的根目录 --> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/login"/> <mvc:exclude-mapping path="/js/**"/> <mvc:exclude-mapping path="/css/**" /> <mvc:exclude-mapping path="/image/**"/> <bean class="com.lpq.interceptorDemo.LoginInterceptor"/> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/login"/> <bean class="com.lpq.interceptorDemo.OtherInterceptor" /> </mvc:interceptor> </mvc:interceptors>