概述
SpringMVC的处理器拦截器类似于 Servlet开发中的过滤器 Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。
过滤器与拦截器的区别: 拦截器是AOP思想的具体应用
过滤器
- servlet规范中的一部分,任何 java web工程都可以使用
- 在url-pattern中配置了/*之后, 可以对所有要访问的资源进行拦截
拦截器
- 拦截器是 SpringMVC框架自己的,只有使用了 SpringMVC框架的工程才能使用
- 拦截器只会拦截访问的控制器方法,如果访问的是jsp/html/css/image/js是不会进行拦截的
自定义拦截器
那如何实现拦截器呢
想要自定义拦截器,必须实现 HandlerInterceptor接口
/*** @author HJH* @Description : 校验是否登录拦截器* @date 2019/8/2 14:45*/@Slf4jpublic class ValidateLoginInterceptor implements HandlerInterceptor {private String SESSION_CUSTOMER_NO_KEY = "session_customer_no_key";@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {//首先从请求头中获取jwt串,与页面约定好存放jwt值的请求头属性名为User-TokenString jwt = httpServletRequest.getHeader("User-Token");log.info("[登录校验拦截器]-从header中获取的jwt为:{}", jwt);//判断jwt是否有效if(StringUtils.isNotBlank(jwt)){//校验jwt是否有效,有效则返回json信息,无效则返回空String retJson = JwtHelper.validateLogin(jwt);log.info("[登录校验拦截器]-校验JWT有效性返回结果:{}", retJson);//retJSON为空则说明jwt超时或非法if(StringUtils.isNotBlank(retJson)){JSONObject jsonObject = JSONObject.parseObject(retJson);//校验客户端信息String userAgent = httpServletRequest.getHeader("User-Agent");if (userAgent.equals(jsonObject.getString("userAgent"))) {//获取刷新后的jwt值,设置到响应头中httpServletResponse.setHeader("User-Token", jsonObject.getString("freshToken"));//将客户编号设置到session中httpServletRequest.getSession().setAttribute(SESSION_CUSTOMER_NO_KEY, jsonObject.getString("userId"));return true;}else{log.warn("[登录校验拦截器]-客户端浏览器信息与JWT中存的浏览器信息不一致,重新登录。当前浏览器信息:{}", userAgent);}}else {log.warn("[登录校验拦截器]-JWT非法或已超时,重新登录");}}//输出响应流JSONObject jsonObject = new JSONObject();jsonObject.put("hmac", "");jsonObject.put("status", "");jsonObject.put("code", "4007");jsonObject.put("msg", "未登录");jsonObject.put("data", "");httpServletResponse.setCharacterEncoding("UTF-8");httpServletResponse.setContentType("application/json; charset=utf-8");httpServletResponse.getOutputStream().write(jsonObject.toJSONString().getBytes("UTF-8"));return false;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {}}
