2013-05-23 4 views
11

माई जर्सी CORS अनुरोध POST के लिए काम नहीं कर रहा है, लेकिन जीईटी अनुरोधों के लिए काम करता है। हेडर को जर्सी अनुरोधों में मैप किया जा रहा है जैसा कि एक ही संसाधन के लिए जीईटी अनुरोध के नीचे दिए गए स्क्रीनशॉट में दिखाया गया है। में विफल रहा है पोस्ट अनुरोध पर enter image description hereजर्सी सीओआरएस जीईटी के लिए काम कर रहा है लेकिन पोस्ट नहीं

विवरण:: enter image description here

हालांकि, नीचे दी गई विधि करने के लिए एक पोस्ट कर मुझे XMLHttpRequest cannot load http://production.local/api/workstation. Origin http://workstation.local:81 is not allowed by Access-Control-Allow-Origin.

साथ अंत में आता है यहाँ नेटवर्क गतिविधि का एक स्क्रीनशॉट

यहां मेरा संसाधन है:

@Path("/workstation") 
@Consumes({MediaType.APPLICATION_JSON}) 
@Produces({MediaType.APPLICATION_JSON}) 
public class WorkstationResource { 

    @InjectParam 
    WorkstationService workstationService; 

    @POST 
    public WorkstationEntity save (WorkstationEntity workstationEntity) { 
     workstationService.save(workstationEntity); 
     return workstationEntity; 
    } 

    @GET 
    @Path("/getAllActive") 
    public Collection<WorkflowEntity> getActive() { 
     List<WorkflowEntity> workflowEntities = new ArrayList<WorkflowEntity>(); 
     for(Workflow workflow : Production.getWorkflowList()) { 
      workflowEntities.add(workflow.getEntity()); 
     } 
     return workflowEntities; 
    } 
} 

मेरे CORS फिल्टर:

public class ResponseCorsFilter implements ContainerResponseFilter { 

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

     Response.ResponseBuilder responseBuilder = Response.fromResponse(response.getResponse()); 
     responseBuilder 
       .header("Access-Control-Allow-Origin", "*") 
       .header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, HEAD"); 

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

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

     response.setResponse(responseBuilder.build()); 

     return response; 
    } 
} 
मेरी मुख्य वर्ग में

मेरे जर्सी विन्यास:

//add jersey servlet support 
ServletRegistration jerseyServletRegistration = ctx.addServlet("JerseyServlet", new SpringServlet()); 
jerseyServletRegistration.setInitParameter("com.sun.jersey.config.property.packages", "com.production.resource"); 
jerseyServletRegistration.setInitParameter("com.sun.jersey.spi.container.ContainerResponseFilters", "com.production.resource.ResponseCorsFilter"); 
jerseyServletRegistration.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", Boolean.TRUE.toString()); 
jerseyServletRegistration.setInitParameter("com.sun.jersey.config.feature.DisableWADL", Boolean.TRUE.toString()); 
jerseyServletRegistration.setLoadOnStartup(1); 
jerseyServletRegistration.addMapping("/api/*"); 
+0

वही मूल नीति? –

+0

@SotiriosDelimanolis - हाँ, और मैंने क्रॉस उत्पत्ति की अनुमति दी है। क्या यह सही तरीके से काम करने की अनुमति नहीं देनी चाहिए? – Webnet

+0

पर्यावरण के बारे में पर्याप्त जानकारी नहीं है, बस उन चीजों को इंगित करें जो दिमाग में आते हैं। शायद आप कुछ याद किया। –

उत्तर

3

जबकि मुझे लगा कि यह एक CORS मुद्दा था, सब मैं पता चला है कि यह एक जर्सी मुद्दा था ...

org.glassfish.grizzly.servlet.ServletHandler लाइन 256 पर एक अपवाद संभालती है ...

FilterChainInvoker filterChain = getFilterChain(request); 
    if (filterChain != null) { 
     filterChain.invokeFilterChain(servletRequest, servletResponse); 
    } else { 
     servletInstance.service(servletRequest, servletResponse); 
    } 
} catch (Throwable ex) { 
    LOGGER.log(Level.SEVERE, "service exception:", ex); 
    customizeErrorPage(response, "Internal Error", 500); 
} 

मेरी लॉग में, देखें service exception: इसके बाद कुछ भी नहीं है। जब मैं इस लाइन को डीबग करता हूं, तो मैं त्रुटि javax.servlet.ServletException: org.codehaus.jackson.map.JsonMappingException: Conflicting setter definitions for property "workflowProcess": com.production.model.entity.WorkstationEntity#setWorkflowProcess(1 params) vs com.production.model.entity.WorkstationEntity#setWorkflowProcess(1 params) देखता हूं जो मुझे कुछ देता है जो मैं वास्तव में काम कर सकता हूं।

1

इसके बाद से यह ब्राउज़र है डिबग करने के लिए बताना मुश्किल और मुश्किल है कि प्रतिक्रिया (हेडर) का निरीक्षण करने पर उस त्रुटि का उत्पादन करता है।

बहुत करीब निरीक्षण पर भी आपका कोड ठीक दिखता है और Access-Control-Allow-Headers को छोड़कर filter() में दो बार सेट किया जा सकता है। जबकि RFC 2616 (HTTP 1.1) Section 4.2 मूल रूप से इसे अनुमति देता है, कुछ शर्तों को पूरा किया जाता है, मैं यहां जुआ नहीं करता हूं। ब्राउज़र एक्स संस्करण एन इस पर कैसे संभालता है इस पर आपका कोई नियंत्रण नहीं है।

एक ही शीर्षलेख को अलग-अलग मानों के साथ दो बार सेट करने के बजाय मौजूदा शीर्षलेख में मानों का दूसरा सेट संलग्न करें।

+0

मैंने यह परिवर्तन किया है, दुर्भाग्य से इस मुद्दे को हल नहीं किया – Webnet

+0

यदि आप मुझे मेरे सिर को खरोंच देख सकते हैं .... क्या व्यवहार सभी प्रमुख ब्राउज़रों में संगत है? किसी भी मौके पर आप उनमें से एक में डीबग लॉगिंग सक्षम कर सकते हैं उदा। [क्रोम] (http://www.chromium.org/for-testers/enable-logging)? –

+0

मैंने कभी क्रोम के डीबग लॉगिंग का उपयोग कभी नहीं किया है। मैं इसकी जांच करूंगा। क्रोम एकमात्र ब्राउज़र है जिसका मैं समर्थन कर रहा हूं - यह कंपनी के भीतर उपयोग किया जाने वाला एक आंतरिक अनुप्रयोग है। – Webnet

संबंधित मुद्दे