Javascript 访问控制允许origin在POST请求中不使用ajax

Javascript 访问控制允许origin在POST请求中不使用ajax,javascript,java,ajax,cors,cross-domain,Javascript,Java,Ajax,Cors,Cross Domain,我的标题“Access control allow origin”有问题,我使用下一个代码发出请求: <script type='text/javascript'> function save() { $.ajax( { type: 'POST', url: "...", contentType: 'application/json', data:

我的标题“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开发了一个客户端,运行良好。我真的不知道为什么使用Ajax不起作用,但这表明web服务工作正常,问题出在客户端

你好

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

这应该让您了解CORS的基本概念

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

所以你可以用两种方法来解决它

  • 在您的后端服务器上www.example2.com。为所有传入请求启用CORS标头(允许具有来自其他来源的标头的请求)。在AJAX请求中设置CORS头。因此请求来自客户端->www.example2.com/post\u url

  • 我更喜欢这种方法。从www.example1.com上的客户端点击内部路由www.example1.com/api/post_url,并通过nginx或apache服务器配置将所有请求转发到
    /api
    www.example2.com。因此,请求来自客户端->www.example1.com/api/post\u url->www.example2.com/post\u url


  • 在您的服务中实现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;
        }
    }
    

    我找到的解决方案是使用以下代码创建一个实现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>
    
    
    com.sun.jersey.spi.container.ContainerResponseFilters
    过滤器。夏季响应过滤器
    
    有了这个解决方案,我可以解决我的问题。我希望能帮助任何有同样问题的人


    谢谢您的回答。

    您似乎需要为端点检查启用CORS。谢谢,但我没有使用Spring Framework。谢谢您的回复。我尝试了第一种解决办法,但没有成功。从我所读到的,这个错误是普遍的,并不一定表明真正的问题。关于第二个解决方案,我不能使用其他服务器,该项目是在WebSphereServer中实现的。
    @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;
     }
    
     <init-param>
          <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
          <param-value>filter.SummerResponseFilter</param-value>
     </init-param>