Java 在Jersey REST API中为CORS配置Web.xml

Java 在Jersey REST API中为CORS配置Web.xml,java,rest,jersey-2.0,Java,Rest,Jersey 2.0,我已经创建了RESTWeb服务,并希望启用CORS。 我已经在API的代码中添加了以下代码 package RestClient; import java.io.IOException; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerRespons

我已经创建了RESTWeb服务,并希望启用CORS。 我已经在API的代码中添加了以下代码

package RestClient;

import java.io.IOException;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.MultivaluedMap;

public class CORSResponseFilter
implements ContainerResponseFilter {

    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
            throws IOException {

        MultivaluedMap<String, Object> headers = responseContext.getHeaders();

        headers.add("Access-Control-Allow-Origin", "*");        
        headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");          
        headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia");
    }



}
package-RestClient;
导入java.io.IOException;
导入javax.ws.rs.container.ContainerRequestContext;
导入javax.ws.rs.container.ContainerResponseContext;
导入javax.ws.rs.container.ContainerResponseFilter;
导入javax.ws.rs.core.MultivaluedMap;
公共类CORSResponseFilter
实现ContainerResponseFilter{
公共无效筛选器(ContainerRequestContext requestContext、ContainerResponseContext responseContext)
抛出IOException{
多值映射头=responseContext.getHeaders();
headers.add(“访问控制允许原点”、“*”);
添加(“访问控制允许方法”、“获取、发布、删除、放置”);
headers.add(“访问控制允许头”、“X-request-With、内容类型、X-Codingpedia”);
}
}
为了便于访问,我需要在web.xml文件中设置上述类。这是我的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
  <display-name>GenerateToken</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
<servlet-name>JAVA WS</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

<init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>RestClient</param-value>
</init-param>
<init-param>
    <param-name>org.glassfish.jersey.servlet.ContainerResponseFilters</param-name>
    <param-value>RestClient.CORSResponseFilter</param-value>
</init-param>       
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>JAVA WS</servlet-name>
    <url-pattern>/Test/*</url-pattern>
</servlet-mapping>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>GenerateToken</web-resource-name>
        <url-pattern>/Test/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>
</web-app>

发电站
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
JAVA WS
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
RestClient
org.glassfish.jersey.servlet.ContainerResponseFilters
RestClient.CORSResponseFilter
1.
JAVA WS
/试验/*
发电站
/试验/*
保密的
我只是想知道,我是否为CORS配置了正确的web.xml文件?在我的本地环境中,它可以正常工作,但在我为每个人部署它之前,我只想确定它是否正确

有人能给你一些建议吗?

你不需要这个(甚至都不正确)


谢谢分享。你能澄清我的一个疑问吗?我想知道,请求如何首先到达允许跨平台访问的CORSResponseFilter类,然后到达我的api代码类令牌。。。?我的意思是谁把他们一个接一个地带去上课(按优先顺序)。因为在web.xml中,只写包名,包名可以包含多个类。就像在我的例子中,它是两个一个用于API的代码,第二个是在问题中提到的。。!(如果我的问题没有任何意义,请麻烦)浏览器将向服务器发出选项请求,并且不会浏览资源。它将直接进入过滤器。这是实际请求之前的飞行前请求。当浏览器获得标题时,它将发送真正的请求,该请求将到达您的资源。资源用完后,再次点击过滤器OK..在飞行前请求中,它进入过滤器。在我的例子中,它是CORSResponseFilter,那么该请求如何知道它需要作为filter方法中的一个参数。第二,在filter方法中作为参数放置之后,没有返回类型(Void)。那么,如何以及谁将响应发送回客户机(调用者)?Jersey调用filter方法并将上下文和飞行前请求的响应发送回客户机。。。?
<init-param>
    <param-name>org.glassfish.jersey.servlet.ContainerResponseFilters</param-name>
    <param-value>RestClient.CORSResponseFilter</param-value>
</init-param> 
<init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>RestClient</param-value>
</init-param>