Spring Boot设置过滤器
SpringBoot设置过滤器有很多种方法,包含有实现Filter接口进行路由过滤操作,这里使用OncePerRequestFilter类实现过滤器
OncePerRequestFilter是一个已经实现Fitler接口的类
在yml文件中配置相关白名单路由
具体代码入下
1、 需要使用FilterRegistrationBean进行配置
@Configuration
@Slf4j
public class CustomizeFilterConfig {
@Autowired
private OperationInterfaceFilter operationInterfaceFilter;
@Bean
public FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(operationInterfaceFilter);
return filterRegistrationBean;
}
}
2、实现过滤逻辑
@Component
@Slf4j
public class OperationInterfaceFilter extends OncePerRequestFilter {
@Value("${project.filter.filterFlag}")
private boolean filterFlag;
@Value("${spring.profiles.active}")
private String profile;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request);
if (!inWhiteFilter(request, requestWrapper)){
ServletOutputStream outputStream = response.getOutputStream();
response.setContentType(MediaType.APPLICATION_JSON_UTF8.toString());
//http response head status 403
response.setStatus(HttpStatus.FORBIDDEN.value());
DataApiResult dataApiResult = DataApiResult.fail("请求的路由暂时不开放");
outputStream.write(JacksonUtils.getInstance().writeValueAsBytes(dataApiResult));
return;
}
filterChain.doFilter(requestWrapper, response);
}
/**
* 过滤白名单
* @param request
* @param requestWrapper
* @return
*/
private boolean inWhiteFilter(HttpServletRequest request, ContentCachingRequestWrapper requestWrapper){
String method = request.getMethod();
String requestURI = request.getRequestURI();
log.info("请求 apigateway............filterFlag={},method={},path={}",filterFlag,method,requestURI);
//TODO 这里可以根据自己的过滤逻辑来处理不同的路由,路由可以在配置文件中配置
return false;
}
}
3、实现上下文的处理
public class ContentCachingRequestWrapper extends HttpServletRequestWrapper {
private byte[] body;
private BufferedReader reader;
private ServletInputStream inputStream;
public ContentCachingRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
loadBody(request);
}
private void loadBody(HttpServletRequest request) throws IOException {
body = IOUtils.toByteArray(request.getInputStream());
inputStream = new RequestCachingInputStream(body);
}
public byte[] getBody() {
return body;
}
@Override
public ServletInputStream getInputStream() throws IOException {
if (inputStream != null) {
return inputStream;
}
return super.getInputStream();
}
@Override
public BufferedReader getReader() throws IOException {
if (reader == null) {
reader = new BufferedReader(new InputStreamReader(inputStream, getCharacterEncoding()));
}
return reader;
}
private static class RequestCachingInputStream extends ServletInputStream {
private final ByteArrayInputStream inputStream;
public RequestCachingInputStream(byte[] bytes) {
inputStream = new ByteArrayInputStream(bytes);
}
@Override
public int read() throws IOException {
return inputStream.read();
}
@Override
public boolean isFinished() {
return inputStream.available() == 0;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener readlistener) {
}
}
}