首页 > 解决方案 > CORS 在客户端和服务器位于相同 url 的情况下无法使用 CORS 过滤器

问题描述

我正在尝试使用 CORS 过滤器实现客户端和服务器位于同一 URL 中的 CORS。下面是我实现的代码

CORS 过滤器

package com.core.web.spring.cors;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CORSFilter implements Filter{

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        ((HttpServletResponse) res).addHeader("Access-Control-Allow-Origin", "http://192.168.0.103:1111");
        ((HttpServletResponse) res).addHeader("Access-Control-Allow-Methods",
                "GET, POST");
        ((HttpServletResponse) res).addHeader("Access-Control-Max-Age", "3600");
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
        
    }

}

web.xml

<filter>
  <filter-name>cors</filter-name>
  <filter-class>com.core.web.spring.cors.CORSFilter</filter-class>
</filter>
  
<filter-mapping>
  <filter-name>cors</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

我已将 Access-Control-Allow-Origin 设置为http://192.168.0.103:1111。我正在将 postman 工具的来源更改为http://192.168.0.108:1111。但它不是阻塞请求,而是执行它。我得到了成功的回应。

下面是请求头和响应头

请求标头

Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Connection: keep-alive
Content-Length: 1296
Content-Type: text/html; charset=UTF-8`enter code here`
Host: 192.168.0.103:1111
Origin: http://192.168.0.108:1111
Referer: http://192.168.0.103:1111/SampleTest/index.html
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
X-Requested-With: XMLHttpRequest

响应头

Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Origin: http://192.168.0.103:1111
Access-Control-Max-Age: 3600
Connection: keep-alive
Content-Length: 1210
Date: Sat, 03 Jul 2021 06:11:55 GMT
Server: WildFly/11
Strict-Transport-Security: max-age=7776000; includeSubdomains
X-Content-Type-Options: nosniff
X-FRAME-OPTIONS: SAMEORIGIN
X-Powered-By: Undertow/1

谁能帮我这个?

标签: javacors

解决方案


Postman 不关心 SOP(Same-Origin Policy),它是一个开发工具,而不是浏览器。

CORS(跨域资源共享)和 SOP(同源策略)是客户端决定是否强制执行的服务器端配置。

与客户相关

大多数浏览器都会强制执行它以防止与 CSRF 攻击相关的问题。大多数开发工具都不关心它。作为开发工具的邮递员不会对 CORS 标头给予太多重视,您将需要其他东西来测试。

有一些 chrome 扩展可以帮助您在浏览器上测试 CORS。


推荐阅读