看了慕课网springmvc拦截器的课程,做一些笔记;
链接:http://www.imooc.com/learn/498
拦截器和过滤器区别
1. 拦截器基于springmvc框架,过滤器基于servlet;
2. 拦截器只能拦截请求,过滤器可以过滤所有资源;
3. 拦截器可以理解为特殊的过滤器
拦截器实现
创建拦截器对应类,并实现org.springframework.web.servlet.HandlerInterceptor接口;
该接口有三个接口方法需要实现:
1. boolean preHandle(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,Object o);
preHandle方法在接收到请求后执行,可以通过boolean返回值来决定是否拦截请求(true 表示请求继续往后台发送,false表示请求被截断,不再继续往后台进行)
2. public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,Object o, ModelAndView modelAndView)
postHandle 方法在请求没有被截断,且请求被后台对应方法处理后执行,该方法可以修改请求的内容:如修改request、reqponse的内容,还可以修改modelAndView中的数据,对model数据和view视图的跳转进行修改(通过参数可以知道)
3. public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e)
afterCompletion 方法用的比较少,一般在请求处理完了之后做一些关闭数据库连接池、关闭文件流之类的操作。
总地来说,请求的顺序大致如下:前端请求 --> preHandle --> controller接收请求 --> postHandle --> afterCompletion
多个拦截器请求顺序:
应用
由于拦截器的特性只能拦截请求,可以用来处理请求权限问题,处理用户登录(好像也是权限问题)等场景,即用户没有权限的请求不允许访问,或者在用户登陆后将用户信息转发到主页首页等场景
使用方法
在创建拦截器之前,首先我们需要有一个可正常运行的请求环境,具体环境搭建就不多介绍了(练习代码我还在整理)。
1、在项目中创建拦截器对应类,实现HandlerInterceptor接口
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("this is preHandle method");
return false;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("this is postHandle method");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("this is afterCompletion method\n\n");
}
}
2、在spring中添加拦截器的配置
<mvc:interceptors>
<mvc:interceptor>
<!--这里的path可以通过正则表达式来筛选请求对应的url,我们这里暂时只添加这一个请求-->
<mvc:mapping path="/login1"/>
<bean class="com.controller.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
3、修改preHandle方法返回值
修改preHandle方法返回值来确定该请求是否继续往后台发送,如果继续则会进入请求对应的controller,在controller处理完请求后,会依次执行postHandle 和afterCompletion方法;
4、测试rest
我自己对请求做了rest风格的测试,发现方法只走到了controller便没有继续往postHandle进行,不知道是什么原因,(猜测是由于rest方式的请求只返回数据,不通过modelAndView所以spring做了相应的处理,所以没有继续往下走)具体原因还在研究中。另一方面,现在工作中很多项目均使用RESTful风格请求数据,所以暂时不会深入研究这里关于modelAndView相关的问题。