Chỉ cần thực hiện công việc tương tự như vùng chứa đã có. I E. phát minh lại bánh xe của mẫu thiết kế chain of responsibility dưới nắp được sử dụng bởi bộ lọc 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();
}
}
}
với những lớp helper ít (có thể nếu cần được thực hiện private static
lớp lồng nhau của các bên trên GodFilter
):
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);
}
}
và
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);
}
}
Bạn có thể nếu cần thiết cũng nuôi một Tệp cấu hình XML với tất cả các bộ lọc có thể để bạn kết thúc với cấu hình dễ dàng hơn. Bạn có thể sử dụng phản chiếu để tạo bộ lọc trong init()
trong số GodFilter
của mình.
Oh nevermind, đó là những gì các web.xml
và container đã được làm ...
Nó sẽ phụ thuộc vào các container servlet, vì vậy bạn nên cho chúng tôi biết cái nào bạn đang sử dụng – SJuan76
nó Phải phụ thuộc? GuiceFilter có phụ thuộc vào container không? – TJR
Guice sẽ cuộn cơ chế ánh xạ của riêng nó hoạt động giống như ánh xạ 'web.xml' - cho vùng chứa web, tất cả các yêu cầu kết thúc tại' GuiceFilter'. Nếu bạn muốn Guice, chỉ cần sử dụng nó :) –