一、自定义拦截器
Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口。
二、HandlerInterceptor接口的三个方法
1.preHandler():
此方法在业务处理器(Controller)处理请求之前被调用。在此方法中可以对用户请求request进行处理。
若返回值为true,则继续调用后续的拦截器和目标方法。若返回值为false,则不会再调用后续的拦截器和目标方法。
* 常用来做权限。日志,事务等。
2.postHandler():
此方法在业务处理器处理完请求后,在DispatcherServlet向客户端返回响应前(调用目标方法之后,渲染视图之前)被调用,在该方法中对用户请求request进行处理。
* 常用来对请求域中的属性或视图做出修改。
3.afterCompletion():
此方法在DispatcherServlet完全处理完请求后被调用
* 常用来做资源释放
三、拦截器和过滤器在执行先后顺序图:
四、拦截器使用举例
用户登录状态检查例子:通过用户发送的请求,判断用户是否登录,若未登录则不允许访问被保护资源
步骤:
1.创建拦截器类
一般拦截器类直接实现HandlerInterceptor接口,重写HandlerInterceptor接口的三个方法就可以了,
但由于此处只需要用到 HandlerInterceptor接口的preHandler()方法,所以我们可以选择继承HandlerInterceptor接口的抽象实现类HandlerInterceptorAdapter,重写其中的preHandler()方法。
在preHandler()方法中我们只需要从session中查询用户信息是否为null,就可以知道用户是否已登录了。
public class LoginInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); Admin admin = (Admin) session.getAttribute("loginAdmin"); if (admin == null){ throw new AccessForbiddenException("请登录后再访问!"); } return true; } }
2.注册拦截器
在web.xml中注册拦截器,配置需要拦截和不需要拦截的请求
<!--注册拦截器--> <mvc:interceptors> <mvc:interceptor> <!--mvc:mapping配置要拦截的资源--> <!-- /* 对应一层路径,比如:/aaa --> <!-- /** 对应多层路径,比如:/aaa/bbb 或 /aaa/bbb/ccc 或 /aaa/bbb/ccc/ddd--> <mvc:mapping path="/**"/> <!--mvc:exclude- mapping配置不拦截的资源--> <!--去登陆页面,不拦截--> <mvc:exclude-mapping path="/admin/to/login/page.html"/> <!--执行登陆操作,不拦截--> <mvc:exclude-mapping path="/admin/do/login.html"/> <!--执行退出登录操作,不拦截--> <mvc:exclude-mapping path="/admin/do/Logout.html"/> <bean id="loginInterceptor" class="com.atguigu.crowd.mvc.interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>