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