2013-05-23 32 views
11

Yêu cầu Jersey của tôi CORS không hoạt động đối với POST, nhưng hoạt động cho các yêu cầu GET. Các tiêu đề đang được ánh xạ tới các yêu cầu Jersey như được hiển thị trong ảnh chụp màn hình dưới đây của yêu cầu GET đến cùng một tài nguyên.Jersey CORS hoạt động cho GET nhưng không POST

Tuy nhiên, làm một POST để các phương pháp dưới đây khiến tôi kết thúc với XMLHttpRequest cannot load http://production.local/api/workstation. Origin http://workstation.local:81 is not allowed by Access-Control-Allow-Origin.

Dưới đây là một ảnh chụp màn hình của hoạt động mạng: enter image description here

Chi tiết về yêu cầu POST thất bại: enter image description here

Đây là tài nguyên của tôi:

@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 My lọc:

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; 
    } 
} 
cấu hình

My Jersey trong lớp học chính của tôi:

//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

Chính sách gốc tương tự? –

+0

@SotiriosDelimanolis - Có, và tôi đã cho phép xuất xứ chéo. Điều đó có nên cho phép chức năng này hoạt động chính xác không? – Webnet

+0

Không biết đủ về môi trường, chỉ cần chỉ ra những điều bạn nghĩ đến. Có thể bạn đã bỏ lỡ điều gì đó. –

Trả lời

3

Trong khi tôi nghĩ rằng đây là một vấn đề CORS, hóa ra đó là một vấn đề Jersey ...

org.glassfish.grizzly.servlet.ServletHandler trên đường dây 256 xử lý một ngoại lệ ...

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

Trong log của tôi, tất cả tôi xem là service exception: không có gì sau đó. Khi tôi gỡ lỗi dòng này, tôi sẽ thấy lỗi 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), điều này mang lại cho tôi thứ mà tôi thực sự có thể làm việc.

1

Thật khó để nói và khó có thể gỡ lỗi vì đó là trình duyệt rằng tạo ra lỗi đó khi kiểm tra phản hồi (tiêu đề).

Ngay cả khi kiểm tra rất chặt chẽ, mã của bạn có vẻ tốt và lành mạnh ngoại trừ Access-Control-Allow-Headers hoặc có thể được đặt hai lần trong filter(). Trong khi RFC 2616 (HTTP 1.1) Section 4.2 về cơ bản cho phép nó cho một số điều kiện được đáp ứng tôi sẽ không đánh bạc ở đây. Bạn không thể kiểm soát cách trình duyệt X phiên bản N xử lý việc này.

Thay vì đặt cùng một tiêu đề hai lần với các giá trị khác nhau thay vì thêm bộ giá trị thứ 2 vào tiêu đề hiện tại.

+0

Tôi đã thực hiện thay đổi đó, thật không may là nó không giải quyết được sự cố – Webnet

+0

Nếu bạn có thể thấy tôi gãi đầu .... hành vi có nhất quán trên tất cả các trình duyệt chính không? Bất kỳ cơ hội nào bạn có thể bật tính năng ghi nhật ký gỡ lỗi trong một trong số chúng, ví dụ: [Chrome] (http://www.chromium.org/for-testers/enable-logging)? –

+0

Tôi chưa bao giờ sử dụng nhật ký gỡ lỗi của Chrome trước đây. Tôi sẽ điều tra điều đó. Chrome là trình duyệt duy nhất tôi hỗ trợ - đó là ứng dụng nội bộ được sử dụng trong công ty. – Webnet

Các vấn đề liên quan