定义拦截器,编写处理代码:
package com.sbt.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; @Component public class MyInterceptor implements HandlerInterceptor { /** * preHandle(HttpServletRequest request, HttpServletResponse response, Object * handle)方法,该方法在请求处理之前进行调用。Spring MVC中的Interceptor是链式调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor。 * 每个Interceptor的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor中的preHandle方法, * 所以可以在这个方法中进行一些前置初始化操作或者是对当前请求做一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。 * 该方法的返回值是布尔(Boolean)类型的,当它返回为false时,表示请求结束,后续的Interceptor和控制器(Controller)都不会再执行; * 当返回值为true时,就会继续调用下一个Interceptor的preHandle方法,如果已经是最后一个Interceptor的时候,就会是调用当前请求的控制器中的方法。 */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor.preHandle"); return true; } /** * postHandle(HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView)方法, * 通过preHandle方法的解释,我们知道这个方法包括后面要说到的afterCompletion方法都只能在当前所属的Interceptor的preHandle方法的返回值为true的时候, * 才能被调用。postHandle方法在当前请求进行处理之后,也就是在控制器中的方法调用之后执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用, * 所以我们可以在这个方法中对控制器处理之后的ModelAndView对象进行操作。postHandle方法被调用的方向跟preHandle是相反的,也就是说, * 先声明的Interceptor的postHandle方法反而会后执行。这和 Struts2 里面的Interceptor的执行过程有点类似,Struts2 里面的Interceptor的执行过程也是链式的, * 只是在 Struts2 里面需要手动调用ActionInvocation的invoke方法来触发对下一个Interceptor或者是action的调用, * 然后每一个Interceptor中在invoke方法调用之前的内容都是按照声明顺序执行的,而invoke方法之后的内容就是反向的。 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor.postHandle"); } /** * afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex)方法, * 也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。因此,该方法将在整个请求结束之后, * 也就是在DispatcherServlet渲染了对应的视图之后执行,这个方法的主要作用是用于进行资源清理的工作。 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor.afterCompletion"); } }
这里这个类实现HandlerInterceptor接口即可。然后把拦截器进行注册。
package com.sbt.interceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** * 目前(2.0.4.RELEASE版本)WebMvcConfigurerAdapter已过时 * 必须加上@Configuration注解,Spring才能统一管理当前的拦截器实例。 */ @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private MyInterceptor interceptor; @Override public void addInterceptors(InterceptorRegistry registry) { // 添加拦截器,配置拦截地址 其中/**表示当前目录以及所有子目录(递归),/*表示当前目录,不包括子目 InterceptorRegistration registration = registry.addInterceptor(interceptor); registration.addPathPatterns("/api/**"); //添加不拦截路径 registration.excludePathPatterns( "/login", //登录 "/images/**", //图片静态资源 "/js/**", //js静态资源 "/css/**"); //css静态资源 } }
这里定义了只拦截api打头的请求,且不拦截静态资源,然后编写一个Controller。
package com.sbt.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class JettyController { @GetMapping("/hello") public String hello() { return "/index.jsp"; } @GetMapping("/api/userlist") public String userlist() { return "user_list"; } }
请求接口/api/userlist会输出打印信息,其他则不拦截。
配个图:
推荐您阅读更多有关于“ spring mvc springboot 拦截器 Interceptor ”的文章
Java小强
未曾清贫难成人,不经打击老天真。
自古英雄出炼狱,从来富贵入凡尘。
发表评论: