概述

SpringMVC的处理器拦截器类似于 Servlet开发中的过滤器 Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。

过滤器与拦截器的区别: 拦截器是AOP思想的具体应用

过滤器

  • servlet规范中的一部分,任何 java web工程都可以使用
  • 在url-pattern中配置了/*之后, 可以对所有要访问的资源进行拦截

拦截器

  • 拦截器是 SpringMVC框架自己的,只有使用了 SpringMVC框架的工程才能使用
  • 拦截器只会拦截访问的控制器方法,如果访问的是jsp/html/css/image/js是不会进行拦截的

自定义拦截器

那如何实现拦截器呢
想要自定义拦截器,必须实现 HandlerInterceptor接口

  1. /**
  2. * @author HJH
  3. * @Description : 校验是否登录拦截器
  4. * @date 2019/8/2 14:45
  5. */
  6. @Slf4j
  7. public class ValidateLoginInterceptor implements HandlerInterceptor {
  8. private String SESSION_CUSTOMER_NO_KEY = "session_customer_no_key";
  9. @Override
  10. public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
  11. //首先从请求头中获取jwt串,与页面约定好存放jwt值的请求头属性名为User-Token
  12. String jwt = httpServletRequest.getHeader("User-Token");
  13. log.info("[登录校验拦截器]-从header中获取的jwt为:{}", jwt);
  14. //判断jwt是否有效
  15. if(StringUtils.isNotBlank(jwt)){
  16. //校验jwt是否有效,有效则返回json信息,无效则返回空
  17. String retJson = JwtHelper.validateLogin(jwt);
  18. log.info("[登录校验拦截器]-校验JWT有效性返回结果:{}", retJson);
  19. //retJSON为空则说明jwt超时或非法
  20. if(StringUtils.isNotBlank(retJson)){
  21. JSONObject jsonObject = JSONObject.parseObject(retJson);
  22. //校验客户端信息
  23. String userAgent = httpServletRequest.getHeader("User-Agent");
  24. if (userAgent.equals(jsonObject.getString("userAgent"))) {
  25. //获取刷新后的jwt值,设置到响应头中
  26. httpServletResponse.setHeader("User-Token", jsonObject.getString("freshToken"));
  27. //将客户编号设置到session中
  28. httpServletRequest.getSession().setAttribute(SESSION_CUSTOMER_NO_KEY, jsonObject.getString("userId"));
  29. return true;
  30. }else{
  31. log.warn("[登录校验拦截器]-客户端浏览器信息与JWT中存的浏览器信息不一致,重新登录。当前浏览器信息:{}", userAgent);
  32. }
  33. }else {
  34. log.warn("[登录校验拦截器]-JWT非法或已超时,重新登录");
  35. }
  36. }
  37. //输出响应流
  38. JSONObject jsonObject = new JSONObject();
  39. jsonObject.put("hmac", "");
  40. jsonObject.put("status", "");
  41. jsonObject.put("code", "4007");
  42. jsonObject.put("msg", "未登录");
  43. jsonObject.put("data", "");
  44. httpServletResponse.setCharacterEncoding("UTF-8");
  45. httpServletResponse.setContentType("application/json; charset=utf-8");
  46. httpServletResponse.getOutputStream().write(jsonObject.toJSONString().getBytes("UTF-8"));
  47. return false;
  48. }
  49. @Override
  50. public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
  51. }
  52. @Override
  53. public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
  54. }
  55. }