2016-07-07 9 views
1

ドメイン間要求を許可するためにtomcatにCORSフィルタを実装しようとしています。私たちは、2つの異なる風袋(異なるマシン)に2つのGWTプロジェクトを持っています。 CORSフィルタ文書CORSを読んだ後、私はtomcatのweb.xmlファイルにCORSフィルタを追加しました。要求されたリソースにGWT-No 'Access-Control-Allow-Origin'ヘッダーが存在します

`<filter> 
    <filter-name>CorsFilter</filter-name> 
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> 
    <init-param> 
    <param-name>cors.allowed.origins</param-name> 
    <param-value>*</param-value> 
    </init-param> 
    <init-param> 
    <param-name>cors.allowed.methods</param-name> 
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value> 
    </init-param> 
    <init-param> 
    <param-name>cors.allowed.headers</param-name> 
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> 
    </init-param> 
    <init-param> 
    <param-name>cors.exposed.headers</param-name> 
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value> 
    </init-param> 
    <init-param> 
    <param-name>cors.support.credentials</param-name> 
    <param-value>true</param-value> 
    </init-param> 
    <init-param> 
    <param-name>cors.preflight.maxage</param-name> 
    <param-value>10</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>CorsFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping>` 

しかし、それは動作しません。私はそれに関連するもう一つのスタックの質問を持っていますが、GWTでフィルタを実装する方法はちょっと混乱していますか?

StackQues

GWT WITH CORSのフィルタを実現する実際の手順は何ですか?

答えて

1

Filterを拡張して、次のようにサーバー側にクラスを追加してください。
注:これはあなたのための簡単な例です。あなたはそれを正しい方法を設定いけない場合
はいけない、あなたのWARファイル内(あなたのweb.xmlにFilterを追加しないことを忘れthis article

public class CORSFilter implements Filter { 
    // For security reasons set this regex to an appropriate value 
    // example: ".*example\\.com" 
    private static final String ALLOWED_DOMAINS_REGEXP = ".*"; 

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, 
      FilterChain filterChain) throws IOException, ServletException { 

     HttpServletRequest req = (HttpServletRequest) servletRequest; 
     HttpServletResponse resp = (HttpServletResponse) servletResponse; 

     String origin = req.getHeader("Origin"); 
     if (origin != null && origin.matches(ALLOWED_DOMAINS_REGEXP)) { 
      resp.addHeader("Access-Control-Allow-Origin", origin); 
      if ("options".equalsIgnoreCase(req.getMethod())) { 
       resp.setHeader("Allow", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS"); 
       if (origin != null) { 
        String headers = req.getHeader("Access-Control-Request-Headers"); 
        String method = req.getHeader("Access-Control-Request-Method"); 
        resp.addHeader("Access-Control-Allow-Methods", method); 
        resp.addHeader("Access-Control-Allow-Headers", headers); 
        // optional, only needed if you want to allow cookies. 
        resp.addHeader("Access-Control-Allow-Credentials", "true"); 
        resp.setContentType("text/x-gwt-rpc"); 
       } 
       resp.getWriter().flush(); 
       return; 
      } 
     } 

     // Fix ios6 caching post requests 
     if ("post".equalsIgnoreCase(req.getMethod())) { 
      resp.addHeader("Cache-Control", "no-cache"); 
     } 

     if (filterChain != null) { 
      filterChain.doFilter(req, resp); 
     } 
    } 

    @Override 
    public void destroy() { 
    } 

    @Override 
    public void init(FilterConfig arg0) throws ServletException { 
    } 
} 

の最後の部分をチェックし...セキュリティ上のリスクについて自分自身を知らせますtomcat web.xml)ファイル。

<filter> 
    <filter-name>corsFilter</filter-name> 
    <filter-class><YourProjectPath>.CORSFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>corsFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

サーブレットとマッピングをwebappプロジェクトに配置しました。しかし、依然としてNo 'Access-Control-Allow-Origin'ヘッダーのエラーが要求されたリソース上に存在します。 –

+0

サービスを実装しているプロジェクトに配置しましたか?デバッグしようとすると、なぜその要求を許可していない参照してください – Tobika

+0

あなたの助けをもう一度おねがいします。 –

関連する問題