解决apache cxf REST Web服务的“ Access-Control-Allow-Origin”问题(无Spring)

问题描述 投票:0回答:1

[从Vuejs前端调用REST API给出了“从来源###在###处对XMLHttpRequest的访问已被CORS策略阻止:所请求的资源上没有'Access-Control-Allow-Origin'标头。”没有Spring,我找不到特定于Apache-cxf的解决方案。大多数解决方案适用于球衣或春季。

我尝试将@CrossOriginResourceSharing批注与allowAllOrigins = true一起使用。还尝试使用带有@Provider注释的ContainerResponseFilter过滤器设置标头

public class MyApplication extends Application {
   private Set<Object> singletons = new HashSet<Object>();
   private Set<Class<?>> empty = new HashSet<Class<?>>();

   public MyApplication() {
      //singletons.add(CorsFilter.class);
      singletons.add(new OrderReceiver());
   }

   @Override
   public Set<Class<?>> getClasses() {
      return empty;
   }

   @Override
   public Set<Object> getSingletons() {
      return singletons;
   }
}
----------------------------------------------------------------------
@Path("/orders")
@CrossOriginResourceSharing(
        allowAllOrigins = true,
        allowCredentials = true, 
        maxAge = 1209600 )
public class OrderReceiver {
    private Map<Integer, EventItem> eventList = new ConcurrentHashMap<Integer, EventItem>();
    private AtomicInteger idCounter = new AtomicInteger();

    public OrderReceiver() {
    }

    // This maps to http post request. Its used to add a new item
    // The incoming request is in XML but it is converted to Shopping cart java
    // object by JAXB and this method gets the same object. The @Consumes
    // annotation
    // signifies that the incoming request type is in XML format.
    @POST
    @Consumes(MediaType.APPLICATION_XML)
    public Response addItem(EventItem item) {
        item.setId(idCounter.incrementAndGet());
        eventList.put(item.getId(), item);
        System.out.println("Created Event " + item.getId());
        return Response.status(200)
                .entity("Event with id " + item.getId() + " created").build();
    }

    // This maps to http get request. Its used to get an item
    // The returning object is marshaled to XML by JAXB.
    @GET
    @Path("{id}")
    @Produces(MediaType.APPLICATION_XML)
    public EventItem getItem(@PathParam("id") int id) {
        EventItem item = eventList.get(id);
        if (item == null) {
            throw new WebApplicationException(Response.Status.NOT_FOUND);
        }
        System.out.println("Getting Event " + item.getId());
        return item;
    }

    @GET
    @Path("/total")
    @Produces(MediaType.TEXT_HTML)
    public Integer getTotalEvents() {
        Integer size = eventList.size();
        System.out.println("Total Events: " + size);
        return size;
    }

    // This maps to http put request. Its used to update an item
    // XML is deserialized to ShoppingItem object
    @PUT
    @Consumes(MediaType.APPLICATION_XML)
    public Response updateItem(EventItem itemToUpdate) {
        EventItem currentItem = eventList.get(itemToUpdate.getId());
        if (currentItem == null)
            throw new WebApplicationException(Response.Status.NOT_FOUND);
        System.out.println("Updating Event " + currentItem.getId());
        currentItem.setTarget(itemToUpdate.getTarget());
        currentItem.setAquirer(itemToUpdate.getAquirer());
        currentItem.setAnnounceDate(itemToUpdate.getAnnounceDate());
        return Response.status(200)
                .entity("Event with id " + currentItem.getId() + " updated")
                .build();
    }

    // This maps to http delete request. It is used to delete an item
    // The returning object is serialized to XML
    @DELETE
    @Path("{id}")
    @Produces(MediaType.APPLICATION_XML)
    public EventItem deleteItem(@PathParam("id") int id) {
        if (!eventList.containsKey(id))
            throw new WebApplicationException(Response.Status.NOT_FOUND);
        EventItem deletedItem = eventList.remove(id);
        System.out.println("Removed Event " + deletedItem.getId());
        return deletedItem;
    }
}
-----------------------------------------------------------------------
@Provider
public class CorsFilter implements ContainerResponseFilter {


    public void filter(ContainerRequestContext requestContext, 
      ContainerResponseContext responseContext) throws IOException {
          responseContext.getHeaders().add(
            "Access-Control-Allow-Origin", "*");
          responseContext.getHeaders().add(
            "Access-Control-Allow-Credentials", "false");
          responseContext.getHeaders().add(
           "Access-Control-Allow-Headers",
           "origin, content-type, accept, authorization");
          responseContext.getHeaders().add(
            "Access-Control-Allow-Methods", 
            "GET, POST, PUT, DELETE, OPTIONS, HEAD");
    }
}
---------------------------------------------------------------------------
<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <servlet>
        <servlet-name>rest</servlet-name>
        <servlet-class>
            org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet
        </servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.ssrapp.service.MyApplication
            </param-value>
        </init-param>
    <!--  <init-param>
            <param-name>javax.ws.rs.container.ContainerResponseFilter</param-name>
            <param-value>com.ssrapp.service.CorsFilter</param-value>
        </init-param> -->   
    </servlet>
    <servlet-mapping>
        <servlet-name>rest</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>
rest cors cxf
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.