继承HandlerInterceptorAdapter 重写他的方法生成拦截器
import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @version 1.0 * @author: lsy * @create: 2021-05-31 15:04 **/ @Component @Slf4j public class TokenInterceptor extends HandlerInterceptorAdapter { /** * 预处理回调方法,实现处理器的预处理(如检查登陆),第三个参数为响应的处理器,自定义Controller * 返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应; */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { log.info("进入预拦截方法"); String token = (String) request.getHeader("token"); log.info("获取到的 token 值 :{}", token); if ("token".equals(token)) { return true; } response.setCharacterEncoding("utf-8"); response.getWriter().write("token校验失败"); //todo 此处可以抛出异常,然后用全局异常包裹后返回响应,也可以直接返回 (建议) //token 校验成功后 可继续校验权限相关,数据库或redis都可以,此类交给spring了,可直接注入 // 设置 request attribute 在Controller可以直接 用 @RequestAttribute (此处null只是个占位符) request.setAttribute("currentAccount", null); request.setAttribute("auditLog", null); return false; } /** * 后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。 * * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } /** * 整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中 * * @param request * @param response * @param handler * @param ex * @throws Exception */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { //此方法必须是preHandle方法放行后才会执行 log.info("方法处理完毕,开始记录日志"); request.getAttribute("auditLog"); //todo 把 auditLog 存入日志记录表 // 移除request attribute request.removeAttribute("currentAccount"); request.removeAttribute("auditLog"); request.removeAttribute("responseBody"); //清理资源 super.afterCompletion(request, response, handler, ex); } }
创建过滤器,过滤登录请求和开启拦截器
import com.kdmins.interceptor.TokenInterceptor; 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; /** * 过滤器并开启token拦截器 * * @version 1.0 * @author: lsy * @create: 2021-05-31 15:25 **/ @Configuration public class InterceptorConfiguration implements WebMvcConfigurer { @Autowired private TokenInterceptor tokenInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { InterceptorRegistration registration = registry.addInterceptor(tokenInterceptor); registration.addPathPatterns("/**"); registration.excludePathPatterns( "/login", //登录方法 "/captcha",//验证码方法 "/logout" //登出方法 ); } }