大家好!许多人都熟悉 class javax.servlet.Filter,它允许您在请求生命周期中嵌入自己的逻辑,我对此有疑问:
public class CorsFilter implements Filter {
private static final String ACCESS_CONTROL_ALLOW_ORIGIN = "Access-Control-Allow-Origin";
private static final String ACCESS_CONTROL_ALLOW_HEADERS = "Access-Control-Allow-Headers";
private static final String ACCESS_CONTROL_ALLOW_METHODS = "Access-Control-Allow-Methods";
private static final String ALLOW = "Allow";
@Override
public void init(FilterConfig filterConfig) {
// NO LOGIC
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
chain.doFilter(req, resp);
final HttpServletResponse response = (HttpServletResponse) resp;
final Collection<String> headers = response.getHeaderNames();
if (notContainHeaderWithIgnoreCase(headers, ACCESS_CONTROL_ALLOW_ORIGIN)) {
response.addHeader(ACCESS_CONTROL_ALLOW_ORIGIN, "*");
}
if (notContainHeaderWithIgnoreCase(headers, ACCESS_CONTROL_ALLOW_HEADERS)) {
response.addHeader(ACCESS_CONTROL_ALLOW_HEADERS, "*");
}
if (notContainHeaderWithIgnoreCase(headers, ACCESS_CONTROL_ALLOW_METHODS)) {
response.addHeader(ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, PUT, DELETE, OPTIONS");
}
if (notContainHeaderWithIgnoreCase(headers, ALLOW)) {
response.addHeader(ALLOW, "GET, POST, PUT, DELETE, OPTIONS");
}
}
private boolean notContainHeaderWithIgnoreCase(Collection<String> headers, String name) {
return headers.stream().noneMatch(header -> header.equalsIgnoreCase(name));
}
@Override
public void destroy() {
// NO LOGIC
}
}
在这个过滤器中,在形成响应后,我尝试查看其中是否有CORS标题,如果没有,则将它们放下。我不能在生成响应之前执行此操作,因为该服务有时会代理请求并且第三方服务也会CORS放下,从而复制它。
此实现不起作用,因为生成响应后,它被标记为commited并且无法更改。怎样成为?
我想通了问题,结果是这样的(也许有人会需要它):