解决axios跨域问题,解决跨域请求sessionId不一致问题

本文介绍如何通过配置Axios和后端过滤器来解决跨域问题,并确保sessionId的一致性。包括设置请求头、转换请求数据及启用credentials。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

axios.post跨域请求出错

①axios设置标题和转换请求数据 

var HTTP = axios.create({
      baseURL:'http://localhost:8080/',
      headers: {'Content-Type': 'application/x-www-form-urlencoded'},
      transformRequest: [function (data) {
        // Do whatever you want to transform the data
        let ret = ''
        for (let it in data) {
          ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
        }
        return ret
      }]
    })

调用:

HTTP.post('admin/user/login.action',{
    name:'test',password:111
})
.then(function(response){
    console.log(response.data);
});

②后台写一个过滤器重写请求报头

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse res = (HttpServletResponse) servletResponse;
        HttpServletRequest request=(HttpServletRequest)servletRequest;
        res.setContentType("textml;charset=UTF-8");
        res.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        res.setHeader("Access-Control-Max-Age", "0");
        res.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");
        res.setHeader("Access-Control-Allow-Credentials", "true");
        res.setHeader("XDomainRequestAllowed","1");
        filterChain.doFilter(servletRequest,servletResponse);
    }

 

跨域请求时的sessionId不一致 

axios设置:

import axios from 'axios'
axios.defaults.withCredentials = true

$.ajax设置:

$.ajax({
url:url,
//加上这句话
xhrFields: {
   withCredentials: true
},
crossDomain: true,
success:function(result){
alert("test");
},
error:function(){
}
});

 

 

<think>嗯,用户的问题是关于前端调用接口时导致后端Session ID一致的原因。首先,我需要根据提供的引用资料来分析可能的原因。 根据引用[1]和[2],用户提到在前端用JavaScript请求Session ID会变,但直接浏览器访问时正常。这可能和浏览器的同源策略或者请求有关。如果前端和后端在同一个下,请求可能会自动携带Cookie,导致每次请求都生成新的Session ID。 引用[3]中提到,使用Ajax请求时没有携带服务器返回的Session ID,而Swagger测试时正常。这可能是因为Ajax请求默认会携带Cookie,需要设置withCredentials为true。同时,后端也需要配置CORS允许携带凭证,比如Access-Control-Allow-Credentials头。 引用[4]指出Session认证依赖于客户端发送Session ID,通常存放在Cookie中。如果前端没有正确处理Cookie,或者在请求中没有包含这个Cookie,就会导致Session ID一致问题。例如,前端框架如Axios可能需要配置才能自动发送Cookie。 引用[5]的例子是前端Vue调用后端ThinkPHP接口,可能需要检查Axios的配置是否正确,比如baseURL是否正确,是否设置了withCredentials,以及后端是否正确设置了CORS策略。 可能的原因还包括:前端未启用Cookie、请求未处理、后端Session存储问题、前端框架配置错误等。需要逐一排查这些可能性,比如检查请求头是否包含Cookie,后端是否返回Set-Cookie头,以及网络环境是否有代理干扰等。</think>### 前端调用接口导致后端Session ID一致的原因分析 #### 1. **请求未携带Cookie** - **问题描述**:若前端与后端部署在名或端口下,浏览器默认出于安全策略(同源策略)会**禁止请求自动携带Cookie**,包括Session ID。此时每次请求会被视为“新会话”,导致Session ID一致[^3][^4]。 - **验证方法**:检查请求头中是否包含`Cookie`字段,若缺失则说明未携带Session ID。 - **解决方案**: - 前端设置:在Ajax请求(如Axios)中需显式启用`withCredentials`属性: ```javascript axios.post('/api/login', data, { withCredentials: true }); ``` - 后端设置:添加CORS响应头允许凭证: ```http Access-Control-Allow-Origin: [具体名] // 可为通配符* Access-Control-Allow-Credentials: true ``` #### 2. **前端未正确处理Set-Cookie** - **问题描述**:后端返回的`Set-Cookie`响应头若未正确存储到浏览器,后续请求将无法携带Session ID。常见于以下场景: - 浏览器安全设置(如禁用第三方Cookie) - Cookie的`SameSite`属性限制(默认`Lax`会阻止部分请求携带Cookie)[^4] - **验证方法**:检查浏览器开发者工具中**Network → Response Headers**是否包含`Set-Cookie`,并观察后续请求是否携带。 #### 3. **前后端部署路径一致** - **问题描述**:若前端页面部署在子路径(如`/app`)而后端接口在根路径(如`/api`),Cookie的`Path`属性可能限制其作用范围,导致Session ID无法传递。 - **解决方案**:后端显式设置Cookie的`Path`属性为根路径: ```http Set-Cookie: sessionid=abc123; Path=/; HttpOnly ``` #### 4. **服务器Session存储配置问题** - **问题描述**:后端未正确配置Session存储机制(如未持久化到数据库或Redis),导致重启后Session丢失,或负载均衡场景下未共享Session。 - **解决方案**:检查后端Session存储配置,确保多实例间共享Session数据。 --- ### 排查流程 1. **检查请求头与响应头** - 使用浏览器开发者工具,观察请求是否携带`Cookie: sessionid=xxx`,响应是否包含`Set-Cookie`。 2. **验证CORS配置** - 确保后端返回的`Access-Control-Allow-Origin`为具体名且包含`Access-Control-Allow-Credentials: true`。 3. **代码检查** - 前端确认`withCredentials: true`已启用,后端检查Session存储逻辑和Cookie属性设置。 --- ### 示例代码(后端CORS配置) ```python # Flask示例 from flask import Flask from flask_cors import CORS app = Flask(__name__) CORS(app, supports_credentials=True, origins=["http://frontend-domain.com"]) ``` ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值