it-swarm.com.de

Setzen Sie den CORS-Header in Tomcat

Ich hatte eine statische Website bei Tomcat.

So legen Sie einen Header für meine Website fest: Access-Control-Allow-Origin: *

Sie sind alle statische Dateien, keine Servlet-Anwendungen.

33
Dozer

Wenn es sich um eine statische Site handelt, können Sie das CORS-Verhalten ab Tomcat 7.0.41 einfach über ein integrierter Filter steuern.

Das einzige, was Sie tun müssen, ist, den globalen web.xml In CATALINA_HOME/conf Zu bearbeiten und die Filterdefinition hinzuzufügen:

 <! - ================= Eingebaute Filterdefinitionen =================== == -> 
 
 ... 
 
 <filter> 
 <filtername> CorsFilter </ filtername> 
 <filter-class> org.Apache.catalina.filters.CorsFilter </ filter-class> 
 </ filter> 
 <filter-mapping> 
 <filter- name> CorsFilter </ filter-name> 
 <url-pattern>/* </ url-pattern> 
 </ filter-mapping> 
 
 <! - ==================== Eingebaute Filterzuordnungen ===================== > 
 

Beachten Sie jedoch, dass Firefox Access-Control-Allow-Origin: * Und Anfragen mit Zugangsdaten (Cookies) nicht mag: Bei der Beantwortung einer Anfrage mit Zugangsdaten muss der Server eine Domain angeben. und kann keine Platzhalter verwenden.

64
Johannes Jander

Hier ist ein sehr einfacher Filter, der die CORS-Header hinzufügt. Beachten Sie, dass hierdurch standardmäßig alle Domänen und Methoden aktiviert werden, sodass Sie sie an Ihre Anforderungen anpassen sollten.

Es muss auch der erste Filter in Ihrer web.xml sein.

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 {

    }

}
12
Federico Raggi

Sie müssen ein Filter hinzufügen, um den zusätzlichen Header hinzuzufügen und ihn für alle Pfade zu konfigurieren

<filter>
  <filter-name>header</filter-name>
  <filter-class>...</filter-class>
</filter>
<filter-mapping>
  <filter-name>header</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
3
shyam