Spring MVC中的拦截器

news/2024/10/17 21:23:49/

在之前学习JAVAWEB 的时候,我们学习了过滤器的知识。过滤器的作用是保护请求的服务器资源,在请求资源被执行之前,如果请求地址符合拦截范围,则会先执行过滤器。过滤器的执行时机,是在Servlet之前执行的。但是在使用了SpringMVC后,Servlet只有一个了,也就是DisptcherServlet。那么,如果我们仍然使用过滤器来完成请求的拦截,因为过滤器是在Servlet之前执行的,就会造成,过滤器会拦截DispatcherServlet所有的请求。那么,如果我们有部分请求不想被拦截,怎么办?

拦截器使用


Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。
    要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置。通常拦截器类可以通过两种方式来定义。
    1.通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义。
    2.通过实现WebRequestInterceptor接口,或继承WebRequestInterceptor接口的实现类来定义。

 

拦截器和过滤器的区别


       1拦截器SpringMVC的,而过滤器是servlet的。
  2拦截器不依赖与servlet容器,由spring容器初始化,过滤器依赖与servlet容器,由servlet容器初始化。
  3拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  4拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  5在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
       6拦截器可以获取IOC容器中的各个bean,而过滤器就不太方便,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

1.定义一个拦截器

public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {/*在请求到达我们定义的handler之前工作的*/System.out.println("MyInterceptor preHandle");/*返回的是true,代表放行,可以继续到达handler*/return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("MyInterceptor postHandle");/*handler 处理单元返回ModelAndView 时候进行 拦截*/}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {/*页面渲染完毕,但是还没有给浏览器响应数据的时候*/System.out.println("MyInterceptor afterCompletion");}
}


2.springmvc.xml中注册拦截器

   

<!--注册拦截器--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/login.action"/><bean id="myInterceptor" class="com.msb.interceptor.MyInterceptor"></bean></mvc:interceptor></mvc:interceptors>


拦截器内容详解


1、preHandle方法

  • 执行时机:  再进入控制单元方法之前执行
  • 如何调用:  按拦截器定义顺序调用
  • 具体作用:  如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去 进行处理,则返回 true。 如果程序员决定不需要再调用其他的组件去处理请求,则返回 false。
  • 参数详解
  1.   HttpServletRequest arg0,拦截的请求的request对象
  2.     HttpServletResponse arg1, 拦截的请求的response对象
  3.     Object arg2       封存了单元方法对象的HandleMethod对象 

   

 /**** @param request  请求对象* @param response 响应对象* @param handler  目标要调用的Handler* @return 返回true放行,返回false拦截* @throws Exception*/public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {/*在请求到达我们定义的handler之前工作的*/System.out.println("MyInterceptor preHandle");/*设置请求和响应的乱码 *//* request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");*/// 判断是否登录/*User user =(User) request.getSession().getAttribute("user");if(null == user)response.sendRedirect("index.jsp");return false;*/// 用户权限控制return true;}

2、postHandle方法

  • 执行时机: 在进行数据处理和做出响应之间进行这个方法的调用
  • 如何调用  :在拦截器链内所有拦截器返成功调用
  • 具体作用:  在业务处理器处理完请求后,但是 DispatcherServlet 向客户端返回响应前被调用,
  • 在该方法中对用户请求 request域数据进行处理。
  • 参数详解
  1.         HttpServletRequest arg0, 拦截的请求的request对象
  2.         HttpServletResponse arg1, 拦截的请求的response对象
  3.         Object arg2, 封存了单元方法对象的HandleMethod对象
  4.         ModelAndView arg3 封存了单元方法的返回值资源路径和请求转到的Map数据 
/**** @param request* @param response* @param handler* @param modelAndView  controller响应的结果,视图和数据* @throws Exception*/public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("MyInterceptor postHandle");/*控制数据*//*Map<String, Object> map = modelAndView.getModel();String msg = (String)map.get("msg");String newMsg = msg.replaceAll("脏话", "**");map.put("msg", newMsg);*//*控制视图*//*modelAndView.setViewName("/testDemo1.jsp");*/}


3、afterCompletion方法

