【问题标题】:jersey cross domain requestjersey 跨域请求
【发布时间】:2015-09-07 14:18:51
【问题描述】:

我正在使用 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.

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

请注意,错误发生在执行OPTIONS 方法时。 (我用的是GET方法)

任何关于如何通过基本 HTTP 身份验证添加允许 CORS 的建议将不胜感激。

【问题讨论】:

    标签: java jersey cors basic-authentication


    【解决方案1】:

    您可以在 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>
    

    【讨论】:

      【解决方案2】:

      Puneet 是对的。

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

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

      【讨论】:

        【解决方案3】:

        实际上,浏览器会在您使用 http 请求方法 "options" 的实际请求之前发出预检请求。所以你必须向这个请求发送 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/找到更多信息

        【讨论】:

          猜你喜欢
          • 2015-04-07
          • 1970-01-01
          • 2016-10-23
          • 2017-06-15
          • 2013-03-06
          • 2019-12-01
          相关资源
          最近更新 更多