SpringBoot _( HandlerInterceptorAdapter )
拦截器
preHandle:方法被调用前执行。方法中可以做类似校验的功能。如果返回true,则继续调用下一个拦截器。如果返回false,则中断执行。
postHandle:在方法执行后调用。
afterCompletion:在整个请求处理完毕后进行回调,也就是说视图渲染完毕或者调用方已经拿到响应。
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.web.servlet.handler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.AsyncHandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {
public HandlerInterceptorAdapter() {
}
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
}
}
项目实例:
package com.***.***.***.filter;
import com.corepass.common.utils.JsonUtil;
import com.corepass.common.web.ResponseCode;
import com.corepass.common.web.Result;
import com.corepass.hospital.tjhospitalmain.annotations.IgnoreAuthentication;
import com.corepass.hospital.tjhospitalmain.context.AppContext;
import com.corepass.hospital.tjhospitalmain.model.User;
import com.corepass.hospital.tjhospitalmain.model.UserLoginRecord;
import com.corepass.hospital.tjhospitalmain.service.UserLoginRecordService;
import com.corepass.hospital.tjhospitalmain.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Slf4j
@Component
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Resource
private UserService userService;
@Resource
private RedisTemplate redisTemplate;
@Resource
private UserLoginRecordService userLoginRecordService;
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info(request.getRequestURI());
// 有注解忽略校验
boolean hasAnnotataion = handler.getClass().isAssignableFrom(HandlerMethod.class);
if(hasAnnotataion){
//自定义注解 @IgnoreAuthentication
IgnoreAuthentication ignoreAuthentication = ((HandlerMethod)handler).getMethodAnnotation(IgnoreAuthentication.class);
if(ignoreAuthentication != null){
return true;
}
}
//查询当前用户
User user = AppContext.getCurrentUser();
String token = request.getHeader(“token”);
if(user == null){
//数据库中取出token记录
UserLoginRecord userLoginRecord = userLoginRecordService.findByToken(token);
if(userLoginRecord != null){
user = userService.getById(userLoginRecord.getUserId());
redisTemplate.boundValueOps(userLoginRecord.getToken()).set(user);
return true;
}
Result result = Result.failure(ResponseCode.INVALID_TOKEN);
response.setCharacterEncoding("utf-8");
response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
response.getWriter().write(JsonUtil.object2JSON(result));
response.getWriter().close();
response.flushBuffer();
System.out.println("-----------------------------------" + "用户不存在");
return false;
}
return true;
}
}