执行时机:  在进行页面渲染的时候执行

  • 如何调用:  按拦截器定义逆序调用  
  • 具体作用:  在DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
  • 参数详解
  1.         HttpServletRequest arg0, 拦截的请求的request对象
  2.         HttpServletResponsearg1, 拦截的请求的response对象
  3.         Object arg2, 封存了单元方法对象的HandleMethod对象
  4.         Exception arg3 存储了责任链的异常信息
/*** 无论controller是否出现异常,都会执行的方法*  一般来说都做一些资源释放工作* @param request* @param response* @param handler* @param ex* @throws Exception*/public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {/*页面渲染完毕,但是还没有给浏览器响应数据的时候*/System.out.println("MyInterceptor afterCompletion");System.out.println(ex);}

多个拦截器执行顺序

多个拦截器同时存在时,执行的顺序由配置顺序决定. 先配置谁, 谁就先执行.多个拦截器可以理解为拦截器栈, 先进后出(后进先出), 如图所示:

<!--注册拦截器--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/login.action"/><bean id="myInterceptor1" class="com.msb.interceptor.MyInterceptor"></bean></mvc:interceptor><mvc:interceptor><mvc:mapping path="/login.action"/><bean id="myInterceptor2" class="com.msb.interceptor.MyInterceptor2"></bean></mvc:interceptor></mvc:interceptors>

执行结果: 

MyInterceptor preHandle
MyInterceptor2 preHandle
login.action
MyInterceptor2 postHandle
MyInterceptor postHandle
success.jsp 
MyInterceptor2 afterCompletion
MyInterceptor afterCompletion
 


http://www.ppmy.cn/news/790.html

相关文章

终极版Facebook广告管理工具新手教程!赶紧收藏!(下篇)

广告管理工具是一款用于创建和管理Facebook广告的工具。用户可以查看和修改所有Facebook广告系列、广告组和广告&#xff0c;以及查看相关结果。Facebook是很多跨境人不会错过的海外社媒营销平台&#xff0c;所以很多新手都会迫切地想要学习Facebook广告管理工具相关的知识点&a…

Linux部署WordPress(宝塔版)

宝塔手册宝塔安装 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 宝塔配置 1.帮助命令&#xff1a;bt2.修改用户名(童心同萌)&#xff1a;bt 63.修改密码(123456)&#xff1a;bt 54.修改端口(888…

lintcode 125 · 背包问题(二)

描述 有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值. 问最多能装入背包的总价值是多大? A[i], V[i], n, m 均为整数你不能将物品进行切分你所挑选的要装入背包的物品的总大小不能超过 m每个物品只能取一次m < 1000m<…

大数据 | Hadoop、Hive、Spark的关系

文章总括图 数据存储 单机数据库时代 所有数据在单机都能存的下&#xff0c;数据处理的任务都是IO密集型&#xff0c;更谈不上分布式系统 一个典型的2U服务器可以插6块硬盘&#xff0c;每块硬盘4T&#xff0c;共24T原始容量&#xff0c;再加上一些数据包的可用冗余&#xf…

1.2 无监督学习和强化学习

1.2 无监督学习和强化学习无监督学习定义无监督学习与监督学习的区别相关概念流程图强化学习无监督学习 定义 无监督学习 (Unsupervised Learning&#xff09;是指从无标注数据中学习预测模型的机器学习问题&#xff0c;其本质是学习数据中的统计规律或潜在结构。 无监督学习…

unity---Mesh网格编程(六)

目录 1.模型切割 2.代码 1.模型切割 如图&#xff0c;对3D模型的Mesh网格进行切割&#xff0c;会经过若干个三角面。而切割后&#xff0c;将会产生新的面来组成左右两边的物体。 要记录每个顶点与顶点下标&#xff0c;新的面要顺时针绘制&#xff0c; 2.代码 using System.…

云服务连续三年增长150%,网宿科技开拓新赛道

摘要&#xff1a;开拓云服务市场&#xff0c;网宿科技的打法。 提到网宿科技&#xff0c;很多人还停留在传统IT服务商的印象中。其实&#xff0c;网宿科技已经在一条新赛道加速前行&#xff0c;这就是云服务。 “借助亚马逊云科技的持续赋能&#xff0c;网宿科技积累了丰富的云…

【数据结构趣味多】时间复杂度和空间复杂度

算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率。时间效率被称为时间复杂度&#xff0c;而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度&#xff0c;而空间复杂度主要衡量一个算法所需要的额外空间&#xff0c; 在计…