Access-control-allow-origin在POST请求中不使用ajax

时间:2017-08-31 17:57:53

标签: javascript java ajax cors cross-domain

我的标题“Access-control-allow-origin”有问题,我使用下一个代码发出请求:

<script type='text/javascript'>
function save() {
           $.ajax(
         {
        type: 'POST',
        url: "...",                
        contentType: 'application/json',
        data: '{"cuspp":"228061JGLIR5", "userWeb":"46689"}',
        success: function (data) {
                console.log("It Works");
                console.log (data);
                if (data.codigo==0){
                    console.log(data.mensaje);
                }else{
                    console.log(data.mensaje);

                }
             },
        error: function (jqXHR, textStatus, errorThrown) {
                    console.log("error");
             }
         });
}
</script>

它是由java客户端做出的响应:

@POST
@Path("/pcnct020")
@ApiOperation(value = "Save events.", notes = "PCNCT020", responseClass = 
"data.Answer")
public Response saveEvents(
    @ApiParam(value="Structure of Event", required = false) Evento event) {     


    Answer<Result> answer = Validator.validate(event);

    if (answer.esOK()) {

        int size = event.textDetail.length();

        int count = size / 60;

        String comment =  event.textDetail;
        int secuence = 0;

        for (int j = 0; j <= count; j++) {
            evento.secuence = secuence;
            String newString;

            if (j == 0) {                                           
                if (size < 60) {                                    
                    newString = comment.substring(j * 60);

                } else {                                            
                    newString = comment.substring(j * 60,
                            (j * 60) + 60);
                }

            } else if (j == count) {                            
                newString = comment.substring(j * 60);          
                if (newString.equals("")) {                     
                    break;
                }

            } else {
                newString = comment.substring(j * 60,
                        (j * 60) + 60);
                if (newString.equals("")) {
                    break;
                }
            }
            event.textDetail = newString;   
            answer.setAnswer(event.saveEvent());
            secuence = Integer.parseInt(answer.ans.status);
        }

    }
    return Response
             .status(200)
             .header("Access-Control-Allow-Origin", "...")
             //.header("Access-Control-Allow-Credentials", "true")
             //.header("Access-Control-Allow-Headers", "Origin")
             //.header("Access-Control-Allow-Methods", "GET, POST, DELETE, 
                PUT, PATCH, HEAD, OPTIONS")
             //.header("Conten-Type","application/application/json")
             .entity(answer)
             .build();

}

当尝试从指示标题为“Access-Control-Allow-Origin”的地址进行访问时,在浏览器控制台中出现此错误:

XMLHttpRequest无法加载http://sdpeapp00024.pe.intranet:9080/ccws/rest/ops/pcnct020。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许原点“http://i6.sura.pe”访问。

我不知道还能做些什么。我已经尝试添加其他标题,比如来自java代码的响应中的注释,我总是得到同样的错误。

非常感谢你的帮助。

更新:

  public void getService(){

        try {

         String urlWS = "Web Service Url";

         String url = urlWS;

         CloseableHttpClient httpclient = HttpClients.createDefault();

         HttpPost httpPost = new HttpPost(url);

         httpPost.setHeader("Content-type", "application/json");

         StringEntity params =new StringEntity("
         {\"cuspp\":\"228061JGLIR0\", \"usuarioWeb\":\"46683\");                                        


         httpPost.setEntity(params);


         CloseableHttpResponse response = 
         httpclient.execute(httpPost);

         System.out.println(response.getStatusLine());               

         System.out.println(response.getStatusLine().getStatusCode());

         if(response.getStatusLine().getStatusCode() == 200){
             BufferedReader brResponse = new BufferedReader(new 
             InputStreamReader(response.getEntity().getContent()));
             String responseText = "";
             String output = "";
             while ((output = brResponse.readLine()) != null) {
                        responseText += output;
             }
             System.out.println(responseText);


        }             

    } catch (Exception excepcion) {            
            System.out.println(excepcion.toString());
    }
    finally{

    }
}  

我用java创建了一个客户端并且工作正常。我不知道为什么使用Ajax不起作用,但这表明Web服务正常工作,问题出在客户端。

问候。

PS。在代码中我没有放置url,因为我不允许使用两个以上的url发布,但它们与错误消息中显示的相同。

3 个答案:

答案 0 :(得分:1)

我找到的解决方案是创建一个新类,该类使用以下代码实现ContainerResponseFilter接口(com.sun.jersey.spi.container):

<select id="edit">
    <option value="1st">1st</option>
    <option value="2nd">2nd</option>
    <option value="3rd">3rd</option>
</select>

}

然后以这种方式在xml中定义:

@Provider
public class SummerResponseFilter implements ContainerResponseFilter {

@Override
public ContainerResponse filter(ContainerRequest request, ContainerResponse response) 
{

    //INICIO OT 10533 - PSC001
    String ruta = request.getPath();

    if(ruta.contains("pcnct020")){
        response.getHttpHeaders().add("Access-Control-Allow-Origin", "*");
        response.getHttpHeaders().add("Access-Control-Allow-Methods","GET, OPTIONS, 
        HEAD, PUT, POST");
        response.getHttpHeaders().add("Access-Control-Allow-Headers","Content-Type");

    }

    //FIN OT 10533 - PSC001

    if (Logger.isDebugEnabled()) {
        Logger.debug("Finaliza el proceso de la url [%s] %s", request.getMethod(), 
       request.getRequestUri().toString());
    }
    if (Logger.isTraceEnabled()) {
        Logger.trace("Response - Headers    = [ %s ]",           
        response.getHttpHeaders().toString());
        Logger.trace("Response - Status     = [ %d ]", response.getStatus());
    }
    Answer.clean();
    return response;
 }

使用此解决方案,我可以解决我的问题。我希望可以为遇到相同问题的任何人提供帮助。

谢谢您的回答。

答案 1 :(得分:0)

这个link应该给你一个CORS的基本概念。

简而言之,当域 www.example1.com * 上的客户端尝试访问 www.example2.com 上托管的API时,会发生CORS错误。您获得的CORS错误是浏览器的安全标记。

所以你可以通过两种方式解决它。

  1. 在您的后端服务器上 www.example2.com 。为所有传入请求启用CORS标头(允许来自其他来源的标头请求)。并在您的AJAX请求中设置CORS标头。因此请求来自客户 - &gt; www.example2.com/post_url

  2. 我更喜欢这种方法。来自 www.example1.com 上的客户点击内部路线 www.example1.com/api/post_url 并将所有请求转发至/api至< strong> www.example2.com 通过nginx或apache服务器配置。因此请求来自客户 - &gt; www.example1.com/api/post_url - &gt; www.example2.com/post_url

答案 2 :(得分:0)

在您的服务中实施ContainerResponseFilter。这应该可以解决您的问题,

public class Filter implements ContainerResponseFilter {

    @Override
    public ContainerResponse filter(ContainerRequest request,
            ContainerResponse response) {

        response.getHttpHeaders().add("Access-Control-Allow-Origin", "*");
        response.getHttpHeaders().add("Access-Control-Allow-Headers",
                "origin, content-type, accept, authorization, X-Request-With");
        response.getHttpHeaders().add("Access-Control-Allow-Credentials",
                "true");
        response.getHttpHeaders().add("Access-Control-Allow-Methods",
                "GET, POST, PUT, DELETE, HEAD");

        return response;
    }
}