gpt4 book ai didi

java - 如何启用包含特定单词的 url 过滤器?

转载 作者:行者123 更新时间:2023-11-30 05:32:26 25 4
gpt4 key购买 nike

我正在尝试使用过滤器记录对某些网址的请求。

我想要的这些特定网址包含 api 一词,因此从 "/aaaa/api""/api/items/3 的任何内容“

在我被告知更改它以匹配其中包含 "api" 的任何 URL 之前,我在过滤器配置中设置了 URL 模式,但我删除了它并使用了 regex在我的 ApiLogFilter 中过滤 URL,如下所示。

我的问题是:有没有办法通过在 Filter Config 中编辑 addUrlPatterns 的模式来实现这一点?另外,最佳实践是什么?

@Configuration
public class FilterConfig {

@Bean
public FilterRegistrationBean<ApiLogFilter>
filterRegistrationBean() {
FilterRegistrationBean<ApiLogFilter> registrationBean = new
FilterRegistrationBean();
registrationBean.setFilter(new ApiLogFilter());
registrationBean.addUrlPatterns("/api/items/*");
return registrationBean;
}
@Override
public final void doFilterInternal(
HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain)
throws ServletException, IOException {
// 処理の開始時間を記録
long startTime = System.currentTimeMillis();
// フィルターチェーンの次のフィルターにリクエストとレスポンスを渡す
filterChain.doFilter(request, response);
// 処理が戻ってきた時間から処理時間を記録
long processingTime = System.currentTimeMillis() - startTime;

// logs only if the request URL follows this pattern
if (request.getRequestURI().matches(".*/api/.*")) {
// ログ出力
logger.info(
"{} \"{} {}\" {} {}(ms)", request.getRemoteHost(),
request.getMethod(),
request.getRequestURI(), response.getStatus(),
processingTime);
}
}

最佳答案

在 Spring 中,您有两种处理 HTTP 请求/响应的选项。这些是使用 servlet 过滤器(就像您所做的那样)或拦截器 ( link )。

过滤器可以更改请求/响应,甚至完全停止 HTTP 工作流程。如果您在过滤器中遇到未处理的异常,您的请求将停止工作。

拦截器无法更改请求/响应。它只能听。与过滤器不同,如果您在拦截器请求中遇到未处理的异常,则不会停止工作(您只是在控制台或日志中收到消息)。

关于 URL 模式:它的语法非常简单。事实上,您几乎所能做的就是在字符串的开头或结尾指定星号。 *.ext - 表示具有 ext 扩展名的文件。 /api/* - 表示一切都以 /api/ 开头。我想这种简单性是为了提高性能效率。但不符合您的要求。

您在过滤器中使用正则表达式没有任何问题。它不会显着影响性能。除了一个评论之外,一切都很好。正则表达式处理由两部分组成:正则表达式的编译和字符串的匹配。 getRequestURI().matches() 每次调用它时都会执行这两个部分。最好只编译一次 regexp。添加到您的过滤器:

private static Pattern pattern = Pattern.compile(".*/api/.*");

然后您可以在过滤器的方法中使用预编译模式:

@Override
public final void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) {
...
if (pattern.matcher(request.getRequestURI()).matches()) {
//process query
}
}

这种方法可以避免每次使用模式时都重新编译。

关于java - 如何启用包含特定单词的 url 过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57264351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com