컨테이너와 동일한 작업을 이미 수행합니다. 나는. 서블릿 필터에서 사용 된 커버 아래에있는 디자인 패턴 chain of responsibility의 휠을 재발 명하십시오. 또한 먹이를
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);
}
}
당신 수 필요한 경우 : (필요한 위 GodFilter
의 private static
중첩 된 클래스를 할 수있는 경우) 그 작은 헬퍼 클래스와
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();
}
}
}
XML 구성 파일에 가능한 모든 필터가 있으므로 쉽게 구성 할 수 있습니다. 리플렉션을 사용하여 GodFilter
의 init()
에 필터를 만들 수 있습니다.
은 신경 끄시 아, 그건 무엇 web.xml
이미 컨테이너가하고있는 ...
그것은 서블릿 컨테이너의 의존하는 것, 그래서 당신이 의존해야 – SJuan76
를 사용하고있는 한 당신이 우리를 말해야한다? GuiceFilter가 컨테이너에 종속되어 있습니까? – TJR
Guice는 'web.xml'매핑과 같이 동작하는 자체 매핑 메커니즘을 롤백합니다. 웹 컨테이너의 경우 모든 요청이 'GuiceFilter'에서 끝납니다. Guice를 원한다면 그냥 사용하십시오 :) –