SpringMVC拦截器有许多应用场景,比如:登录认证拦截器,字符过滤拦截器,日志操作拦截器等等。
1、自定义拦截器
SpringMVC拦截器的实现一般有两种方式
1. 自定义的Interceptor类要实现了Spring的HandlerInterceptor接口。
2. 继承实现了HandlerInterceptor接口的类,比如Spring已经提供的实现了HandlerInterceptor接口的抽象类 HandlerInterceptorAdapter。
2、拦截器拦截流程
3、拦截器规则
我们可以配置多个拦截器,每个拦截器中都有三个方法。下面将总结多个拦截器中的方法执行规律。
- preHandle:Controller方法处理请求前执行,根据拦截器定义的顺序,正向执行。
- postHandle:Controller方法处理请求后执行,根据拦截器定义的顺序,逆向执行。需要所有的preHandle方 法都返回true时才会调用。
- afterCompletion:View视图渲染后处理方法:根据拦截器定义的顺序,逆向执行。preHandle返回true就会 调用。
public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {} @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {} }
4、登录拦截器
接下来编写一个登录拦截器,这个拦截器可以实现认证操作。就是当我们还没有登录的时候,如果发送请求访问我 们系统资源时,拦截器不放行,请求失败。只有登录成功后,拦截器放行,请求成功。登录拦截器只要在 preHandle()方法中编写认证逻辑即可,因为是在请求执行前拦截。
/** * 登录拦截器 */ public class LoginInterceptor implements HandlerInterceptor { /** 在执行Controller方法前拦截,判断用户是否已经登录, 登录了就放行,还没登录就重定向到登录页面 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { HttpSession session = request.getSession(); User user = session.getAttribute("user"); if (user == null){ //还没登录,重定向到登录页面 response.sendRedirect("/toLogin"); }else { //已经登录,放行 return true; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {} @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {} }
编写完SpringMVC拦截器,我们还需要在springmvc.xml配置文件中,配置我们编写的拦截器,配置代码如下:
1. 配置需要拦截的路径
2. 配置不需要拦截的路径
3. 配置我们自定义的拦截器类
<!--配置拦截器--> <mvc:interceptors>
<mvc:interceptor> <!-- mvc:mapping:拦截的路径 /**:是指所有文件夹及其子孙文件夹 /*:是指所有文件夹,但不包含子孙文件夹 /:Web项目的根目录--> <mvc:mapping path="/**"/> <!-- mvc:exclude-mapping:不拦截的路径,不拦截登录路径 /toLogin:跳转到登录页面 /login:登录操作 --> <mvc:exclude-mapping path="/toLogin"/> <mvc:exclude-mapping path="/login"/> <!--class属性就是我们自定义的拦截器--> <bean id="loginInterceptor" class="cn.zwq.springmvc.interceptor.LoginInterceptor"/> </mvc:interceptor>
<!--如果还有其他拦截器,那么还是按照上面的拦截器配置--> </mvc:interceptors>
编写SpringMVC配置类,将自定义拦截器添加到配置中:
@Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { //创建自定义的拦截器 Interceptor interceptor = new LoginInterceptor(); //添加拦截器 registry.addInterceptor(interceptor) //添加需要拦截的路径 .addPathPatterns(""); } }
练习: