对预检请求的响应没有通过访问控制检查:否'访问控制 - 允许 - 来源'标题存在。服务器错误

时间:2017-02-05 11:06:19

标签: java angularjs networking cors jetty

我在前端使用角度js,在后端使用java hibernate。几天前我的网站工作得非常好,但最近我对表格结构进行了一些修改。在那些更改后,当我尝试集成角度js时,我面临以下错误消息。

  

XMLHttpRequest无法加载localhost:8080 / SignInMainServlet。对预检请求的响应没有通过访问控制检查:否'访问控制 - 允许 - 来源'标头出现在请求的资源上。起源' localhost:3000'因此不允许访问。

我读了一下有关预检请求和标题权限的内容,但所有可能的解决方案都失败了。

我有一个索引页面,它有一些get请求,并且在我最初加载页面或稍后刷新它时工作正常。但是一旦我调用SignInMainServlet的post请求,就会弹出错误。在此之后,当我刷新页面时,get请求都不起作用并显示相同的错误。

这是我的帖子请求

return $http({
            method: 'POST',
            url: 'http://localhost:8080/SignInMainServlet',
            data: $httpParamSerializerJQLike({
                login_source: source,
                accessToken: code,
                referrer_code: referral_id
            }),
            headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8' }
        });

他的请求的服务器端是:

String referrer_code=request.getParameter("referrer_code");
String login_source=request.getParameter("login_source");
String accessToken=request.getParameter("accessToken");

SignInMainManager m = new SignInMainManager(accessToken, referrer_code, login_source,REFERRAL_CODE_COUNT);
String result = m.signIn();


response.setContentType("text/html");  

response.addHeader("Access-Control-Allow-Origin","*");
response.addHeader("Access-Control-Allow-Methods"," GET, POST, OPTIONS");
response.addHeader("Access-Control-Allow-Headers","Content-Type");

PrintWriter out = response.getWriter(); 


out.println(result);
out.close();//closing the stream 

我在发送请求时监控网络并获得以下信息:

常规

请求URL:localhost:8080 / SignInMainServlet 请求方法:选项 状态代码:200 OK 远程地址:127.0.0.1:8080

响应标题

允许:GET,HEAD,POST,TRACE,OPTIONS 内容长度:0 日期:太阳,2017年2月5日10:49:56 GMT 服务器:码头(8.1.14.v20131031)

请求标题

接受: / Accept-Encoding:gzip,deflate,sdch,br 接受语言:EN-GB,EN-US; Q = 0.8,连接; Q = 0.6 访问控制请求报头:授权 访问控制请求-方法:POST 连接:保持活跃 主持人:本地主机:8080 产地:本地主机:3000 的Referer:本地主机:3000 / User-Agent:Mozilla / 5.0(X11; Linux x86_64)AppleWebKit / 537.36(KHTML,类似Gecko)Chrome / 55.0.2883.87 Safari / 537.36

1 个答案:

答案 0 :(得分:0)

我创建了此过滤器,现在它正在处理所有请求。

package com.your.package;

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;    

@WebFilter(asyncSupported = true, urlPatterns = { "/*" })
public class Filter implements javax.servlet.Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        ((HttpServletResponse) response).addHeader("Access-Control-Allow-Origin", "*");
        ((HttpServletResponse) response).addHeader("Access-Control-Allow-Methods", "GET, OPTIONS, HEAD, PUT, POST");
        ((HttpServletResponse) response).addHeader("Access-Control-Allow-Headers", "Content-Type");
        ((HttpServletResponse) response).addHeader("Access-Control-Max-Age", "86400");
        // pass the request along the filter chain
        chain.doFilter(request, response);
    }

    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }
}

如果您使用的是web.xml,则可以按照以下步骤操作。 https://amodernstory.com/2014/12/27/using-cors-headers-with-java-example/