2013-04-30 85 views
25

我有一個由Tomcat託管的靜態網站。在Tomcat中設置CORS標頭

如何設置一個標題爲我的網站,如:Access-Control-Allow-Origin: *

他們都是靜態文件,沒有任何servlet應用。

回答

49

如果它是一個靜態的網站,然後在Tomcat 7.0.41開始,你可以很容易地控制通過一個built-in filter CORS行爲。

相當多,你所要做的就是編輯CATALINA_HOME/conf全球web.xml,並添加過濾器定義的唯一的事:

 
    <!-- ================== Built In Filter Definitions ===================== --> 

     ... 

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

    <!-- ==================== Built In Filter Mappings ====================== --> 

要知道,不過,Firefox不喜歡Access-Control-Allow-Origin: *和要求與憑證(Cookie ):when responding to a credentialed request, server must specify a domain, and cannot use wild carding.

+4

當有人調試時,請注意,CORS頭只有在發生跨源請求時纔會發送。請參閱https://tomcat.apache.org/tomcat-8.0-doc/images/cors-flowchart.png。所以請不要只是檢查隨機呼叫(使用Fiddler,網絡標籤,...),但真正的CORS請求自己。 – koppor 2016-11-23 11:37:57

+0

添加該過濾器後,我仍然得到*預檢請求的響應未通過訪問控制檢查:在請求的資源上沒有「Access-Control-Allow-Origin」標頭。原因'http:// localhost:8080'因此不被允許訪問。該響應具有HTTP狀態碼403 *。另外我的方法實際上是一個GET已被轉換爲OPTION並返回403 – Jerry 2018-01-03 13:46:52

3

您需要添加一個Filter添加額外的頭,配置它的所有路徑

<filter> 
    <filter-name>header</filter-name> 
    <filter-class>...</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>header</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

它只是一個靜態網站,我必須使用servlet? – Dozer 2013-04-30 09:18:30

+0

是的,你不能在Tomcat中沒有'Servlet'或'Filter'來添加頭文件 – shyam 2013-04-30 09:25:28

+2

@Dozer:考慮使用[容器提供的過濾器](http://tomcat.apache.org/tomcat-7.0-doc/config/filter .html)用於最常見的用例。 – 2013-04-30 12:34:24

10

這是一個非常基本的過濾器將添加CORS標頭。請注意,默認情況下,這將啓用所有域和方法,因此您應該對其進行自定義以適合您的需求。

它也需要是您的web.xml中的第一個過濾器。

package com.conductiv.api.listener; 

import javax.servlet.*; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 

public class CORSFilter implements Filter { 
    public void destroy() { 
    } 
    public static String VALID_METHODS = "DELETE, HEAD, GET, OPTIONS, POST, PUT"; 

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { 
     HttpServletRequest httpReq = (HttpServletRequest) req; 
     HttpServletResponse httpResp = (HttpServletResponse) resp; 

     // No Origin header present means this is not a cross-domain request 
     String origin = httpReq.getHeader("Origin"); 
     if (origin == null) { 
      // Return standard response if OPTIONS request w/o Origin header 
      if ("OPTIONS".equalsIgnoreCase(httpReq.getMethod())) { 
       httpResp.setHeader("Allow", VALID_METHODS); 
       httpResp.setStatus(200); 
       return; 
      } 
     } else { 
      // This is a cross-domain request, add headers allowing access 
      httpResp.setHeader("Access-Control-Allow-Origin", origin); 
      httpResp.setHeader("Access-Control-Allow-Methods", VALID_METHODS); 

      String headers = httpReq.getHeader("Access-Control-Request-Headers"); 
      if (headers != null) 
       httpResp.setHeader("Access-Control-Allow-Headers", headers); 

      // Allow caching cross-domain permission 
      httpResp.setHeader("Access-Control-Max-Age", "3600"); 
     } 
     // Pass request down the chain, except for OPTIONS 
     if (!"OPTIONS".equalsIgnoreCase(httpReq.getMethod())) { 
      chain.doFilter(req, resp); 
     } 
} 

    public void init(FilterConfig config) throws ServletException { 

    } 

} 
+0

如何使用這個類?我是否需要在此類中添加我的@Post方法「CORSFilter」 – iambasiljoy 2017-01-13 09:16:24

+0

在您的應用程序中創建此類。然後將此類路徑添加到應用的web.xml中,其中類 標頭 .......... 映射> 標頭 /* iambasiljoy 2017-01-13 09:32:42

+0

完美的解決方案。 – iambasiljoy 2017-01-13 09:34:27