tomcat跨域访问(CROS)

在同一个域名但不同端口的两个Tomcat项目中实现跨域访问。通过CORS配置,允许特定源的请求,不进行session验证,前端使用Ajax POST请求。配置涉及在Tomcat的web.xml中添加过滤器,以及clientaccesspolicy.xml和crossdomain.xml文件的设置。

项目场景:

两个项目 ,同一域名不同端口 分别跑在同一台机器的两个tomcat中,构成跨域。

1. 首先需要进行cros配置,详见下面说明(这里使用了cors-filter jar包方式

2. 意图跨域访问的请求不需要session验证:跨域访问在进行session验证时可利用请求头Referer参数判断请求来源,若是来自允许的域则直接通过。

完成后,前端可直接使用ajax post请求 跨域提取数据(测试浏览器:chrome).

------------------------  以下是tomcat配置cros说明(转载) -----------------------------------

第一步:页面js代码:

复制代码
function createCORSRequest(method, url){
    var xhr = new XMLHttpRequest();
    if ("withCredentials" in xhr){
        xhr.open(method, url, true);
    } else if (typeof XDomainRequest != "undefined"){
        xhr = new XDomainRequest();
        xhr.open(method, url);
    } else {
        xhr = null;
    }
    return xhr;
}

var request = createCORSRequest("get", "http://192.168.5.221:8080/");
if (request){
    request.onreadystatechange = function(){
        if (request.readyState == 4 && request.status == 200) {
            var response = request.responseText;
            console.log(response)
        }   
    request.send();
}
复制代码

第二步:在tomcat服务器下webapps/ROOT目录下创建如下两个xml文件
clientaccesspolicy.xml

复制代码
<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
  <cross-domain-access>
    <policy>  
      <allow-from http-request-headers="*">  
        <domain uri="*"/>  
      </allow-from>  
      <grant-to>  
        <resource path="/" include-subpaths="true"/>  
      </grant-to>  
    </policy>  
  </cross-domain-access>  
</access-policy>  
复制代码

crossdomain.xml

复制代码
<?xml version="1.0"?>  
  
<cross-domain-policy>  
  
<allow-access-from domain="*" />  
  
</cross-domain-policy>
复制代码

第三步:在Tomcat服务器下conf/web.xml中,或者项目WEB-INF/web.xml中,我选择的是在项目下配置过滤器。我验证了两个,一个是tomcat下自带的cors过滤器,一个是cors-filter-1.7.jar下的过滤器。两个我都测试了,没问题。

应用tomcat的filter配置如下:参数cors.allowOrigin可以指定具体的源来访问

复制代码
<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>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
  <init-param>
    <param-name>cors.support.credentials</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>cors.preflight.maxage</param-name>
    <param-value>10</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
复制代码

或者应用cors-filter-1.7.jar,还需要java-property-utils-1.9.jar,可以在http://mvnrepository.com/artifact/com.thetransactioncompany/cors-filter 选择某个版本导入pom.xml中,自动导入jar包。

配置如下:参数cors.allowOrigin可以指定具体的源来访问

复制代码
<filter>
    <filter-name>CORS</filter-name>
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
    <init-param>
     <param-name>cors.allowOrigin</param-name>
        <param-value>*</param-value>
    </init-param>
    <init-param>
     <param-name>cors.supportedMethods</param-name>
        <param-value>GET, POST, HEAD, PUT, DELETE</param-value>
    </init-param>
    <init-param>
     <param-name>cors.supportedHeaders</param-name>
        <param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified</param-value>
    </init-param>
    <init-param>
        <param-name>cors.exposedHeaders</param-name>
        <param-value>Set-Cookie</param-value>
    </init-param>
    <init-param>
        <param-name>cors.supportsCredentials</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CORS</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
### 解决问题的CORS配置方法 在前后端分离的应用中,问题(Cross-Origin Resource Sharing,CORS)是一个常见的挑战。以下是几种在不同框架中配置CORS以解决问题的方法。 #### Spring Boot 中的 CORS 配置 在 Spring Boot 项目中,可以通过多种方式实现全局支持。以下是两种主要的实现方法: #### 方法一:使用 CorsFilter 过滤器 通过创建一个 `CorsFilter` 的 Bean 来实现支持。这种方式适用于需要对所有请求进行统一处理的场景[^1]。 ```java package com.college.collegesystem.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; @Configuration public class CorsConfig { private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); // 允许任何访问 corsConfiguration.addAllowedOrigin("*"); // 允许任何请求头 corsConfiguration.addAllowedHeader("*"); // 允许任何请求方法 corsConfiguration.addAllowedMethod("*"); return corsConfiguration; } @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", buildConfig()); return new CorsFilter(source); } } ``` #### 方法二:通过 WebMvcConfigurer 配置 另一种方式是通过实现 `WebMvcConfigurer` 接口,并重写 `addCorsMappings` 方法来配置规则。这种方式更加灵活,可以针对不同的路径设置不同的规则[^3]。 ```java package com.college.collegesystem.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebMvcConfiguration implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 添加路径规则 .allowCredentials(true) // 是否允许在的情况下传递 Cookie .allowedOriginPatterns("*") // 允许请求来源的规则 .allowedMethods("*") // 允许所有的 HTTP 方法 .allowedHeaders("*"); // 允许所有的请求头 } } ``` #### ThinkPHP 5.1 中的 CORS 配置 对于 ThinkPHP 5.1 框架,可以通过行为类(Behavior)的方式实现支持。以下是一个示例代码[^4]: ```php <?php namespace app\api\behavior; use think\Response; class CORS { public function appInit() { header('Access-Control-Allow-Origin: *'); // 允许所有访问地址 header("Access-Control-Allow-Headers: token,Origin, X-Requested-With, Content-Type, Accept"); // 设置你要请求的头部信息 header('Access-Control-Allow-Methods: POST,GET'); // 设置你请求的方式 header('Access-Control-Allow-Credentials: false'); // 设置是否允许 cookie if (request()->isOptions()) { exit(); // 如果是预检请求,直接返回 } } } ``` ### 注意事项 - 在生产环境中,建议不要使用通配符 `*`,而是明确指定允许的名,以提高安全性。 - 如果需要支持带凭证(如 Cookie 或 Token)的请求,则必须将 `allowCredentials` 设置为 `true`,同时不能使用通配符 `*` 作为允许的名。 ```python # 示例:Python Flask 中的 CORS 配置 from flask import Flask from flask_cors import CORS app = Flask(__name__) CORS(app, resources={r"/*": {"origins": "*"}}, supports_credentials=True) @app.route('/') def hello_world(): return 'Hello, World!' ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值