【问题标题】:Jetty Cross Origin Filter码头跨源过滤器
【发布时间】:2012-01-08 08:15:34
【问题描述】:

我已经配置了 Jetty 的跨域过滤器,但我仍然收到以下错误。有谁知道出了什么问题以及如何解决?错误消息下方是我的覆盖描述符(即补充 web.xml)

错误:

Origin http://localhost:8090 is not allowed by Access-Control-Allow-Origin.

覆盖描述符:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
 <filter>
   <filter-name>cross-origin</filter-name>
   <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
   <init-param>
       <param-name>allowedOrigins</param-name>
       <param-value>*</param-value>
   </init-param>
   <init-param>
       <param-name>allowedMethods</param-name>
       <param-value>*</param-value>
   </init-param>
   <init-param>
       <param-name>allowedHeaders</param-name>
       <param-value>*</param-value>
   </init-param>
 </filter>
 <filter-mapping>
     <filter-name>cross-origin</filter-name>
     <filter-pattern>/*</filter-pattern>
 </filter-mapping>
</web-app>

请求标头

Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:Origin, Content-Type, Accept
Access-Control-Request-Method:POST
Connection:keep-alive
Host:localhost:8080
Origin:http://localhost:8090
Referer:http://localhost:8090/home
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.8 (KHTML, like Gecko) Chrome/17.0.942.0

响应标头

Allow:POST,GET,OPTIONS,HEAD
Content-Length:0
Date:Wed, 30 Nov 2011 02:13:21 GMT
Server:Jetty(7.5.4.v20111024)

【问题讨论】:

  • 您可以使用像 Wireshark 这样的工具来显示正在交换的实际请求/响应标头吗?这将有助于验证是否发送了正确的 CORS 标头。
  • @monsur:我添加了请求/响应标头详细信息。响应头不包含access-control-allow-origin: *
  • 嗯,不确定。您可以检查日志以查看过滤器是否正在记录任何内容?过滤器设置了一个记录器:download.eclipse.org/jetty/stable-7/xref/org/eclipse/jetty/…
  • @monsur:过滤器似乎没有记录任何内容。使用以下命令:mvn jetty:run &amp;&gt; ~/mvn-jetty.log,我将 stdout 和 stderr 重定向到日志文件。我搜索了日志文件,没有提到跨源过滤器。

标签: java ajax cross-domain jetty cors


【解决方案1】:

阿罗哈,

我也为此奋斗了一段时间,发现最终节点需要是:

<filter-mapping>
    <filter-name>cross-origin</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

不是

<filter-mapping>
     <filter-name>cross-origin</filter-name>
     <filter-pattern>/*</filter-pattern>
</filter-mapping>

这是我找到的对我有帮助的链接:wiki.eclipse.org/Jetty/Feature/Cross_Origin_Filter

在我更新了 web.xml 文件并重新启动了码头服务器后,我能够使用 jQuery ajax 调用进行跨域请求。

罗伯

【讨论】:

【解决方案2】:

我在对部署到 GAE 的 Web 应用程序进行跨域调用时遇到了这个问题。您可以在 Servlet 响应中添加显式标头,例如:

public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException 
{
    res.addHeader("Access-Control-Allow-Origin", "*");
    ...
}

并确保您的 WAR 根目录中有一个 crossdomain.xml 策略文件,例如:

<cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFile.xsd">
<allow-access-from domain="*"/>
</cross-domain-policy> 

HTH。

【讨论】:

    【解决方案3】:

    我在 Jetty Web 服务器中的 ActiveMQ Ajax 遇到了同样的问题。我的问题是,允许的标头 字段不接受“*”形式的通配符

    为了让 ActiveMQ Ajax 工作,我还必须将“选项”方法添加到 allowedMethods。

    来自 web.xml 的跨域过滤器:

    <filter>
       <filter-name>cross-origin</filter-name>
       <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
       <init-param>
           <param-name>allowedOrigins</param-name>
           <param-value>*</param-value>
       </init-param>
       <init-param>
           <param-name>allowedMethods</param-name>
           <param-value>GET,POST,OPTIONS,DELETE,PUT,HEAD</param-value>
       </init-param>
       <init-param>
           <param-name>allowedHeaders</param-name>
           <param-value>origin, content-type, accept, authorization</param-value>
       </init-param>
     </filter>
     <filter-mapping>
         <filter-name>cross-origin</filter-name>
         <url-pattern>*</url-pattern>
     </filter-mapping>
    

    【讨论】:

      【解决方案4】:

      对我来说(jetty-version 8.1.5.v20120716)只有“web.xml”中的这些行有帮助:

      <filter>
          <filter-name>cross-origin</filter-name>
          <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
          <init-param>
              <param-name>allowedOrigins</param-name>
              <param-value>*</param-value>
          </init-param>
          <init-param>
              <param-name>allowedMethods</param-name>
              <param-value>GET,POST,DELETE,PUT,HEAD</param-value>
          </init-param>
          <init-param>
              <param-name>allowedHeaders</param-name>
              <param-value>origin, content-type, accept</param-value>
          </init-param>
      </filter>
      <filter-mapping>
          <filter-name>cross-origin</filter-name>
         <url-pattern>/*</url-pattern>
      </filter-mapping>
      

      我已将日志级别更改为 DEBUG 并从码头控制台日志中获取信息(如 'GET、POST、DELETE、PUT、HEAD' 和 'origin、content-type、accept')。例如:

      DEBUG CrossOriginFilter:359 - 方法 DELETE 属于允许的方法 [GET, POST, DELETE, PUT, HEAD] 19:14:28,413

      DEBUG CrossOriginFilter:389 - 标题 [origin, content-type, accept] 不在允许的标题 [*] 中

      然后我用 $.ajax({url:'anotherHost', type:'DELETE', ..}) 检查结果

      【讨论】:

        【解决方案5】:

        浪费了我很多时间后刚刚打开了一个错误报告:

        https://bugs.eclipse.org/bugs/show_bug.cgi?id=384847

        还要注意,参数值中的通配符大多不受支持。 (即允许的标题)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-04-17
          • 2013-01-05
          • 2012-10-08
          • 2011-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-28
          相关资源
          最近更新 更多