CORS 过滤器如何工作?

CORS 功能通过添加一些特定的 HTTP 标头来工作,这些标头告诉浏览器应该允许下载的网页向给定/所有域发出 Web 请求。
此外,我们可以添加信息以指示浏览器仅允许在这些域 URL 上使用某些 HTTP 方法(GET/PUT/POST/DELETE 等)。

我们将在文章的其余部分阅读“预检请求”一词,因此让我们先了解它。

CORS 预检请求是一个 CORS 请求,用于检查 CORS 协议是否被另一个域理解。
它是一个 OPTIONS 请求,使用两个 HTTP 请求标头:Access-Control-Request-MethodAccess-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 标头。
Java CORS 过滤器

跨域资源共享 (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