2011-11-28 19 views
25

Tôi đã định cấu hình bộ lọc gốc của Jetty, nhưng tôi tiếp tục nhận được lỗi sau. Có ai biết những gì là sai và làm thế nào để sửa chữa nó? Dưới đây thông báo lỗi là mô tả ghi đè tôi (tức là web.xml bổ sung)Bộ lọc nguồn gốc Jetty Cross

Lỗi:

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

Override Descriptor:

<!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> 

Tiêu đề yêu cầu

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 

đáp ứng Tiêu đề

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

bạn có thể sử dụng một công cụ như Wireshark để hiển thị tiêu đề request/response thực tế được trao đổi? Điều đó sẽ giúp xác minh xem các tiêu đề CORS chính xác có đang được gửi hay không. – monsur

+0

@monsur: Tôi đã thêm chi tiết tiêu đề yêu cầu/phản hồi. Tiêu đề phản hồi KHÔNG bao gồm 'truy xuất-cho phép-nguồn gốc: *' – Ari

+0

Hmm, không chắc chắn. Bạn có thể kiểm tra nhật ký để xem bộ lọc có ghi nhật ký gì không? Bộ lọc có thiết lập nhật ký: http://download.eclipse.org/jetty/stable-7/xref/org/eclipse/jetty/servlets/CrossOriginFilter.html#77 – monsur

Trả lời

22

Aloha,

tôi đã chiến đấu này cho một lúc là tốt, và phát hiện ra rằng điểm nút cuối cùng cần phải được:

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

KHÔNG

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

H ere là liên kết tôi tìm thấy để giúp tôi: wiki.eclipse.org/Jetty/Feature/Cross_Origin_Filter

Sau khi tôi cập nhật tệp web.xml và khởi động lại máy chủ cầu nối, tôi có thể thực hiện yêu cầu miền chéo bằng cách sử dụng các cuộc gọi jQuery ajax.

Rob

+0

"mẫu lọc" không được chương trình của tôi công nhận, bất kỳ ý tưởng nào được xác định ở đâu? Nó không có trong: xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance" \t xmlns = "http://java.sun.com/xml/ns/javaee" \t xsi: schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" \t phiên bản = "3.0" – perilandmishap

+1

Trong Jetty 9 'allowHeaders' và' allowedMethods', '*' sẽ không hoạt động. –

11

Tôi đã gặp phải điều này khi thực hiện cuộc gọi crossdomain tới các ứng dụng web được triển khai đến GAE. Bạn có thể thêm một tiêu đề rõ ràng để Servlet (s) trả lời của bạn, như:

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

và cũng chắc chắn rằng bạn có một tập tin chính sách crossdomain.xml trong thư mục gốc của WAR của bạn, như:

<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.

2

Chỉ cần mở một báo cáo lỗi sau khi lãng phí rất nhiều thời gian của tôi:

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

Cũng hãy lưu ý một thực tế rằng các kí hiệu trong các giá trị tham số này chủ yếu không được hỗ trợ. (. Tức là tiêu đề cho phép)

4

Đối với tôi (cầu cảng-phiên bản 8.1.5.v20120716) chỉ những dòng này trong 'web.xml' giúp:

<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> 

Tôi đã thay đổi mức độ đăng nhập để DEBUG và nhận được thông tin (như 'GET, POST, DELETE, PUT, HEAD' và 'origin, content-type, accept') từ nhật ký console. Ví dụ.:

DEBUG CrossOriginFilter: 359 - Phương pháp DELETE là một trong những phương pháp cho phép [GET, POST, DELETE, PUT, HEAD] 19: 14: 28.413

DEBUG CrossOriginFilter: 389 - Headers [nguồn gốc, content-type, chấp nhận] là không nằm trong tiêu đề cho phép [*]

Sau đó, tôi đã kiểm tra kết quả với $ .ajax ({url: 'anotherHost', type: 'DELETE', ..})

4

tôi đã có vấn đề tương tự với ActiveMQ Ajax trong Máy chủ Web Jetty. Vấn đề của tôi là, các tiêu đề được phép trường không chấp nhận ký tự đại diện theo dạng "*".

Để nhận ActiveMQ Ajax hoạt động, tôi cũng phải thêm phương thức "Tùy chọn" vào allowMethods.

Cross-Origin Lọc từ 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>