拦截器的加载是在springcontext创建之前完成的。这里让bean提前加载就可以注入成功了,下面看代码
自定义的拦截器代码如下:
package zut.edu.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import zut.edu.dto.CurrentUserInfo;
import zut.edu.service.UsersService;
import zut.edu.utils.JwtUtil;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @version 1.0
* @date 2021/2/1 17:26
*/
@Slf4j
public class JwtAuthenticationInterceptor implements HandlerInterceptor {
@Autowired
private UsersService usersService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// springboot跨域请求 放行OPTIONS请求
if(request.getMethod().toUpperCase().equals("OPTIONS")){
return true;//通过所有OPTION请求
}
// 获取请求头中的Token 参数要跟前端的设置一样
String token = request.getHeader("X-Token");
if(token == null){
return false;
}
if(!JwtUtil.verifyToken(token)){
return false;
}
// 获取token中的用户的id
String userId = JwtUtil.parseToken(token);
log.info("查看token中的用户id:" + userId);
// 获取当前操作用户信息
CurrentUserInfo currentUserInfo = usersService.getCurrentUserInfo(userId);
// 为CurrentUserMethodArgumentResolver中的currentUserInfo设置用户信息
request.setAttribute("currentUserInfo", currentUserInfo);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
把拦截器添加到拦截器链中
package zut.edu.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import zut.edu.interceptor.CurrentUserMethodArgumentResolver;
import zut.edu.interceptor.JwtAuthenticationInterceptor;
import java.util.List;
/**
* @version 1.0
* @date 2021/2/1 17:35
*/
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Bean
public JwtAuthenticationInterceptor setBean(){
return new JwtAuthenticationInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(setBean()).addPathPatterns("/**").excludePathPatterns("/users/userlogin");
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(currentUserMethodArgumentResolver());
}
@Bean
public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver() {
return new CurrentUserMethodArgumentResolver();
}
}
注意