1、拦截器代码
@Slf4j
@Component
public class AuthHeaderSettingFilter implements Filter {
//获取token的userId
public String getUserIdByToken(HttpServletRequest request) {
// 获取当前的用户
String accessToken = request.getHeader("accessToken");
if (StringUtils.isNotBlank(accessToken)) {
//解析token获取userId,具体根据项目而定
String userId = JwtHelpUtil.getUserId(accessToken);
if (StringUtils.isBlank(userId)) {
return "";
}
return userId;
}
return "";
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("----authHeaderSettingFilter过滤器初始化----");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//log.info("经过AuthHeaderSettingFilter");
HttpServletRequest req = (HttpServletRequest) request;
HeaderMapRequestWrapper requestWrapper = new HeaderMapRequestWrapper(req);
//获得请求参数中的token值
String userId = getUserIdByToken(req);
log.info("userId:{}", userId);
//如果请求中带有这个参数,则进行过滤加一个header头
requestWrapper.addHeader("userId", userId);
chain.doFilter(requestWrapper, response); // Goes to default servlet.
}
@Override
public void destroy() {
log.info("----authHeaderSettingFilter过滤器销毁----");
}
}
2、注册拦截器
/**
* 拦截器配置
*/
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Autowired
private AuthHeaderSettingFilter authHeaderSettingFilter;
/**
* 配置过滤器
*
* @return
*/
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(authHeaderSettingFilter);
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
/**
* 定义全局http返回编码
*
* @param configurer
*/
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorParameter(true)
// 禁用accept协商方式,即不关心前端传的accept值
.ignoreAcceptHeader(true)
// 哪个放在前面,哪个的优先级就高。当上面这个accept未禁用时,若请求传的accept不能覆盖下面两种,则会出现406错误
.defaultContentType(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
// 根据传参mediaType来决定返回样式
.parameterName("mediaType")
// 当acceptHeader未禁用时,accept的值与mediaType传参的值不一致时,以mediaType的传值为准
// mediaType值可以不传,为空也行,但是不能是json/xml之外的其他值
.mediaType("json", MediaType.APPLICATION_JSON)
.mediaType("xml", MediaType.APPLICATION_XML);
}
}
3、工具类
public class HeaderMapRequestWrapper extends HttpServletRequestWrapper {
/**
* construct a wrapper for this request
*
* @param request
*/
public HeaderMapRequestWrapper(HttpServletRequest request) {
super(request);
}
private Map<String, String> headerMap = new HashMap<String, String>();
/**
* add a header with given name and value
*
* @param name
* @param value
*/
public void addHeader(String name, String value) {
headerMap.put(name, value);
}
@Override
public String getHeader(String name) {
String headerValue = super.getHeader(name);
if (headerMap.containsKey(name)) {
headerValue = headerMap.get(name);
}
return headerValue;
}
/**
* get the Header names
*/
@Override
public Enumeration<String> getHeaderNames() {
List<String> names = Collections.list(super.getHeaderNames());
for (String name : headerMap.keySet()) {
names.add(name);
}
return Collections.enumeration(names);
}
@Override
public Enumeration<String> getHeaders(String name) {
List<String> values = Collections.list(super.getHeaders(name));
if (headerMap.containsKey(name)) {
values.add(headerMap.get(name));
}
return Collections.enumeration(values);
}
}
4、userId如何直接获取(@RequestHeader(“userId”)String userId)
@PostMapping("/approval")
public String approval(@RequestHeader("userId")String userId){
return applyService.approval(userId);
}