添加 CORS 过滤器后未找到 Access-Control-Allow-Origin 标头
Posted
技术标签:
【中文标题】添加 CORS 过滤器后未找到 Access-Control-Allow-Origin 标头【英文标题】:Access-Control-Allow-Origin header not found after CORS filter added 【发布时间】:2016-08-25 02:36:18 【问题描述】:我使用 AngularJS 实现了一个登录表单以进行用户身份验证。以下是我使用 post 请求登录的服务:
app.factory("loginFactory", function ($http)
return
login: function(username, password)
var data = "username="+username+"&password="+password+"&submit=Login";
return $http(
method: 'POST',
url: 'http://localhost:8080/login',
data: data,
headers:
'Content-Type': 'application/x-www-form-urlencoded',
);
);
运行时出现以下错误。
XMLHttpRequest cannot load http://localhost:8080/login.No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:8081' is therefore not allowed access.
我做了一些研究,发现必须在服务器端添加标头。根据这个post,我在我的休息服务中添加了以下内容
@Component
public class SimpleCORSFilter implements Filter
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me");
chain.doFilter(req, res);
@Override
public void init(FilterConfig filterConfig)
@Override
public void destroy()
但是,我仍然遇到同样的错误。
【问题讨论】:
你检查request.getHeader("Origin")
返回的内容了吗?
get 请求是怎么写的?
@PritamBanerjee 登录服务实际上是一个post请求。在原始帖子中查看我的编辑。由于身份验证由 Spring Security 处理,因此 http://localhost:8080/login
不需要来自服务器端的控制器。
而不是添加 request.getHeader("Origin") 尝试使用这个:request.getRemoteHost()
。如果这不起作用,请使用此"request.getHeader() + ":" + request.getRemotePort()"
。这应该工作
【参考方案1】:
由于浏览器在 Allow Origin Header 中查找 http://127.0.0.1:8081
,因此您需要确保将其添加到以下行中:
response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:8081");
要获取http://127.0.0.1:8081
,您可以使用:
request.getRemoteAddr() + ":" + request.getRemotePort();
但如果浏览器查找 localhost 则选择 :
request.getRemoteHost().
希望能解决您的问题。
【讨论】:
试了你的建议,还是一样。就算试过response.setHeader("Access-Control-Allow-Origin", "*");
还是不行
使用 Post 的问题是,它首先发送一个预检请求,该请求被浏览器阻止。
您可以尝试在浏览器中禁用网络安全。但这只是一个临时解决方案。
根据这个post,我在WebSecurityConfig
类中添加了.addFilterBefore(new CORSFilter(), ChannelProcessingFilter.class)
。现在错误变成了“‘Access-Control-Allow-Origin’标头包含无效值‘0:0:0:0:0:0:0:1:54174’”。那个奇怪的值是从哪里来的?
***.com/questions/17964297/…以上是关于添加 CORS 过滤器后未找到 Access-Control-Allow-Origin 标头的主要内容,如果未能解决你的问题,请参考以下文章
spring配置CORS后未返回Access-Control-Allow-Origin的踩坑解决
spring配置CORS后未返回Access-Control-Allow-Origin的踩坑解决
spring配置CORS后未返回Access-Control-Allow-Origin的踩坑解决