添加 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的踩坑解决

spring配置CORS后未返回Access-Control-Allow-Origin的踩坑解决

spring 控制器无法从 $http 角度检索数据

添加了 Spring Security CORS 过滤器 - 从 DB 检索的日期显示在数值中