泽西跨域请求

时间:2015-06-22 07:58:48

标签: java jersey cors basic-authentication

我正在使用jersey 2.18来开发rest api。 (使用tomcat容器)

我想允许从其他域访问客户端。

所以我在代码下面尝试允许跨域请求。

过滤

public class MyCorsFilter implements Filter {

    public MyCorsFilter() { }

    public void init(FilterConfig fConfig) throws ServletException { }

    public void destroy() { }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException  {
      ((HttpServletResponse)response).addHeader("Access-Control-Allow-Origin", "*");
        chain.doFilter(request, response);
    }
}

的web.xml

<filter>
    <filter-name>MyCorsFilter</filter-name>
    <filter-class>MyCorsFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>MyCorsFilter</filter-name>
    <url-pattern>/api/*</url-pattern>
</filter-mapping>

上面的代码正常工作,直到我添加HTTP基本身份验证。

当我添加基本身份验证时,我收到以下错误:

No 'Access-Control-Allow-Origin' header is present on the requested resource.

当使用开发人员工具检查标题时,我发现以下内容:

enter image description here

请注意,执行OPTIONS方法时出错。 (我正在使用GET方法)

任何有关如何添加允许CORS和基本HTTP身份验证的建议都将受到赞赏。

3 个答案:

答案 0 :(得分:0)

您可以在web.xml中使用Catalina CORS过滤器配置,如下所示 -

    <filter>
        <filter-name>CorsFilter</filter-name>
        <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CorsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

答案 1 :(得分:0)

Puneet是对的。

请注意,您可能需要设置一些参数,即:

  • cors.allowed.origins
  • cors.allowed.methods
  • cors.allowed.headers
  • cors.exposed.headers

答案 2 :(得分:0)

实际上,浏览器使用http请求方法“选项”在您的执行请求之前发出预检请求。因此您必须向此请求发送200 OK并允许跨域标头,如

 httpResponse.setHeader("Access-Control-Allow-Origin", "*");
    httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE,PUT");
    httpResponse.setHeader("Access-Control-Max-Age", "3600");
    httpResponse.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization, Content-Type");
    if(httpRequest.getMethod().equals("OPTIONS")){
        httpResponse.setStatus(HttpServletResponse.SC_ACCEPTED);
        return;
    }

您可以在http://enable-cors-org/

找到更多信息