请注意,要使用值配置CORS筛选器,除了启用文件管理器外,还需要为参数添加配置
<!-- ================== Built In Filter Definitions ===================== -->
...
<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>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- ==================== Built In Filter Mappings ====================== -->
下面是一个非常基本的过滤器,它将添加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 {
}
}
如果是静态站点,那么从Tomcat 7.0.41开始,您可以通过内置过滤器轻松控制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不喜欢访问控制允许来源:和具有凭据的请求(cookie):当响应具有凭据的请求时,服务器必须指定域,并且不能使用通配符。
(tomcat.apache.org/tomcat-8.0-doc/images/cors-flowchart.png)
问题内容: 我知道这个问题已经问过几次了。 但是,我无法获得这些解决方案。 我正在运行标准安装的node.js和socket.io。(来自Amazon EC2上的yum) 问题是Chrome退回到xhr轮询,并且这些请求需要有效的CORS配置。但是,我似乎无法正常工作。我的Web服务器在端口80上运行,而node.js(socket.io)在端口81上运行。如您所见,我试图使socket.io使用
所以我有以下中间件: 但是javascript假设cors没有启用?
当从我的网站向运行CherryPy的Python服务器创建发布请求时,我收到错误.我可以用一个“CORS Everywhere”浏览器扩展暂时解决这个问题,但是 由于最近的更新,扩展尚未更新以再次工作。 所涉及的网站最终需要在没有浏览器扩展的情况下被我当地综合体中的许多人使用,所以一旦扩展得到更新,无论如何都无关紧要,因为我不能依赖这些扩展,并强迫每个人都使用它们(当显然有一个修复程序可以使扩展不
我正在尝试在Eclipse中设置Tomcat。我已经按照本教程了解如何安装Tomcat,我甚至能够在localhost:8080上看到默认的Tomcat页面。 我现在需要的是在Eclipse上设置Tomcat。 我做以下事情: 作为Tomcat的安装目录,我输入,如上文中链接的教程所述: 我们将把Tomcat安装到/opt/Tomcat目录。创建目录,然后将存档文件提取到其中〔…〕 但是我得到以下
问题内容: 我正在尝试使用一些跨域的Web服务。当我停用chrome的网络安全功能时,它的运行状况良好。我希望它在没有此功能的情况下工作,因此我尝试添加cross- domain.xml,但仍然无法正常工作。当我进行更多搜索时,开始了解有关tomcat中启用CORS的信息。 来自 http://www.w3.org/wiki/CORS_Enabled 对于Apache,可以将Apache配置为使用
我需要一些帮助与我的Spring安全4.2 CORS配置。 调用Spring Security登录页时http://localhost:8080/login,未在飞行前请求上设置CORS标头。 调用不同的URL时,CORS标头设置正确。 浏览器控制台错误消息: 对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“access control Allow Origin”标头。 Spring安全