Avevo un sito Web statico ospitato da Tomcat.Imposta intestazione CORS in Tomcat
come impostare un colpo di testa per il mio sito come: Access-Control-Allow-Origin: *
Sono tutti file statico, non tutte le applicazioni servlet.
Avevo un sito Web statico ospitato da Tomcat.Imposta intestazione CORS in Tomcat
come impostare un colpo di testa per il mio sito come: Access-Control-Allow-Origin: *
Sono tutti file statico, non tutte le applicazioni servlet.
Se si tratta di un sito statico, poi a partire con Tomcat 7.0.41, si può facilmente controllare il comportamento CORS tramite un built-in filter.
praticamente l'unica cosa che dovete fare è modificare il globale web.xml
in CATALINA_HOME/conf
e aggiungere la definizione del filtro:
<!-- ================== 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 ====================== -->
essere consapevoli, però, che Firefox non piace Access-Control-Allow-Origin: *
e le richieste con le credenziali (biscotti): when responding to a credentialed request, server must specify a domain, and cannot use wild carding.
è necessario aggiungere un Filter
per aggiungere l'intestazione aggiuntivo e configurarlo per tutti i percorsi
<filter>
<filter-name>header</filter-name>
<filter-class>...</filter-class>
</filter>
<filter-mapping>
<filter-name>header</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
era solo un sito Web statico, devo usare servlet? – Dozer
Sì, non è possibile aggiungere un'intestazione senza un '' Servlet' o 'Filtro' in Tomcat – shyam
@Dozer: considerare l'utilizzo di [filtri forniti dal contenitore] (http://tomcat.apache.org/tomcat-7.0-doc/config/filter .html) per i casi d'uso più comuni. –
Qui è un filtro molto di base che aggiungerà le intestazioni CORS. Tieni presente che, per impostazione predefinita, questo abiliterà tutti i domini e i metodi, quindi dovresti personalizzarlo in base alle tue esigenze.
Deve anche essere il primo filtro nel 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 {
}
}
come utilizzare questa classe ?. Devo aggiungere il mio metodo @Post in questa classe "CORSFilter" – iambasiljoy
Crea questo corso nella tua app. Quindi aggiungere questo percorso di classe in web.xml della tua app in cui classe
soluzione perfetta. – iambasiljoy
Quando si esegue il debug di questo, si tenga presente che le intestazioni CORS vengono inviate solo se esiste una richiesta di origine incrociata. Vedi https://tomcat.apache.org/tomcat-8.0-doc/images/cors-flowchart.png. Quindi, per favore, non basta ispezionare le chiamate a caso (usando Fiddler, scheda di rete, ...), ma in realtà le richieste CORS si richiedono. – koppor
Dopo aver aggiunto quel filtro sto ancora ricevendo * La risposta alla richiesta di preflight non passa il controllo del controllo accessi: Nessuna intestazione 'Access-Control-Allow-Origin-' è presente sulla risorsa richiesta. L'origine 'http: // localhost: 8080' non è quindi consentita l'accesso. La risposta aveva codice di stato HTTP 403 *. Anche il mio metodo che è in realtà un GET è stato convertito in OPTION e restituisce 403 – Jerry