- 继承HandlerInterceptorAdapter类并实现preHandler()方法,被拦截的请求在调用controller层之前将先调用preHandler()方法第一步处理请求。
public class LoginInterceptor extends HandlerInterceptorAdapter {
private static final Logger logger = LoggerFactory.getLogger(LoggerFactory.class);
@Autowired
private CookieUtil cookieUtil;
/**
* 访问controller前调用
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("preHandler");
// 被@RequestMapping注解修饰的controller方法就是HanglerMethod
// A.isAssignableFrom(B),判断A与B是否是同一个class,A是否是B的超类或者超接口,是返回true,否返回false
if (!handler.getClass().isAssignableFrom(HandlerMethod.class)) {
System.out.println("cat cast handler to HandlerMethod.class");
return true;
}
HandlerMethod method = (HandlerMethod)handler;
// 获取controller方法上的注解
NeedLogin needLogin = method.getMethodAnnotation(NeedLogin.class);
if (needLogin == null){
return true;
}
String paramToken = request.getParameter(CookieUtil.COOKIE_NAME);
String cookieToken = cookieUtil.getLoginToken(request);
if (StringUtils.isEmpty(paramToken) && StringUtils.isEmpty(cookieToken)){
return false;
}
String token = paramToken == null ? cookieToken:paramToken;
SecondKillUser user = cookieUtil.getUserByToken(token,response);
return user == null ? false : true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
super.afterCompletion(request, response, handler, ex);
}
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
super.afterConcurrentHandlingStarted(request, response, handler);
}
复制代码
- 注册拦截器,将拦截器类放入spring容器当中,否则无法注入其它bean
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
/**
*注册拦截器
/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor()).addPathPatterns("/**");
}
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
}
复制代码