SpringBoot的工具能写php吗,SpringBoot实现过滤器

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) {

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值