关于Spring MVC拦截器的简介以及使用
关于Spring MVC拦截器的简介以及使用
作者:陶艳芳
来源:《知音励志·社科版》2017年第01期
摘要Spring MVC拦截器作为Spring MVC中的一部分,在实际工作中得到广泛的应用,在项目中合理使用拦截器,可以解决许多常见的问题,本文主要会简单概述什么是Spring MVC拦截器,如何通过代码的方式来配置拦截器,使用拦截器的场景,最后就是简述拦截器与过滤器的对比,通过详细的描述,你会对Spring MVC中拦截器的使用会有更深刻的理解。
【关键词】拦截器;Spring MVC;过滤器
1 什么是拦截器
在了解拦截器之前,我们首先要了解一些基本知识。
我们都知道,当我们在浏览器中输入URL地址的时候,作为客户端的浏览器就会向对应的服务器发送一个请求,同时,浏览器中的Burl地址通过各种get或者post的方式向服务器提交数据,服务器在得到这些数据前,如果我们想对数据进行修改或者配置,那么这个时候我们就需要使用到拦截器,简单来说,拦截器就像海关,如果你携带的东西不合标准,就扣下,符合了标准,才会让你通行。
拦截器在Spring MVC中处理字符编码和权限管理的时候有很大的作用。
2 拦截器的工作原理
要想了解拦截器的工作原理,我们首先要对Spring MVC的整体工作流程有了解,下面我就简单介绍Spring MVC的工作流程,在最新版的Spring MVC中,工作流程如下:当用户在浏览器地址栏输入一个Burl请求的时候,该请求首先会找到配置文件中的DispatcherServlet,如果你没有配置,那么此时会报错,如果配置好了,那么下一步就是找到HandlerMapping来找到对应的HandlerAdapter,这样能找到你自己写好的Handler,这里的Handler指的就是你用来处理该请求的类,当然,你可以通过注解的方式来配置。
在这个Handler中,返回对象会是一个ModelAndView对象,这其中的Model表示的就是处理这个url请求得到的数据结果,这里的View就是服务器返回给该请求的响应界面,这样Spring MVC框架就会携带数据到对应的界面,从而展示结果给该URL请求。
在了解了Spring MVC的工作流程后,我们就很好理解了,拦截器就是通过一些特殊的技术,在Burl请求发送到DispatcherServlet之间进行了拦截。
3 拦截器的实现
下面我们就通过几个步骤来实现一个简单的拦截器:
(1)写一个EncodInterceptor类并实现HandlerInterceptro接口,其中会有三个方法需要实现,分别是preHandle、postHandle、afterCompletion,在我们使用之前,需要在afterCompletion方法中的返回值设置为true,拦截器才会起作用。
(2)写好一个类就可以吗?当然不行,只写一个类,系统不会知道你这个拦截器要拦截什么请求,我们要在配置文件中添加对该类的配置,在配置文件中首先使用mvc:interceptor 标签,然后在标签中通过bean标签将上面写好拦截器的类添加进去,其中bean标签的class属性表示的是类的包名点类名的形式。
通过上面的配置,在系统运行起来的时候,客户端向服务器端发送请求后,请求经历配置好的拦截器,默认会执行其中三个方法。
至于这三个方法具体的作用,我们下面会谈论到,但是上面的配置,任意一个请求都会通过该拦截器,我们有什么方法让拦截器只拦截我们需要拦截的请求呢?答案是肯定有的,第二步的配置应该使用mvc:interceptors标签,然后在标签中添加mvc:interceptors子标签,最后该标签中会有mvc:mapping标签,该标签中的path中就可以写你需要拦截的路径。
4 拦截器中的方法介绍
在上面我们通过HandlerInterceptor接口的方式实现拦截器时,默认会有三个方法需要实现:preHandle方法,postHandle方法,afterCompletion方法,下面一一介绍:preHandle方法较特殊,该方法在请求被响应前会被调用,返回值为boolean类型,表示的是是否要将请求拦截,如果我们在此方法中返回false,客户端发送过来的请求会被终止,不再执行下去,如果是true,请求才会继续运行。
postHandle方法会在请求被处理之后调用,而其中的第三个参数可以用来显示视图以及数据,在该请求的拦截器中通过参数来修改该请求对应的响应视图,而该视图的优先级是大于对应的handler的。
afterCompletion方法表示的是在请求执行完后会调用的方法,就像是PHP中的析构函数,最后才调用。
5 拦截器的使用场景
既然知道了如何使用拦截器,那么接下来,我们就要知道在什么情况下使用,常见的场景有如下几种:
(1)解决乱码问题:乱码在项目中经常遇到,或许是因为代码编辑工具的问题,也可能是字符编码问题,但有拦截器后,都可在请求发出之前统一设置编码。
(2)解决权限认证问题:很多项目如商城项目,必须用户登录后才能去购买商品,那么此时在请求发出前,需要判断用户是否已经登录,此时在拦截器中就可先判断用户是否登录,若未登录,就跳转到登录界面等。
6 拦截器与过滤器的对比与总结
相信学习过java Web的都知道过滤器,其实,拦截器和过滤器是基本相似的,但是还是有区别,下面来描述一下:首先,拦截器和过滤器的依赖是不同的,如果你使用的项目没有使用到Spring MVC框架,那么此时你就是不能使用拦截器,因为拦截器依赖框架容器,其本身基于java中的反射机制,而过滤器即使没有Spring MVC框架支持,也可以使用,因为过滤器
是基于Servlet容器的,并通过了回调函数来使用。
那么到此为止,对于拦截器的描述就结束了,拦截器可以处理我们在Web项目中请求的通用性的问题,合理使用拦截器,可以减少我们的代码工作量,同时项目也便于维护。
参考文献
[1](美)阿诺德,Ken-Arnold,等.Java程序设计语言[M].北京:人民邮电出版社,2006.
作者单位
邵阳学院湖南省邵阳市 422000。
SpringBoot使用过滤器、拦截器、切面(AOP),及其之间的区别和执行顺序
SpringBoot使⽤过滤器、拦截器、切⾯(AOP),及其之间的区别和执⾏顺序先上代码,下⾯的demo中包含多个拦截器、过滤器,以及切⾯的前置通知/后置通知/环绕通知:下⾯总结⼀下相关原理:⾸先了解⼀下SpringMVC的执⾏流程具体流程如下1. ⽤户发起请求到前端控制器(Controller)2. 前端控制器没有处理业务逻辑的能⼒,需要找到具体的模型对象处理(Handler),到处理器映射器(HandlerMapping)中查找Handler对象(Model)。
3. HandlerMapping返回执⾏链,包含了2部分内容:① Handler对象、②拦截器数组4. 前端处理器通过处理器适配器包装后执⾏Handler对象。
5. 处理业务逻辑。
6. Handler处理完业务逻辑,返回ModelAndView对象,其中view是视图名称,不是真正的视图对象。
7. 将ModelAndView返回给前端控制器。
8. 视图解析器(ViewResolver)返回真正的视图对象(View)。
9. (此时前端控制器中既有视图⼜有Model对象数据)前端控制器根据模型数据和视图对象,进⾏视图渲染。
10. 返回渲染后的视图(html/json/xml)返回。
11. 给⽤户产⽣响应。
核⼼就是DispatcherServlet核⼼控制器,我们看源码可知道DispatcherServlet是Servlet的⼦类下⾯⽤⼀张图说⼀下过滤器、Servlet容器、拦截器、AOP、Controller之间的关系然后具体执⾏流程如下:拦截器和过滤器的区别1、拦截器不依赖与servlet容器是SpringMVC⾃带的,过滤器依赖于Servlet容器。
2、拦截器是基于java的反射机制的,⽽过滤器是基于函数回调。
3、拦截器只能对action请求起作⽤,⽽过滤器则可以对⼏乎所有的请求起作⽤。
4、拦截器可以访问controller上下⽂、值栈⾥的对象,⽽过滤器不能访问。
浅谈SpringMVC中Interceptor和Filter区别
浅谈SpringMVC中Interceptor和Filter区别Interceptor主要作⽤:拦截⽤户请求,进⾏处理,⽐如判断⽤户登录情况、权限验证,只要针对Controller请求进⾏处理,是通过HandlerInterceptor。
Interceptor分两种情况,⼀种是对会话的拦截,实现spring的HandlerInterceptor接⼝并注册到mvc的拦截队列中,其中preHandle()⽅法在调⽤Handler之前进⾏拦截(上图步骤3),postHandle()⽅法在视图渲染之前调⽤(上图步骤5),afterCompletion()⽅法在返回相应之前执⾏;另⼀种是对⽅法的拦截,需要使⽤@Aspect注解,在每次调⽤指定⽅法的前、后进⾏拦截。
Filter主要作⽤:过滤字符编码、做⼀些业务逻辑判断,主要⽤于对⽤户请求进⾏预处理,同时也可进⾏逻辑判断。
Filter在请求进⼊servlet容器执⾏service()⽅法之前就会经过filter过滤(上图步骤1),不像Intreceptor⼀样依赖于springmvc框架,只需要依赖于servlet。
Filter启动是随WEB应⽤的启动⽽启动,只需要初始化⼀次,以后都可以进⾏拦截。
Filter有如下⼏个种类:⽤户授权Filter:检查⽤户请求,根据请求过滤⽤户⾮法请求;⽇志Filter:记录某些特殊的⽤户请求;解码Filter:对⾮标准编码的请求解码。
Filter和Interceptor的区别1. Filter是基于函数回调(doFilter()⽅法)的,⽽Interceptor则是基于Java反射的(AOP思想)。
2. Filter依赖于Servlet容器,⽽Interceptor不依赖于Servlet容器。
3. Filter对⼏乎所有的请求起作⽤,⽽Interceptor只能对action请求起作⽤。
4. Interceptor可以访问Action的上下⽂,值栈⾥的对象,⽽Filter不能。
handlerinterceptoradapter posthandle处理返回参数
handlerinterceptoradapter posthandle处理返回参数`HandlerInterceptorAdapter` 是Spring MVC 中的一个拦截器适配器,用于在请求处理前、请求处理后以及视图渲染后进行一些自定义的操作。
在`HandlerInterceptorAdapter` 中,`postHandle` 方法用于在请求处理后进行一些操作,包括修改返回的视图或模型等。
以下是一个简单的示例,演示如何在`postHandle` 方法中处理返回的参数:```javaimport javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;public class CustomInterceptor extends HandlerInterceptorAdapter {@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {// 在请求处理后进行一些操作if (modelAndView != null) {// 获取原始的模型数据ModelAndView originalModelAndView = modelAndView;// 进行一些处理,修改返回的参数modelAndView = new ModelAndView("customView");modelAndView.addObject("customAttribute", "customValue");// 将原始的模型数据拷贝到新的ModelAndView 中modelAndView.addAllObjects(originalModelAndView.getModel());}}}```在上面的示例中,`postHandle` 方法接收了`HttpServletRequest`、`HttpServletResponse`、被处理的处理程序(controller 方法)、以及`ModelAndView` 对象。
Java中的拦截器
Java中的拦截器⼀. 拦截器的概念和作⽤拦截器(Interceptor)是⼀种动态拦截⽅法调⽤的机制,在SpringMVC中动态拦截控制器⽅法的执⾏作⽤:1. 在指定的⽅法调⽤前后执⾏预先设定的代码2. 阻⽌原始⽅法的执⾏3. 总结:增强核⼼原理:AOP思想⼆. 拦截器和过滤器的区别归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术拦截内容不同:Filter对所有访问进⾏增强,Interceptor仅针对SpringMVC的访问进⾏增强三. 拦截器代码实现【第⼀步】定义拦截器做法:定义⼀个类,实现HandlerInterceptor接⼝即可@Component //注意当前类必须受Spring容器控制//定义拦截器类,实现HandlerInterceptor接⼝public class ProjectInterceptor implements HandlerInterceptor {@Override//原始⽅法调⽤前执⾏的内容//返回值类型可以拦截控制的执⾏,true放⾏,false终⽌public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle..."+contentType); return true;}@Override//原始⽅法调⽤后执⾏的内容public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndViewmodelAndView) throws Exception { System.out.println("postHandle...");}@Override//原始⽅法调⽤完成后执⾏的内容public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion..."); }}【第⼆步】配置加载拦截器@Configurationpublic class SpringMvcSupport extends WebMvcConfigurationSupport { @Autowired private ProjectInterceptor projectInterceptor; @Override protected void addInterceptors(InterceptorRegistry registry) { //配置拦截器 registry.addInterceptor(projectInterceptor) .addPathPatterns("/books","/books/*"); }}使⽤标准接⼝WebMvcConfigurer简化开发(注意:侵⼊式较强) @Configuration@ComponentScan({"com.itheima.controller"})@EnableWebMvc//实现WebMvcConfigurer接⼝可以简化开发,但具有⼀定的侵⼊性public class SpringMvcConfig implements WebMvcConfigurer { @Autowired private ProjectInterceptor projectInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { //配置多拦截器 registry.addInterceptor(projectInterceptor) .addPathPatterns("/books","/books/*"); }}。
什么是SpringMVC?
什么是SpringMVC?⼀、什么是SpringMVC?1.SpringMVC 是⼀种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于SpringFrameWork的后续产品,已经融合在Spring Web Flow 中。
2.SpringMVC = Spring +MVCspring mvc类似于struts的⼀个MVC开框架,其实都是属于spring,spring mvc需要有spring的架包作为⽀撑才能跑起来.spring是⼀个⼀站式的框架,提供了表现层(springmvc)到业务层(spring)再到数据层(springdata)的全套解决⽅案;spring的两⼤核⼼IOC(控制反转)和AOP(⾯向切⾯编程)更是给我们的程序解耦和代码的简介提供了⽀持。
Spring框架图:从Spring的结构图可以看出,springMVC位于spring web端的⼀个框架,是⼀种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使⽤了MVC架构模式的思想,将web层进⾏职责解耦。
附:基于请求驱动指的就是使⽤请求-响应模型。
从名字上就可以窥探出,Spring>SpringMVC,那么事实上,spring和SpringMVC是⼀种⽗⼦关系。
SpringMVC是spring扩展出的⼀个应⽤于web端的框架。
在这⾥需要注意的⼀点,就是到底什么是⽗⼦容器关系:spring主要的作⽤是黏合其他模块组件,进⾏统⼀管理,springmvc则主要是负责web端。
那么,我们都知道,我们在应⽤spring的时候,可以使⽤注⼊。
这个时候,如果我们的web端是⽤的SpringMVC,这个时候,controller理论上是通过SpringMVC去注⼊,但是,使⽤spring注⼊,同样是可⾏的。
同理,service等层,使⽤SpringMVC配置的统⼀扫描装配也是可以的。
黑马程序员springmvc教程第二天:拦截器(1)
拦截器拦截定义定义拦截器,实现HandlerInterceptor接口。
接口中提供三个方法。
publicclass HandlerInterceptor1implements HandlerInterceptor { //进入 Handler方法之前执行//用于身份认证、身份授权//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行@Overridepublicboolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {//return false表示拦截,不向下执行//return true表示放行returnfalse;}//进入Handler方法之后,返回modelAndView之前执行//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图@Overridepublicvoid postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception { }//执行Handler完成执行此方法//应用场景:统一异常处理,统一日志处理@Overridepublicvoid afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {}}拦截器配置针对HandlerMapping配置springmvc拦截器针对HandlerMapping进行拦截设置,如果在某个HandlerMapping中配置拦截,经过该 HandlerMapping映射成功的handler最终使用该拦截器。
拦截器基本功能介绍
拦截器基本功能介绍拦截器基本功能介绍
1、什么是拦截器?
是springmvc中的⼀种对象,实现HandlerInterceptor接⼝的类都叫拦截器。
2、作⽤:
拦截⽤户的请求,对请求做预先的判断处理⼯作
3、
拦截器是全局的,可以对多个Controller做拦截。
⼀个项⽬可以有0个或者多个拦截器,⼀起拦截⽤户的请求。
拦截器常⽤在:⽤户登录处理、权限检查、记录⽇志。
拦截器的使⽤步骤:
1、定义类实现HandlerInterceptor接⼝。
2、在springmvc配置⽂件中声明拦截器,让框架知道拦截器的存在。
拦截器的执⾏时间:
1、在请求处理之前,也就是controller类中的⽅法执⾏之前先被拦截。
2、在控制器⽅法执⾏之后也会执⾏拦截器。
3、在请求处理完成后也会执⾏拦截器。
过滤器、拦截器应用场景、区别和使用
过滤器、拦截器应⽤场景、区别和使⽤
应⽤场景
过滤器的应⽤:字符编码转换,敏感词过滤、登陆权限验证、资源访问权限等
拦截器的应⽤:AOP、需要有⼀些业务逻辑(需要注⼊Bean等)
区别
1. 过滤器配置再web.xml中、拦截器配置springmvc的配置⽂件中(即在DispatcherServlet的contextConfigLocation属性指定⽂件所在位
置,默认加载的是:/WEB-INF/servlet名称-servlet.xml(springmvc-servlet.xml))
2. 过滤器基于函数回调、拦截器基于反射
3. 过滤器⼏乎对所有请求起作⽤,拦截器只对⽬标执⾏⽅法(action⽅法)起作⽤
4. 过滤器:对请求进⾏预处理、再交给Servlet处理并且⽣成响应,最后Filter再对服务器响应进⾏后处理
拦截器:可以再⽅法执⾏前调⽤(preHandle)、⽅法执⾏后(postHandle)、视图页⾯渲染后(afterCompletion)
执⾏流程
过滤器初始化-》(客户端请求过来)dofilter处理请求-》到达dispatchServlet,在⽬标⽅法执⾏前preHandle-》(放⾏,返回true)执⾏⽬标⽅法-》(正常返回,异常则不执⾏)postHandle-》(⽆论⽬标⽅法是否执⾏或者执⾏是否出现异常,都会执⾏)afterCompletion-》dofilter 处理响应-》客户端加载页⾯。
基于SpringMVC拦截器和注解实现controller中访问权限控制
基于SpringMVC拦截器和注解实现controller中访问权限控制SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion⽅法。
1. preHandle在业务处理器处理请求之前被调⽤;2. postHandle在业务处理器处理请求执⾏完成后,⽣成视图之前执⾏;3. afterCompletion在DispatcherServlet完全处理完请求后被调⽤,可⽤于清理资源等;所以要想实现⾃⼰的权限管理逻辑,需要继承HandlerInterceptorAdapter并重写其三个⽅法。
⼀、⾃定义拦截器配置⽅法1. 在sping的xml配置中可以⽤<mvc:interceptors>和<mvc:interceptor>来配置拦截器类(实现HandlerInterceptorAdapter)2. 在javaConfig中配置通过WebMvcConfiguration的实现类配置拦截器类(实现HandlerInterceptorAdapter)⼆、⽰例2.1、javaconfig中配置SpringMVC⽰例1、新建⼀个springboot项⽬auth-demo22、权限校验相关的注解package com.dxz.authdemo2.web.auth;import ng.annotation.ElementType;import ng.annotation.Retention;import ng.annotation.RetentionPolicy;import ng.annotation.Target;@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface Permission {/** 检查项枚举 */PermissionEnum[] permissionTypes() default {};/** 检查项关系 */RelationEnum relation() default RelationEnum.OR;}package com.dxz.authdemo2.web.auth;import java.io.PrintWriter;import ng.annotation.Annotation;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.springframework.beans.factory.annotation.Autowired;import ponent;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;/*** 权限检查拦截器*/@Componentpublic class PermissionCheckInterceptor extends HandlerInterceptorAdapter {/** 权限检查服务 */@Autowiredprivate PermissionCheckProcessor permissionCheckProcessor;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//Class<?> clazz = handler.getClass();Class<?> clazz = ((HandlerMethod)handler).getBeanType();System.out.println("PermissionCheckInterceptor.preHandle()" + clazz);for(Annotation a : clazz.getAnnotations()){System.out.println(a);}if (clazz.isAnnotationPresent(Permission.class)) {Permission permission = (Permission) clazz.getAnnotation(Permission.class);return permissionCheckProcessor.process(permission, request, response);}return true;}public boolean preHandle2(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("SecurityInterceptor:"+request.getContextPath()+","+request.getRequestURI()+","+request.getMethod()); HttpSession session = request.getSession();if (session.getAttribute("uid") == null) {System.out.println("AuthorizationException:未登录!"+request.getMethod());if("POST".equalsIgnoreCase(request.getMethod())){response.setContentType("text/html; charset=utf-8");PrintWriter out = response.getWriter();out.write("未登录!");out.flush();out.close();}else{response.sendRedirect(request.getContextPath()+"/login");}return false;} else {return true;}}}package com.dxz.authdemo2.web.auth;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import ponent;@Componentpublic class PermissionCheckProcessor {public boolean process(Permission permission, HttpServletRequest request, HttpServletResponse response) {PermissionEnum[] permissionTypes = permission.permissionTypes();try {String uid = request.getParameter("uid");if ("duanxz".equals(uid)) {System.out.println("认证成功");return true;} else {System.out.println("认证失败");return false;}} catch (Exception e) {return false;}}}package com.dxz.authdemo2.web.auth;public enum PermissionEnum {DEVELOPER_VALID, DEVELOPER_FREEZE;}package com.dxz.authdemo2.web.auth;public enum RelationEnum {OR, AND;}3、SpringMVC拦截器配置package com.dxz.authdemo2.web.auth;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;@Configurationpublic class WebMvcConfiguration extends WebMvcConfigurerAdapter {@AutowiredPermissionCheckInterceptor permissionCheckInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {// addPathPatterns ⽤于添加拦截规则// excludePathPatterns ⽤户排除拦截// 映射为 user 的控制器下的所有映射registry.addInterceptor(permissionCheckInterceptor).addPathPatterns("/admin/*").excludePathPatterns("/index", "/");super.addInterceptors(registry);}}4、测试controllerpackage com.dxz.authdemo2.web;import javax.servlet.http.HttpServletRequest;import org.springframework.stereotype.Controller;import org.springframework.ui.ModelMap;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.servlet.ModelAndView;import com.dxz.authdemo2.web.auth.Permission;import com.dxz.authdemo2.web.auth.PermissionEnum;@Controller@RequestMapping("/admin")@Permission(permissionTypes = { PermissionEnum.DEVELOPER_VALID })public class AppDetailController {@RequestMapping(value="/appDetail", method = RequestMethod.GET)public String doGet(ModelMap modelMap, HttpServletRequest httpServletRequest) { //1. 业务操作,此处省略System.out.println("appDetail.htm 处理中...");return "appDetail";}}package com.dxz.authdemo2.web;import javax.servlet.http.HttpServletRequest;import org.springframework.stereotype.Controller;import org.springframework.ui.ModelMap;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import com.dxz.authdemo2.web.auth.Permission;import com.dxz.authdemo2.web.auth.PermissionEnum;@Controller@RequestMapping("index")public class IndexController {@RequestMapping(method = RequestMethod.GET)public void doGet(ModelMap modelMap, HttpServletRequest httpServletRequest) {System.out.println("index");}}cotroller中的jsp⽂件appDetail.jsp<html><h1>appDetail</h1></html>启动类:package com.dxz.authdemo2;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.Bean;import org.springframework.web.servlet.ViewResolver;import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc;import org.springframework.web.servlet.view.InternalResourceViewResolver;@EnableWebMvc@EnableAutoConfiguration@SpringBootApplicationpublic class AuthDemo2Application {public static void main(String[] args) {SpringApplication.run(AuthDemo2Application.class, args);}// 配置JSP视图解析器@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;}}结果:访问:访问:2.2、xml中配置SpringMVC⽰例⾸先在springmvc.xml中加⼊⾃⼰定义的拦截器我的实现逻辑PermissionCheckInterceptor,如下:<!--配置拦截器, 多个拦截器,顺序执⾏ --><mvc:interceptors><mvc:interceptor><!-- 匹配的是url路径,如果不配置或/**,将拦截所有的Controller --><mvc:mapping path="/" /><mvc:mapping path="/user/**" /><mvc:mapping path="/test/**" /><bean class="com.dxz.authdemo2.web.auth.PermissionCheckInterceptor"></bean></mvc:interceptor><!-- 当设置多个拦截器时,先按顺序调⽤preHandle⽅法,然后逆序调⽤每个拦截器的postHandle和afterCompletion⽅法 --> </mvc:interceptors>。
详解Spring拦截器流程及多个拦截器的执行顺序
详解Spring拦截器流程及多个拦截器的执⾏顺序⽬录拦截器的定义测试拦截器多个拦截器的执⾏顺序让 preHandle 进⾏拦截总结拦截器是 Spring MVC 中的组件,它可以在进⼊请求⽅法前做⼀些操作,也可以在请求⽅法后和渲染视图后做⼀些事情。
拦截器的定义SpringMVC 的拦截器只需要实现 HandlerInterceptor 接⼝,并进⾏配置即可。
HandlerInterceptor 接⼝的定义如下:public interface HandlerInterceptor {default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true;}default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { }default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {}}在 HandlerInterceptor 中共有三个⽅法,每个⽅法的含义如下:preHandler:进⼊请求⽅法之前执⾏;postHandler:请求⽅法执⾏完成之后执⾏;afterCompletion:视图渲染后执⾏。
拦截器的执⾏流程在 preHandle ⽅法中,它的返回值是 boolean 类型的,它的返回值影响着请求⽅法,以及 postHandle 和 afterCompletion 的执⾏。
