gpt4 book ai didi

java - 如何在不修改 web.xml 的情况下向 servlet 添加过滤器

转载 作者:IT老高 更新时间:2023-10-28 21:07:50 26 4
gpt4 key购买 nike

我希望能够以不同于 web.xml 的方式修改/配置过滤器。这是 2 个过滤器的静态配置。我希望能够静态配置一个过滤器并允许该过滤器加载其他过滤器。我只是想知道是否有人知道已经有这个的 lib。

使用 Servlet API 2.5

<web-app>
...
<filter>
<filter-name>MyFilter1</filter-name>
<filter-class>com.me.MyFilter1</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...
<filter>
<filter-name>MyFilter2</filter-name>
<filter-class>com.me.MyFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...
</web-app>

我已经看到在 Guice 中使用 GuiceFilter 完成此操作,其中过滤器是在运行时配置的。

最佳答案

只需执行与容器相同的工作即可。 IE。重新发明 chain of responsibility 的轮子servlet过滤器使用的设计模式。

public class GodFilter implements Filter {

private Map<Pattern, Filter> filters = new LinkedHashMap<Pattern, Filter>();

@Override
public void init(FilterConfig config) throws ServletException {
Filter1 filter1 = new Filter1();
filter1.init(config);
filters.put(new Pattern("/foo/*"), filter1);

Filter2 filter2 = new Filter2();
filter2.init(config);
filters.put(new Pattern("*.bar"), filter2);

// ...
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
HttpServletRequest hsr = (HttpServletRequest) request;
String path = hsr.getRequestURI().substring(hsr.getContextPath().length());
GodFilterChain godChain = new GodFilterChain(chain);

for (Entry<Pattern, Filter> entry : filters.entrySet()) {
if (entry.getKey().matches(path)) {
godChain.addFilter(entry.getValue());
}
}

godChain.doFilter(request, response);
}

@Override
public void destroy() {
for (Filter filter : filters.values()) {
filter.destroy();
}
}

}

使用那些小助手类(如果需要,可以将其设为上述 GodFilterprivate static 嵌套类):

public class Pattern {

private int position;
private String url;

public Pattern(String url) {
this.position = url.startsWith("*") ? 1
: url.endsWith("*") ? -1
: 0;
this.url = url.replaceAll("/?\\*", "");
}

public boolean matches(String path) {
return (position == -1) ? path.startsWith(url)
: (position == 1) ? path.endsWith(url)
: path.equals(url);
}

}

public class GodFilterChain implements FilterChain {

private FilterChain chain;
private List<Filter> filters = new ArrayList<Filter>();
private Iterator<Filter> iterator;

public GodFilterChain(FilterChain chain) {
this.chain = chain;
}

@Override
public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
if (iterator == null) {
iterator = filters.iterator();
}

if (iterator.hasNext()) {
iterator.next().doFilter(request, response, this);
} else {
chain.doFilter(request, response);
}
}

public void addFilter(Filter filter) {
if (iterator != null) {
throw new IllegalStateException();
}

filters.add(filter);
}

}

如有必要,您还可以提供包含所有可能过滤器的 XML 配置文件,以便您最终获得更轻松的配置。您可以使用反射在 GodFilterinit() 中创建过滤器。

哦,没关系,这就是 web.xml 和容器已经在做的事情......

关于java - 如何在不修改 web.xml 的情况下向 servlet 添加过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7192834/

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