继承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" //登出方法
);
}
}