Tomcat的跨域资源共享(CORS)配置:实现不同源之间的安全通信

编程语言译者 2019-04-19 ⋅ 97 阅读

在Web开发中,我们经常会遇到需要在不同源(域名、端口、协议)之间进行数据交互的情况。然而,由于浏览器的同源策略限制,跨域请求是被默认禁止的。为了实现不同源之间的安全通信,我们可以通过配置Tomcat的跨域资源共享(CORS)来解决这个问题。

什么是跨域资源共享(CORS)

跨域资源共享(CORS)是一种浏览器的安全机制,允许在浏览器中运行的Web应用程序访问不同源服务器上的资源。它通过HTTP头部中的一些特殊字段来实现,浏览器在发送跨域请求时会先向服务器发送一个预检请求,服务器根据请求头中的Origin字段来判断是否允许访问该资源。如果通过预检请求的验证,浏览器就会发送跨域请求,并允许得到响应。

配置Tomcat的CORS

要配置Tomcat的CORS,我们需要修改Tomcat的配置文件web.xml,以下是具体的配置步骤:

  1. 打开Tomcat的安装目录,找到conf文件夹下的web.xml文件;
  2. web.xml文件中找到以下标签:
<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
  1. 在此标签的下方添加以下配置:
<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,PUT,DELETE,OPTIONS</param-value>
</init-param>
<init-param>
  <param-name>cors.allowed.headers</param-name>
  <param-value>*</param-value>
</init-param>
<init-param>
  <param-name>cors.support.credentials</param-name>
  <param-value>true</param-value>
</init-param>

这里的配置含义如下:

  • cors.allowed.origins:指定允许跨域访问的域名,可以使用通配符*表示所有域名;
  • cors.allowed.methods:指定允许的HTTP方法,如GET、POST等;
  • cors.allowed.headers:指定允许的HTTP请求头;
  • cors.support.credentials:指定是否允许发送身份验证信息(如cookies、HTTP认证等)。
  1. 保存web.xml文件,并重启Tomcat服务器。

在Web应用程序中配置CORS

除了在Tomcat的配置文件中配置CORS,我们还可以在Web应用程序中动态地配置CORS。以下是使用Java Servlet API来实现的代码示例:

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter("/*")
public class CorsFilter implements Filter {

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

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
        httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
        httpServletResponse.setHeader("Access-Control-Allow-Headers", "*");
        httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {}
}

在上面的代码中,我们通过实现一个Filter来配置CORS,将Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-HeadersAccess-Control-Allow-Credentials等HTTP头部字段添加到响应中,实现跨域访问的控制。

总结

通过配置Tomcat的CORS,我们可以实现不同源之间的安全通信。无论是在Tomcat的配置文件中还是在Web应用程序中,我们都可以灵活地使用CORS来控制不同源之间的数据交互,提高Web应用程序的安全性和灵活性。希望本文对你理解和使用Tomcat的CORS有所帮助!


全部评论: 0

    我有话说: