2017-03-27 1 views
0

CORS 게시물 요청을하는 데 문제가 있습니다.jquery cors 게시물 요청이 작동하지 않음

/** 
* function to update channel information 
* @returns {undefined} 
*/ 
this.postNameInfo = function() { 
    var channel = self.selected.split("-")[0]; 
    var id = channel.replace("CH",""); 
    $.ajax({ 
     url: self.ioConfigurationUrl + "/" + id, 
     type: "POST", 
     data: { 
      "data": "name:" + $("#name")[0].value 
     }, 
     success: function() { 
      console.log("Change name succeed!"); 
      self.updateIoInfo(); 
      self.updateStorageInfo(); 
      $("#title").val($("#name")[0].value); 
      self.postTitleInfo(); 
     }, 
     error: function() { 
      console.log("Failed to change name of " + channel) 
     } 
    }); 
}; 

서버 측 코드가 여기에 있습니다 : : 내 서버 측에서

@POST 
    @Path("/{id : \\d+}") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response updateIOConfig(@PathParam("id") Integer id, @QueryParam("data") String data) { 
    if (!ChannelName.isValidChannel(id)) { 
     return Response.status(Response.Status.NOT_FOUND).build(); 
    } 
    init(); 
    IOConfiguration ioConfig = ioConfigurationDAO.findIOConfiguration("CH" + id); 
    String key = data.split(":")[0]; 
    String value = data.split(":")[1]; 
    if (!ioConfigurationDAO.getManager().getTransaction().isActive()) { 
     ioConfigurationDAO.getManager().getTransaction().begin(); 
    } 
    System.out.println(data); 
    if (key.equals("name")) { 
     ioConfigurationDAO.changeName(ioConfig.getIoConfigurationId(), value); 
     ioConfigurationDAO.getManager().getTransaction().commit(); 
     if (ioConfig.getDataSeriesMeta() != null && ioConfig.getDataSeriesMeta().size() != 0) { 
     List<DataSeriesMeta> list = ioConfig.getDataSeriesMeta(); 
     DataSeriesMetaDAO dataSeriesMetaDAO = new DataSeriesMetaDAO(); 
     dataSeriesMetaDAO.setManager(ioConfigurationDAO.getManager()); 
     if (!dataSeriesMetaDAO.getManager().getTransaction().isActive()) { 
      dataSeriesMetaDAO.getManager().getTransaction().begin(); 
     } 
     for (DataSeriesMeta d : list) { 
      dataSeriesMetaDAO.changeName(d.getDataSeriesMetaId(), value); 
     } 
     dataSeriesMetaDAO.getManager().getTransaction().commit(); 
     return Response.status(Response.Status.OK).entity(ioConfig).build(); 
     } 
    }... 
} 

, 나는 항상 null 값을 수신하고 브라우저가 제공됩니다 여기에

