访问控制允许来源不是在一个POST请求使用Ajax工作

问题描述 投票:0回答:3

我有一个头文件“的访问控制允许来源”,我用下面的代码,以请求一个问题:

<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();

}

当试图从地址来访问指定的标题“访问控制允许来源”,在浏览器控制台我得到这个错误:

XMLHttpRequest的无法加载http://sdpeapp00024.pe.intranet:9080/ccws/rest/ops/pcnct020。回应预检要求未通过访问控制检查:没有“访问控制允许来源”标头出现在所请求的资源。因此,原产地“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 doesn't的作品,但是这表明了Web服务工作正常,问题是在客户端。

问候。

PS。在代码中,我不把网址,因为我不允许有两个以上的URL进行发布,但它们是显示错误消息的相同。

javascript java ajax cors cross-domain
3个回答
1
投票

我找到了解决办法是创建一个实现使用一个代码ContainerResponseFilter接口(com.sun.jersey.spi.container)一个新的类:

@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;
 }

}

然后在XML在这样定义:

 <init-param>
      <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
      <param-value>filter.SummerResponseFilter</param-value>
 </init-param>

有了这个解决方案,我可以解决我的问题。我希望能帮助有同样问题的人。

谢谢您的回答。


0
投票

link应该给你CORS的基本思路。

总之,当你的域www.example1.com *客户端尝试打这是对www.example2.com托管的API发生CORS错误。你得到的CORS错误是由浏览器安全标志。

所以,你可以通过两种方式解决这个问题。

  1. 在您的后端服务器www.example2.com。启用所有传入请求CORS标头(允许从其他来源与头的请求)。在您的AJAX请求设置CORS标头。因此请求会从客户端 - > www.example2.com/post_url
  2. 我喜欢这种方法。从您的客户端,它是www.example1.com打内部路由www.example1.com/api/post_url并转发所有的请求通过nginx的或Apache服务器配置到/api到www.example2.com。因此请求会从客户端 - > www.example1.com/api/post_url - > www.example2.com/post_url

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.