【问题标题】:Access-Control-Allow-Origin header not found after CORS filter added添加 CORS 过滤器后未找到 Access-Control-Allow-Origin 标头
【发布时间】: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()"。这应该工作

标签: spring-boot http-headers xmlhttprequest cors


【解决方案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’”。那个奇怪的值是从哪里来的?
猜你喜欢
  • 2019-11-19
  • 2018-09-19
  • 2019-06-19
  • 2019-02-07
  • 2015-11-06
  • 2021-08-12
  • 2018-03-28
  • 1970-01-01
  • 2017-11-24
相关资源
最近更新 更多