首先介绍一下拦截器及其作用:
1.拦截器一般在SpringMVC 框架的项目中使用。
2.作用:可以构成拦截器栈,完成特定功能。比如日志记录、登录判断、权限检查等作用。
3.拦截器执行流程:
(1)程序先执行preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方法,否则将不再向下执行;
(2)在业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向客户端返回响应;
(3)在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。
下面看一下拦截器的具体实现的代码和配置:
1.声明一个自定义拦截器实现HandlerInterceptor 接口。这里是对登录功能做相应处理的拦截器。
/**
* 登录拦截器
*/
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {
// 获取请求的URL
String url = request.getRequestURI();
// URL:除了登录请求外,其他的URL都进行拦截控制
if (url.indexOf("/login") >=0) {
return true;
}
// 获取Session
HttpSession session = request.getSession();
User user = (User) session.getAttribute("USER_SESSION");
// 判断Session中是否有用户数据,如果有,则返回true,继续向下执行
if (user != null) {
return true;
}
// 不符合条件的给出提示信息,并转发到登录页面
request.setAttribute("msg", "您还没有登录,请先登录!");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp")
.forward(request, response);
return false;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
2.去spring-config.xml配置文件中配置拦截器。
<!--配置静态资源的访问映射,此配置中的文件,将不被前端控制器拦截 -->
<mvc:resources location="/js/" mapping="/js/**" />
<mvc:resources location="/css/" mapping="/css/**" />
<mvc:resources location="/fonts/" mapping="/fonts/**" />
<mvc:resources location="/images/" mapping="/images/**" />
<mvc:resources location="/tu/" mapping="/tu/**" />
<mvc:resources location="/static/" mapping="/static/**" />
<mvc:resources location="/data/" mapping="/data/**" />
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 局部拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/**" />
<!--配置请求的访问映射,此配置中的请求,将不被前端控制器拦截 -->
<mvc:exclude-mapping path="/index" />
<mvc:exclude-mapping path="/toLogin" />
<mvc:exclude-mapping path="/login" />
<mvc:exclude-mapping path="/toRegister" />
<mvc:exclude-mapping path="/registerUser" />
<mvc:exclude-mapping path="/showTourism" />
<mvc:exclude-mapping path="/findTourismByName" />
<mvc:exclude-mapping path="/toCart" />
<mvc:exclude-mapping path="/findCart" />
<!--配置静态资源的访问映射,此配置中的文件,将不被前端控制器拦截 -->
<mvc:exclude-mapping path="/js/**" />
<mvc:exclude-mapping path="/css/**" />
<mvc:exclude-mapping path="/fonts/**" />
<mvc:exclude-mapping path="/images/**" />
<mvc:exclude-mapping path="/tu/**" />
<mvc:exclude-mapping path="/static/**" />
<mvc:exclude-mapping path="/data/**" />
<bean class="com.lzjtu.gaoyang.interceptor.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
需要注意的一点:
在上述局部拦截器配置中 ,需要设置排除在拦截之外的请求,这些请求将不经过拦截器。对于这些请求配置的位置只能如上所示,在拦截所有请求和拦截器类的配置之间。
到此,拦截器的局部拦截实现,可在浏览器进行访问验证。这里就不展示具体截图了。
最后这里搜集了拦截器和过滤器的区别:
1、过滤器基于函数回调、拦截器基于反射。
2、过滤器几乎对所有请求起作用,拦截器只对目标执行方法起作用。
3、过滤器对请求进行预处理、再交给Servlet处理并且生成响应,最后Filter再对服务器响应进行后处理;
拦截器可以在方法执行前调用(preHandle),方法执行后调用(postHandle),视图页面渲染后调用(afterCompletion)。