@Spring mvc 中的拦截器知识点
什么是拦截器?
有时候有些网站只给特定的人群登陆浏览,这时候就需要使用拦截器,
拦截器与js的过滤器Filter类似,它主要用于拦截用户的请求并做出相应的处理,通常用在限权登陆验证、记录请求信息的日志、判断用户是否登陆等功能。
三种方法
perHandle方法(重点)
该方法在控制器处理请求方法前执行,返回true继续执行,false中断后续操作。类似下面简单的登陆拦截:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 获取请求的URL
String url = request.getRequestURI();
//login.jsp或登陆请求放行,不拦截
if(url.indexOf("/toLogin")>=0||url.indexOf("/login")>=0) {
return true;
}
//获取session
HttpSession session = request.getSession();
Object obj = session.getAttribute("user");
if(obj!=null) {
return true;
}
//没有登陆且不是登陆页面,转发到登陆页面,并给出提示信息
request.setAttribute("msg", "还没有登陆,请登录!");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);//?
return false;
}
postHandle方法
该方法在控制器的处理请求方法调用之后执行,在解析视图之前执行,一般用来对请求域中的模型和视图进行进一步修改。
例如
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle方法在控制器处理请求方法后,解析视图之前执行");//模拟修改
}
afterCompletion方法
该方法在控制器处理请求方法执行完成后执行,一般用来实现资源清理、记录日志信息等工作。
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
System.out.println("afterCompletion方法在控制器处理请求方法完成之后,即视图渲染完成之后执行");//模拟操作
}
拦截器的配置
配置文件如下:
<mvc:interceptors>
<!-- 配置拦截器作用的路径 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<!-- 表示匹配的指定路径的请求才进行拦截 -->
<bean class = "interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
在这里注意几点:
1.interceptors元素的子元素必须按照mapping、exclude-mapping、bean的顺序配置。
2.path属性值为/**表示拦截所有路径,若为/gotoTest,则拦截以/gotoTest结尾的路径。
3.如果请求路径中包含不需要拦截的内容,可以通过exclude-mapping配置。
多个拦截器
的时候,preHandle按照配置的顺序执行,但是postHandle方法和afterCompletion方法按照配置顺序的逆序执行!
两个拦截器:
<mvc:interceptors>
<!-- 配置拦截器作用的路径 -->
<mvc:interceptor>
<!-- 配置拦截器作用的路径 -->
<mvc:mapping path="/**"/>
<!-- 表示匹配的指定路径的请求才进行拦截 -->
<bean class = "interceptor.Interceptor1"/>
</mvc:interceptor>
<mvc:interceptor>
<!-- 匹配拦截器作用的路径 -->
<mvc:mapping path="/gotoTest"/>
<!-- 表示匹配的指定路径的请求才进行拦截 -->
<bean class = "interceptor.Interceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
如有疑问请留言…