文章目录
- 一 概念
- 二 3步使用
- 三 HandlerInterceptor接口
- 四 代码实现
一 概念
Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。
拦截器可以在进入处理器之前做一些操作,或者在处理器完成后进行操作,甚至是在渲染视图后进行操作。
在这里仅仅演示登录的判断
二 3步使用
①创建拦截器类实现HandlerInterceptor接口
②配置拦截器(在springmvc-config.xml中配置)
③测试拦截器效果是否实现
三 HandlerInterceptor接口
这个接口含有三个方法:
方法名 | 作用说明 |
---|---|
preHandle() | 这个方法将在请求处理之前进行调用,该方法的返回值是布尔值,当返回值为false时,表示请求结束,后续的Interceptor和Controller都不会再执行;当返回值为true时就会继续调用下一个Interceptor的preHandle方法 |
postHandle | 该方法是在当前请求进行处理之后被调用,前提是preHandle方法的返回值为true时才能被调用,且它会在DispatcherServlet进行视图返回渲染之前被调用,所以在这个方法里可对Controller层处理之后的ModelAndView对象进行操作 |
afterCompletion | 该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行,前提是preHandle方法的返回值为true时才能被调用 |
四 代码实现
①创建创建拦截器类实现HandlerInterceptor接口
import cn.com.sise.pojo.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 获取请求的URLSystem.out.println("preHandle执行中");// 获取请求的URLString url = request.getRequestURI();// URL:除了login.jsp是可以公开访问的,其它的URL都进行拦截控制if (url.indexOf("/lgCheck") >= 0) {return true;}// 获取SessionHttpSession session = request.getSession();User user = (User) session.getAttribute("USER_SESSION");// 判断Session中是否有用户数据,如果有,则返回true,继续向下执行if (user != null) {return true;}// 不符合条件的给出提示信息,并转发到登录页面request.setAttribute("msg", "您还没有登录,请先登录!");request.getRequestDispatcher("/login.jsp").forward(request, response);return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle在目标方法执行之后,视图渲染之前执行");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("在所有方法执行之后执行");}
该类所在目录截图
②配置拦截器(在springmvc-config.xml中配置)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置拦截器--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><mvc:exclude-mapping path="/login"/><bean class="interceptor.LoginInterceptor" /></mvc:interceptor></mvc:interceptors></beans>
说明:
下面这种/** 表示拦截的是所有请求
如果要放行某个路径,可在下面的标签进行配置
③测试拦截器效果是否实现
在控制器中新建一个类作为登录路径和主页main路径以及lgCheck检查登录的路径(简单模拟)