1. SpringMVC拦截器作用
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那样子判断当前时间是否是购票时间。
2.SpringMVC 拦截器的原理
3.拦截器实现方式
springMVC拦截器的实现一般有两种方式
第一种方式是要定义的Interceptor类要实现了Spring的HandlerInterceptor 接口
第二种方式是继承实现了HandlerInterceptor接口的类,比如Spring已经提供的实现了HandlerInterceptor接口的抽象类HandlerInterceptorAdapter
HandlerInterceptor 接口中定义了三个方法,我们就是通过这三个方法来对用户的请求进行拦截处理的。
preHandle(): 这个方法在业务处理器处理请求之前被调用,SpringMVC 中的Interceptor 是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor 。每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean 类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法。
postHandle():这个方法在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行。
fterCompletion():该方法也是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。
4.代码部分
dispatcher-servlet.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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/view/" />
<property name="suffix" value=".jsp" />
</bean>
<!--开启扫描注解功能-->
<!--在访问时,会自动找到类中含有controller的方法-->
<context:component-scan base-package="user.controller"/>
<!--配置注解驱动-->
<mvc:annotation-driven/>
<!-- 注解驱动会阻止静态资源访问,所以要开启静态资源访问如下 -->
<!-- 允许此目录下的所有文件可见 -->
<mvc:resources location="/" mapping="/**" />
<!-- <mvc:resources location="/static" mapping="/**" />-->
<!--直接允许根目录下的所以静态资源可见-->
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--配置拦截器作用路径-->
<mvc:mapping path="/**" />
<bean class="interceptor.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
</beans>
interceptor类
package interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* ClassName: LoginInterceptor
* Author: Admini
* Date: 2021/1/12 17:34
*/
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler)
throws Exception{
//获取请求的URL
String url=request.getRequestURI();
System.out.println(url);
//如果请求不为个人主页则放行
if(!url.equals("/user/personal")){
return true;
}
HttpSession session=request.getSession();
Object obj=session.getAttribute("username");
if(obj!=null)
return true;
String path=(String)request.getAttribute("path");
request.setAttribute("msg","请先登录!");
request.getRequestDispatcher(path+"/view/login.jsp").forward(request,response);
return false;
}
}
参考资料:
https://blog.csdn.net/drdongshiye/article/details/88583967
https://www.iteye.com/blog/elim-1750680