java - 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
谁能帮我这个?
解决方案
Postman 不关心 SOP(Same-Origin Policy),它是一个开发工具,而不是浏览器。
CORS(跨域资源共享)和 SOP(同源策略)是客户端决定是否强制执行的服务器端配置。
与客户相关
大多数浏览器都会强制执行它以防止与 CSRF 攻击相关的问题。大多数开发工具都不关心它。作为开发工具的邮递员不会对 CORS 标头给予太多重视,您将需要其他东西来测试。
有一些 chrome 扩展可以帮助您在浏览器上测试 CORS。
推荐阅读
- android - 尝试在 Intellij 2018.2.RC 中执行 JUnit 4 测试时出现 NoClassDefFoundError
- javascript - 将文本文件转换为表格
- python - matplotlib:从顶部查看 3D 图形,并获得 2D 横截面?
- javascript - 如何检查一个人正在查看页面的哪个部分
- php - 试图获取非对象 Laravel 5,4 的属性
- c - (-1 >= sizeof(buffer)) 怎么可能是真的?程序无法获得正确的比较结果
- ssl - 如何使用 Nginx 为不同的位置启用不同的 SSL 证书?
- python - 有没有办法默认从 sdist 安装 Python 包?
- video - 使用 C 库将帧编码为视频
- javascript - jQuery html 脚本 document.currentScript