1、编写拦截器实现类,此类必须实现接口 HandlerInterceptor,然后重写里面需要的三个比较常用的方法,实现自己的业务逻辑代码
如:OneInterceptor
1 package com.leecx.interceptors.interceptor; 2 3 4 import com.leecx.pojo.LeeJSONResult; 5 import com.leecx.utils.JsonUtils; 6 import org.springframework.web.servlet.HandlerInterceptor; 7 import org.springframework.web.servlet.ModelAndView; 8 9 import javax.servlet.http.HttpServletRequest;10 import javax.servlet.http.HttpServletResponse;11 import java.io.IOException;12 import java.io.OutputStream;13 import java.io.UnsupportedEncodingException;14 15 public class OneInterceptor implements HandlerInterceptor{16 17 /**18 * 在请求处理之前进行调用(Controller方法调用之前)19 */20 @Override21 public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {22 23 System.out.println("=====================");24 if (true) {25 returnErrorResponse(httpServletResponse, LeeJSONResult.errorMsg("被one拦截..."));26 }27 28 System.out.println("被one拦截...");29 30 return false;31 }32 33 /**34 * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)35 */36 @Override37 public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {38 39 }40 41 /**42 * 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)43 */44 @Override45 public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {46 47 }48 49 public void returnErrorResponse(HttpServletResponse response, LeeJSONResult result) throws IOException, UnsupportedEncodingException {50 OutputStream out = null;51 try{52 response.setCharacterEncoding("utf-8");53 response.setContentType("text/json");54 out = response.getOutputStream();55 out.write(JsonUtils.objectToJson(result).getBytes("utf-8"));56 out.flush();57 } finally{58 if(out!=null){59 out.close();60 }61 }62 }63 }
说明:
1、preHandle 方法会在请求处理之前进行调用(Controller方法调用之前)
2、postHandle 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
3、afterCompletion 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
2、编写拦截器配置文件主类 WebMvcConfigurer 此类必须继承 WebMvcConfigurerAdapter 类,并重写其中的方法 addInterceptors 并且在主类上加上注解 @Configuration
如:WebMvcConfigurer
1 package com.leecx.interceptors.config; 2 3 import com.leecx.interceptors.interceptor.OneInterceptor; 4 import com.leecx.interceptors.interceptor.TwoInterceptor; 5 import org.springframework.context.annotation.Configuration; 6 import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 7 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 8 9 @Configuration10 public class WebMvcConfigurer extends WebMvcConfigurerAdapter{11 12 /**13 *Title:
14 *Description:重写增加自定义拦截器的注册,某一个拦截器需要先注册进来,才能工作
15 * param[1]: null16 * return:17 * exception:18 * date:2018/4/18 0018 下午 17:2919 * author:段美林[duanml@neusoft.com]20 */21 @Override22 public void addInterceptors(InterceptorRegistry registry) {23 24 registry.addInterceptor(new OneInterceptor()).addPathPatterns("/one/**");25 26 registry.addInterceptor(new TwoInterceptor()).addPathPatterns("/one/**")27 .addPathPatterns("/two/**");28 29 super.addInterceptors(registry);30 }31 }
说明:
拦截器的执行是会根据 registry 注入的先后顺序执行,比如:/one/** 同时被 OneInterceptor、TwoInterceptor 拦截,但会先执行 OneInterceptor拦截的业务请求,因为它先注入进来的
3、在controller业务层,只要请求的地址为 拦截器 申明的需要拦截地址即可进入相应的业务处理。
如:OneInterceptorController 这个controller 类的所有实现方法都会被 拦截器 OneInterceptor 所拦截到。
1 package com.leecx.controller; 2 3 import java.util.ArrayList; 4 import java.util.Date; 5 import java.util.List; 6 7 import org.springframework.stereotype.Controller; 8 import org.springframework.ui.ModelMap; 9 import org.springframework.web.bind.annotation.PostMapping;10 import org.springframework.web.bind.annotation.RequestMapping;11 12 import com.leecx.pojo.User;13 14 @Controller15 @RequestMapping("/one")16 public class OneInterceptorController {17 18 @RequestMapping("/index")19 public String index(ModelMap map) {20 System.out.println("=========one is index");21 map.addAttribute("name", "itzixi22");22 return "thymeleaf/index";23 }24 25 @RequestMapping("center")26 public String center() {27 return "thymeleaf/center/center";28 }29 30 @RequestMapping("test")31 public String test(ModelMap map) {32 33 User user = new User();34 user.setAge(18);35 user.setName("manager");36 user.setPassword("123456");37 user.setBirthday(new Date());38 39 map.addAttribute("user", user);40 41 42 User u1 = new User();43 u1.setAge(19);44 u1.setName("itzixi");45 u1.setPassword("123456");46 u1.setBirthday(new Date());47 48 User u2 = new User();49 u2.setAge(17);50 u2.setName("LeeCX");51 u2.setPassword("123456");52 u2.setBirthday(new Date());53 54 ListuserList = new ArrayList<>();55 userList.add(user);56 userList.add(u1);57 userList.add(u2);58 59 map.addAttribute("userList", userList);60 61 return "thymeleaf/test";62 }63 64 @PostMapping("postform")65 public String postform(User user) {66 System.out.println(user.getName());67 return "redirect:/th/test";68 }69 }