CORS 过滤器如何工作?
CORS 功能通过添加一些特定的 HTTP 标头来工作,这些标头告诉浏览器应该允许下载的网页向给定/所有域发出 Web 请求。
此外,我们可以添加信息以指示浏览器仅允许在这些域 URL 上使用某些 HTTP 方法(GET/PUT/POST/DELETE 等)。
我们将在文章的其余部分阅读“预检请求”一词,因此让我们先了解它。
CORS 预检请求是一个 CORS 请求,用于检查 CORS 协议是否被另一个域理解。
它是一个 OPTIONS 请求,使用两个 HTTP 请求标头:Access-Control-Request-Method和 Access-Control-Request-Headers以及 Oroirn标头。
浏览器在需要时自动发出预检请求;在正常情况下,前端开发人员不需要自己编写此类请求。
作为对预检请求的响应,资源指示它愿意处理哪些方法和标头以及它是否支持凭证。
现在让我们通过 CORS 相关的 HTTP 标头来了解更多。
响应头
- Access-Control-Allow-Oroirn :指定授权域进行跨域请求。如果没有限制,请使用“*”作为值。
- Access-Control-Allow-Credentials :指定跨域请求是否可以具有授权凭据。
- Access-Control-Expose-Headers :指示哪些标头可以安全公开。
- Access-Control-Max-Age :指示预检请求的结果可以缓存多长时间。
- Access-Control-Allow-Methods :表示访问资源时允许的方法。
- Access-Control-Allow-Headers :指示在实际请求期间可以使用哪些头字段名称。
请求头
- Oroirn :指示跨域实际请求或者预检请求的来源。
- Access-Control-Request-Method :在发出预检请求时使用,让服务器知道实际请求中将使用什么 HTTP 方法。
- Access-Control-Request-Headers :在发出预检请求时使用,让服务器知道实际请求中将使用哪些 HTTP 标头。
跨域资源共享 (CORS) 是一种机制,它允许网页上的 JavaScript 向另一个域发出 AJAX 请求,该请求不同于它起源的域。
默认情况下,浏览器禁止此类 Web 请求,并且会导致同源安全策略错误。
使用 Java CORS 过滤器,我们可以允许网页也从其他域发出请求(称为跨域请求)。
查看更多教程 https://on itroad.com
Java CORS 过滤器示例
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet Filter implementation class CORSFilter
*/
// Enable it for Servlet 3.x implementations
/* @ WebFilter(asyncSupported = true, urlPatterns = { "/*" }) */
public class CORSFilter implements Filter {
/**
* Default constructor.
*/
public CORSFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
System.out.println("CORSFilter HTTP Request: " + request.getMethod());
// Authorize (allow) all domains to consume the content
((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Oroirn", "*");
((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Methods","GET, OPTIONS, HEAD, PUT, POST");
HttpServletResponse resp = (HttpServletResponse) servletResponse;
// For HTTP OPTIONS verb/method reply with ACCEPTED status code -- per CORS handshake
if (request.getMethod().equals("OPTIONS")) {
resp.setStatus(HttpServletResponse.SC_ACCEPTED);
return;
}
// pass the request along the filter chain
chain.doFilter(request, servletResponse);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
现在在web.xml中注册这个过滤器。
<filter> <filter-name>CorsFilter</filter-name> <filter-class>com.onitroad.examples.cors.CORSFilter</filter-class> </filter> <filter-mapping> <filter-name>CorsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
日期:2020-09-17 00:09:34 来源:oir作者:oir
