programing

제트 교차 원점 필터

powerit 2023. 3. 4. 15:15
반응형

제트 교차 원점 필터

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)

알로하

잠시 동안 이것과 싸웠더니 마지막 노드는 다음과 같습니다.

<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 파일을 업데이트하고 jetty 서버를 재부팅한 후 jQuery ajax 호출을 사용하여 크로스 도메인 요구를 할 수 있었습니다.

GAE에 배포된 웹 앱에 교차 도메인 통화를 할 때 우연히 발견했습니다.다음과 같이 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

Jetty Web Server 내의 ActiveMQ Ajax에서도 같은 문제가 발생하였습니다.문제는 허용된 헤더 필드가 "*" 형식의 와일드카드를 받아들이지 않는다는 것입니다.

ActiveMQ Ajax를 동작시키려면 allowed Methods에 Options 메서드를 추가해야 합니다.

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>

제트의 경우(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로 변경하고 jetty 콘솔로그에서 정보('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:'another')로 결과를 확인했습니다.호스트', 입력: 'DELETE', ..})

많은 시간을 낭비한 후 버그 보고서를 열었습니다.

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

또한 파라미터 값의 와일드카드는 대부분 지원되지 않습니다(허용 헤더).

언급URL : https://stackoverflow.com/questions/8303162/jetty-cross-origin-filter

반응형