前后台端分离 跨域SESSION 失效问题

本文介绍了一种通过自定义过滤器CORSFilter解决REST接口跨域访问的方法。该方法通过设置HTTP响应头允许特定来源的请求,并配置了Spring框架来实现跨域支持。同时,提供了前端AJAX请求的示例代码。

后端代码接口:

                package com.filter;
import java.io.IOException;
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.config.annotation.CorsRegistry;

/**
 * 解决Rest接口调用过程中,跨域访问问题
 * @author lixin
 * @version 1.0
 */
public class CORSFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        response.setContentType("textml;charset=UTF-8");
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "0");
        response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("XDomainRequestAllowed","1");
        chain.doFilter(req, res);
    }
    public void init(FilterConfig filterConfig) {}
    public void destroy() {}

}

web.xml 中的配置:

         <filter>
<filter-name>CorsFilter</filter-name>
<filter-class>com.filter.CORSFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>

</filter-mapping>

前台ajax 请求配置:红色重要

        $.ajax({  
                 type:"post",  
                 url:"·····················································",  
                 dataType: 'json',
                 xhrFields: {
   withCredentials: true
},
crossDomain: true,

                 success:function(data){  
                  $("#dianhua").html(data);
                 }     

             });  


### ParamFlowRule.setDurationInSec 方法失效的原因及解决方案 ParamFlowRule 的 `setDurationInSec` 方法失效的主要原因可能与规则的序列化、反序列化过程以及 Sentinel 控制台和客户之间的版本兼容性有关。以下是详细分析和解决方案: #### 1. 规则序列化与反序列化问题 当规则从控制台推送到客户时,可能存在序列化或反序列化过程中数据丢失或转换错误的问题。例如,`ParamFlowRuleEntity` 推送至客户后,其结构与 `ParamFlowRule` 不一致,导致客户无法正确解析规则中的字段(如 `durationInSec`)。这可能是由于以下原因之一: - **字段缺失**:`ParamFlowRuleEntity` 中未包含 `durationInSec` 字段[^1]。 - **字段映射错误**:在规则转换过程中,`durationInSec` 字段未被正确映射到目标对象中。 #### 2. 版本兼容性问题 如果 Sentinel 控制台和客户使用的版本不一致,可能导致规则解析失败。例如,在引用中提到的控制台版本为 1.8.0,而客户可能使用了较低版本的 Sentinel SDK。不同版本之间可能对规则的定义存在差异,导致某些字段(如 `durationInSec`)未被支持或解析失败[^2]。 #### 3. 监听器实现问题 在 `RulePropertyListener` 的实现中,`ParamFlowRuleManager.configUpdate` 和 `configLoad` 方法可能未正确处理规则数据。如果 `buildParamRuleMap` 方法返回空数据,则说明规则未能成功加载到内存中。这可能是由于以下原因: - **规则格式错误**:推送的规则数据不符合预期格式,导致解析失败。 - **方法逻辑问题**:`buildParamRuleMap` 方法中未正确处理 `durationInSec` 字段。 --- ### 解决方案 #### 1. 确保字段一致性 检查 `ParamFlowRuleEntity` 和 `ParamFlowRule` 的字段定义是否一致。如果 `ParamFlowRuleEntity` 缺少 `durationInSec` 字段,则需要在控制台添加该字段,并确保在规则推送过程中正确映射到 `ParamFlowRule`。 #### 2. 检查版本兼容性 确认 Sentinel 控制台和客户使用的版本是否一致。如果版本不一致,建议将客户升级至与控制台相同的版本(如 1.8.0),以避免因字段定义或方法逻辑差异导致的问题。 #### 3. 调试监听器实现 通过调试 `RulePropertyListener` 的实现,确保 `ParamFlowRuleManager.configUpdate` 和 `configLoad` 方法能够正确解析规则数据。具体步骤如下: - 检查推送的规则数据是否包含 `durationInSec` 字段。 - 确保 `buildParamRuleMap` 方法能够正确处理 `durationInSec` 字段。 - 如果发现方法逻辑问题,可参考官方文档或源码进行修复。 #### 4. 测试规则有效性 在修复上述问题后,重新测试规则的有效性。可以通过以下代码验证 `setDurationInSec` 方法是否生效: ```java ParamFlowRule rule = new ParamFlowRule(); rule.setResource("testResource"); rule.setCount(10); rule.setDurationInSec(5); // 设置持续时间为5秒 System.out.println("Duration in seconds: " + rule.getDurationInSec()); ``` --- ### 示例代码 以下是一个完整的测试用例,用于验证 `setDurationInSec` 方法的功能: ```java import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule; public class ParamFlowRuleTest { public static void main(String[] args) { ParamFlowRule rule = new ParamFlowRule(); rule.setResource("testResource"); rule.setCount(10); rule.setDurationInSec(5); // 设置持续时间为5秒 System.out.println("Resource: " + rule.getResource()); System.out.println("Count: " + rule.getCount()); System.out.println("Duration in seconds: " + rule.getDurationInSec()); } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值