2013-06-30 2 views
0

Привет, я разрабатываю проект для своей домашней работы. Прежде всего, я знаю, что есть много названий по одной и той же проблеме, я смотрел на многих из них, но я не мог решить эту проблему. Если кто-то может мне помочь, я буду очень доволен.Происхождение localhost: не разрешено Access-Control-Allow-Origin

Мой Аякса вызов:

function submit(name,surname,source,destination,distance,volume,weight,price){ 

var xml_string = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+ "<shippingData><FIRSTNAME>" + name + "</FIRSTNAME>"+ 
        "<LASTNAME>" + surname + "</LASTNAME>"+ 
        "<SOURCECITY>" + source + "</SOURCECITY>"+ 
        "<DESTINATIONCITY>" + destination + "</DESTINATIONCITY>"+ 
        "<DISTANCE>" + distance + "</DISTANCE>"+ 
        "<VOLUME>" + volume + "</VOLUME>"+ 
        "<WEIGHT>" + weight + "</WEIGHT>"+ 
        "<PRICE>" + price + "</PRICE>"+ 
        "</shippingData>"; 





$.ajax({ 
     url: 'http://localhost:8084/ShippingDataService/webresources/generic/post', 
     type: 'POST', 
     data: xml_string, 
     dataType: 'xml', 
     contentType: 'application/xml', 
     success: function (data) { 

      alert("OK"); 

     }, 
     error: function (responseData, textStatus, errorThrown) { 
      alert('POST failed.'); 
     } 
    }); 

}

Я должен использовать XML для передачи данных, в соответствии с правилом моей домашней работы. Моей стороны сервера такова:

@POST 
@Consumes(MediaType.APPLICATION_XML) 
@Produces(MediaType.APPLICATION_XML) 
@Path("post") 
public ShippingData postXML(ShippingData content) { 
    System.out.println("POST"); 

    return content; 
} 

класса Почтового данные:

package ship; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 


@XmlRootElement 
public class ShippingData { 

    public int SID; 

    @XmlElement (name = "FIRSTNAME")public String firstName; 

    @XmlElement (name = "LASTNAME")public String lastName; 

    @XmlElement (name = "SOURCECITY")public String sourceCity; 

    @XmlElement (name = "DESTINATIONCITY")public String destinationCity; 

    @XmlElement (name = "DISTANCE")public int distance; 

    @XmlElement (name = "VOLUME")public int volume; 

    @XmlElement (name = "WEIGHT")public int weight; 

    @XmlElement (name = "PRICE")public int price; 

    public ShippingData() { 

    } 

    public ShippingData(int SID, String firstName, String lastName, String sourceCity, String destinationCity, int distance, int volume, int weight, int price) { 
     this.SID = SID; 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.sourceCity = sourceCity; 
     this.destinationCity = destinationCity; 
     this.distance = distance; 
     this.volume = volume; 
     this.weight = weight; 
     this.price = price; 
    } 



} 

Я также попытался изменить АЯКС URL вызова на 'localhost:8084/ShippingDataService/webresources/generic/post' или '/ShippingDataService/webresources/generic/post', но он не работает. Я получаю предупреждение об ошибке ajax, которое я определил как «POST failed». Итак, как я могу решить эту проблему?

+0

Где ты определить свой заголовок 'Access-Control-Allow-Origin' и каково значение? – rekire

+0

@rekire Я не определял этот заголовок, я не мог понять, где я должен его определить. – Jemo

+0

Что вы используете на стороне сервера? WCF? – rekire

ответ

0

Здравствуйте, я решил проблему так:

В web.xml добавить это между <servlet></servlet>:

<init-param> 
     <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name> 
     <param-value>"YOURPACKAGENAME".ResponseCorsFilter</param-value> 
</init-param> 

И добавить этот класс в пакете

import com.sun.jersey.spi.container.ContainerRequest; 
import com.sun.jersey.spi.container.ContainerResponse; 
import com.sun.jersey.spi.container.ContainerResponseFilter; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.core.Response.ResponseBuilder; 

public class ResponseCorsFilter implements ContainerResponseFilter { 

@Override 
public ContainerResponse filter(ContainerRequest req, ContainerResponse contResp) { 

     ResponseBuilder resp = Response.fromResponse(contResp.getResponse()); 
     resp.header("Access-Control-Allow-Origin", "*") 
       .header("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); 

     String reqHead = req.getHeaderValue("Access-Control-Request-Headers"); 

     if(null != reqHead && !reqHead.equals("")){ 
      resp.header("Access-Control-Allow-Headers", reqHead); 
     } 

     contResp.setResponse(resp.build()); 
      return contResp; 
    } 
}