拦截器
SpringMVC中的Interceptor拦截器是非常重要和相当有用的,它的主要作用是拦截指定
的用户请求,并进行相应的预处理与后处理。其拦截的时间点在“处理器映射器根据用户提交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器,在处理器适配器执行处理器之前”。当然,在处理器映射器映射出所要执行的处理器类时,已经将拦截器与处理器组合为了一个处理器执行链,并返回给了中央调度器。
拦截器:
1)拦截器是springmvc中的一种,需要实现HandlerInterceptor接口。
2)拦截器和过滤器类似,功能方向侧重点不同。过滤器是用来过滤器请求参数,设置编码字符集等工作。
拦截器是拦截用户的请求,做请求做判断处理的。
3)拦截器是全局的,可以对多个controller做拦截。
一个项目中可以有o个或多个拦截器,他们在一起拦截用户的请求。拦截器常用在:用户登录处理,权限检查,记录日志。
拦截器的使用步骤:
1.定义类实现HandlerInterceptor接口
2.在springmvc配置文件中,声明拦截器,让框架知道拦截器的存在。拦截器的执行时间:
1)在请求处理之前,也就是controller类中的方法执行之前先被拦截。2)在控制器方法执行之后也会执行拦截器。
3)在请求处理完成后也会执行拦截器。
拦截器:看做是多个controller中公用的功能,集中到拦截器统一处理。使用的aop的思想
一个拦截器的例子
1.新建maven web项目
2.加入依赖
3.创建Controller类
4.创建一个普通类,作为拦截器使用
1)实现HandlerInterceptor接口
2)实现接口中的三个方法
5.创建show.jsp
6.创建springmvc的配置文件
1)组件扫描器,扫描@controller注解
2)声明拦截器,并指定拦截的请求uri地址
preHandle预处理方法
重要:是整个项目的入口,门户。
当preHandle返回true请求可以被处理。
preHandle返回falsel,请求到此方法就截止。
参数:HttpServletRequest request, 请求
HttpServletResponse response,应答
Object handler 被拦截的控制器对象
返回值boolean
true:请求是通过了拦截器的验证,可以执行处理器方法。
false:请求没有通过拦截器的验证,请求到达拦截器就截止了。
特点:
1.方法在控制器方法(MyController的doSome)之前先执行的
用户的请求首先到达此方法
2.在这个方法中可以获取请求的信息,验证请求是否符合要求。
可以验证用户是否登录,验证用户是否有权限访问某个连接地址(uri)。
如果验证失败,我们可以截断请求,请求不能被处理
如果验证成功,可以放行请求,此时控制器方法才能执行。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器的MyIntercepter的preHandle");
return true;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器的MyIntercepter的preHandle");
request.getRequestDispatcher("/WEB-INF/jsp/tips.jsp").forward(request,response);
return false;
}
postHandle:后处理方法。参数:
object handler : 被拦截的处理器对象MycontrollerModelAndview mv:处理器方法的返回值
特点∶
1.在处理器方法之后执行的(Mycontroller.dosome() )
2.能够获取到处理器方法的返回值ModelAndview,可以修改ModelAndview中的数据和视图,可以影响到最后的执行结果。
·
3.主要是对原来的执行结果做二次修正,
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器的MyIntercepter的preHandle");
// request.getRequestDispatcher("/WEB-INF/jsp/tips.jsp").forward(request,response);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器的MyIntercepter的postHandle");
//对原来的doSome执行结果,需要调整
if (modelAndView!=null){
modelAndView.addObject("mydate",new Date());
modelAndView.setViewName("other");
}
}
新建other.jsp
<%--
Created by IntelliJ IDEA.
User: Hou
Date: 2021/8/25
Time: 17:13
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>/WEB-INF/jsp/show.jsp从request作用域获取数据</h3>
<h3>myname数据:${myname}</h3>
<h3>myage数据:${myage}</h3>
<h3>拦截器中增加的数据:${mydate}</h3>
</body>
</html>
aftercompletion:最后执行的方法参数
object handler:被拦截器的处理器对象Exception ex:程序中发生的异常
特点:
1.在请求处理完成后执行的。框架中规定是当你的视图处理完成后,对视图执行了forwand。就认为请求处理完成。2.一般做资源回收工作的,程序请求过程中创建了一些对象,在这里可以删除,把占用的内存回收。
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
计算三个方法的总时间:
只有第一次比较长 650
后来越来越快
springmvc.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">
<!--springmvc的配置文件 声明Controller和其他web相关的内容-->
<!--配置文件扫描器-->
<context:component-scan base-package="com.hjs.controller"/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
<!--声明拦截器:拦截器可以有0或多个-->
<mvc:interceptors>
<!--声明第一个拦截器-->
<mvc:interceptor>
<!--指定拦截的请求uri地址
path:就是uri地址,可以使用通配符 **
**:表示任意的字符,文件或者多级目录和目录中的文件
http://localhost:8080/myweb/user/listUser.do
http://localhost:8080/myweb/student/listUser.do
-->
<mvc:mapping path="/**"/>
<!--声明拦截器对象-->
<bean class="com.hjs.handler.MyIntercepter"/>
</mvc:interceptor>
</mvc:interceptors>
<mvc:annotation-driven />
<!--注解驱动 ajax 静态资源-->
<!--
1.响应ajax请求,返回json
2.解决静态资源访问问题
-->
<mvc:default-servlet-handler />
</beans>
拦截器启动顺序
先声明的先执行,后声明的后执行
声明拦截器:
拦截器可以有0或多个在框架中保存多个拦截器是ArrayList ,
按照声明的先后顺序放入到ArrayList
拦截器和过滤器的区别
拦截器和过滤器的区别
1.过滤器是servlet中的对象,拦截器是框架中的对象
2.过滤器实现rilter接口的对象,拦截器是实现HandlerInterceptor
3.过滤器是用来设置request,response的参数,属性的,侧重对数据过滤的。拦截器是用来验证请求的,能截断请求。
4.过滤器是在拦截器之前先执行的。
5.社滤器是tomcat服务器创建的对象
笞器是springmvc容器中创建的对象6.过滤器是一个执行时间点。
笞截器有三个执行时间点
7.过滤器可以处理isp, js, html等等
拦截器是侧重拦截对controller的对象。如果你的请求不能被DispatcherServlet接收,这个请求不会执行拦截器内容8.拦截器拦截普通类方法执行,过滤器过滤servlet请求响应
登录例子
实现步骤:1.新建maven
2.修改web.xml注册中央调度器
3.新建index.jsp发起请求
4.创建MyController处理请求
5.创建结果show.jsp
6.创建一个login.jsp ,模拟登录(把用户的信息放入到session ) ;创建一个jsp , logout.jsp,模拟退出系统(从session中删除数据)
7.创建拦截器,从session中获取用户的登录数据,验证能否访问系统
8.创建一个验证的jsp ,如果验证失败,给出提示
9.创建springmvc配置文件
声明组件扫描器
声明拦截器
login.jsp
logout.jsp
MyIntercepter.java
访问不匹配时
访问匹配时,return true;
tips.jsp