开启拦截器
在启动类上加上注解@ServletComponentScan
//basePackages配置拦截器所在的包名
@ServletComponentScan(basePackages = "com.xxx.xxx")
编写RequestHeaderInfo(用于存储请求中带的一些通用请求头)
@Data
public class RequestHeaderInfo {
/**
* 客户端ip
*/
private String clientIp;
/**
* 发起请求的用户id
*/
private Integer userId;
/**
* 调用url
*/
private String url;
}
编写ThreadLocal类
import com.xxx.model.common.RequestHeaderInfo;
public class RequestHeaderInfoThreadLocal {
private final static ThreadLocal<RequestHeaderInfo> REQUEST_HEADER_INFO_THREAD_LOCAL = new ThreadLocal<>();
/**
* 将请求头中带的信息放在ThreadLocal中
* @param requestHeaderInfo
*/
public static void setRequestHeaderInfo(RequestHeaderInfo requestHeaderInfo){
REQUEST_HEADER_INFO_THREAD_LOCAL.set(requestHeaderInfo);
}
/**
* 获取请求头中带的信息
* @return
*/
public static RequestHeaderInfo getRequestHeaderInfo(){
return REQUEST_HEADER_INFO_THREAD_LOCAL.get();
}
/**
* 清除ThreadLocal
*/
public static void clearRequestHeaderInfo(){
REQUEST_HEADER_INFO_THREAD_LOCAL.remove();
}
}
编写拦截器类
import cn.hutool.core.util.StrUtil;
import com.xxx.common.RequestHeaderInfoThreadLocal;
import com.xxx.model.common.RequestHeaderInfo;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter(filterName = "requestHeaderInfoFilter", urlPatterns = "/*")
public class RequestHeaderInfoFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* 提取请求头中的客户端ip信息和用户信息, 放在ThreadLocal中
* @param request
* @param response
* @param chain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String clientIp = httpServletRequest.getHeader("clientIp");
String userIdHeaderValue = httpServletRequest.getHeader("userId");
Integer userId = StrUtil.isEmpty(userIdHeaderValue) ? null : Integer.valueOf(userIdHeaderValue);
String url = httpServletRequest.getServletPath();
RequestHeaderInfo requestHeaderInfo = new RequestHeaderInfo();
requestHeaderInfo.setClientIp(clientIp);
requestHeaderInfo.setUserId(userId);
requestHeaderInfo.setUrl(url);
RequestHeaderInfoThreadLocal.setRequestHeaderInfo(requestHeaderInfo);
try {
chain.doFilter(request, response);
} finally {
clearRequestHeaderInfo();
}
}
private void clearRequestHeaderInfo() {
RequestHeaderInfoThreadLocal.clearRequestHeaderInfo();
}
@Override
public void destroy() {
}
}
获取请求头信息
/*从请求头中获取用户id*/
Integer userId = RequestHeaderInfoThreadLocal.getRequestHeaderInfo().getUserId();
自此完成了拦截请求并获取请求头信息然后再放心请求的所有操作。