는 POST 요청에 대한 코드입니다 이 오류 :

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8080/aigateway/rest/ioconfiguration/1 . (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

내 CORS 필터가 작동하지 않는 것 같습니다.

하지만

http://localhost:8080/aigateway/rest/ioconfiguration/1?data=name:123

에 RESTEasy가에서 POST 요청을 보내고 있다면 그것은 나에게

{"ioConfigurationId":"CH1","active":true,"name":"123","conversionType":"Linear","mInfo":5.93,"bInfo":0.32,"voltageDivide":"/4","sampleRange":"24 Bits","samplePeriod":10,"storeRaw":false,"storeConverted":false,"defaultGraph":"Line","title":"","unit":"","rangeLowerbound":0,"rangeUpperbound":100,"code":"function conversion_CH1 (input) {\n\treturn input;\n}"}

같은 올바른 정보와 함께 200 OK 응답을 줄 것이다 그리고 난 헤더를 확인하실 수 있습니다, 그것은이다 :

X-Powered-By Undertow/1 
Access-Control-Allow-Headers origin, content-type, accept, authorization, Access-Control-Request-Method, Access-Control-Request-Headers 
Server WildFly/10 
Date Mon, 27 Mar 2017 14:41:24 GMT 
Connection keep-alive 
Access-Control-Allow-Origin  * 
Access-Control-Allow-Credentials true 
Content-Type application/json 
Content-Length 357 
Access-Control-Allow-Methods GET, POST, PUT, DELETE, OPTIONS, HEAD 
Access-Control-Max-Age 1209600 

내가 CORS 필터에 추가 한 것은 그것이 RESTeasy에서 작동하지만 n 내 프로젝트에서 오히려 이상 하네, 왜 그런지 모르겠다.

@Provider 
public class CORSFilter implements ContainerResponseFilter { 

    @Override 
    public void filter(final ContainerRequestContext requestContext, 
     final ContainerResponseContext cres) throws IOException { 
    cres.getHeaders().add("Access-Control-Allow-Origin", "*"); 
    cres.getHeaders().add("Access-Control-Allow-Credentials", "true"); 
    cres.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); 
    cres.getHeaders().add("Access-Control-Max-Age", "1209600"); 
    cres.getHeaders().add("Access-Control-Allow-Headers", 
     "origin, content-type, accept, authorization, Access-Control-Request-Method, Access-Control-Request-Headers"); 
    } 

} 

의 web.xml : 좀 더 자세한 정보가 필요하면

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0"> 
    <display-name>servlet 3.0 Web Application</display-name> 
    <context-param> 
     <param-name>resteasy.providers</param-name> 
     <param-value> 
       com.sensorhound.aigateway.ws.filters.CORSFilter 
     </param-value> 
    </context-param> 
    <servlet> 
     <servlet-name>ServletContainer</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
     <init-param> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>com.sensorhound.things.rest.ThingsApplication</param-value> 
     </init-param> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>ServletContainer</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

, 내가 공유 기꺼이

은 자세한 내용을 보려면 여기를 내 CORS 필터를 설정하는 방법입니다.

감사합니다.

편집 :

는 NRN에 따르면, 나는-제어 - 허용 - 자격 증명 액세스 내 CORS 필터에 필드를 을 제거했지만 여전히 작동하지 않습니다. 요청 헤더 : 여기

내 브라우저의 네트워크 콘솔에서 요청 헤더입니다 동의 */* 여기에
Accept-Encoding gzip, deflate 
Accept-Language en-US,en;q=0.5 
Connection keep-alive 
Content-Length 18 
Content-Typet ext/plain 
Host localhost:8080 
Origin null 
User-Agent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0 

는 응답 헤더입니다 : 응답 헤더 :

Connection keep-alive 
Content-Length 9437 
Content-Type text/html;charset=UTF-8 
Date Tue, 28 Mar 2017 21:16:46 GMT 

답변

-1

여기에 2 가지 문제가 있습니다. 당신이 withCredentials이없는 JQuery와 클라이언트 요청에

  1. 속성이 true로 설정되어 있지만 서버는 실제 액세스 제어 - 허용 - 자격 증명을 응답하도록 노력하고있다. 이것을 아약스 호출에 넣으십시오. xhrFields : { withCredentials : 사실 }

  2. 당신이 액세스 제어 - 허용 - 자격 증명 설정 "true"로, 당신은 "*"로 액세스 제어 - 허용 - 원산지를 가질 수있다. 와일드 카드가 아닌 특정 출처를 지정해야합니다. 자세한 내용 여기

+0

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials 안녕, NRN, 당신의 의견을 주셔서 감사합니다. 내 필터에서 "Access-Control-Allow-Credentials"필드를 제거했습니다. 그러나 그것은 여전히 ​​효과가 없었습니다. EDIT의 요청 헤더 및 응답 헤더에 대한 자세한 정보를 제공하고 시간이 있는지 살펴보십시오. 감사! – LebroNan

관련 문제