账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    ajax 跨域请求 session 每次不一样怎么解决?
    74
    0
    前端也加上了 相应的代码xhrFields: {withCredentials: true}服务端 express 已经设置了跨域请求控制台 每次还是不同的sessionID
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 在进行Ajax跨域请求时,如果发现每次请求的session都不一样,这通常是由于服务器设置不当导致无法正确维持跨域会话。为了解决这个问题,你可以尝试以下方法: 1. 服务器端设置允许跨域资源共享(CORS)并允许携带Cookie: 当浏览器发起跨域请求时,默认情况下不会携带Cookie,因此服务端也就无法通过Cookie来识别和维持session。为了使Ajax跨域请求能正常处理session,你需要在服务器端设置CORS响应头,允许特定源,并且设置`Access-Control-Allow-Credentials`为`true`,同时客户端也需要明确发送凭据(即Cookie)。 例如,在Node.js(使用cors中间件)中设置: ```javascript var cors = require('cors'); app.use(cors({ origin: 'http://your-cors-domain.com', // 允许的跨域源 credentials: true // 允许携带cookie })); ``` 在前端Ajax请求中设置: ```javascript $.ajax({ url: 'http://api.example.com', type: 'GET', xhrFields: { withCredentials: true // 发送cookie }, success: function(data) { // ... } }); ``` 2. 确保Session ID保持一致: 确认服务器生成并返回给客户端的Session ID没有问题,且客户端在后续请求中能够正确携带该Session ID。 3. 使用Token或JWT替代Session: 另外一种解决方式是不依赖于传统的基于Cookie的Session机制,而是采用Token(如JSON Web Tokens, JWT)进行身份验证。这样可以在跨域请求中将Token放在请求头(如Authorization header)中传递,避免了跨域带来的Cookie限制问题。
    • 寂寞无罪 普通会员 2楼
      在使用Ajax进行跨域请求时,如果发现每次请求的session不一样,这通常是由于浏览器对跨域请求的同源策略限制导致的,特别是对于需要保持会话状态(如sessionID)的场景。默认情况下,出于安全原因,对于跨域请求,浏览器不会自动携带cookie,而session信息通常存储在cookie中。 解决这个问题的方法有以下几种: 1. **CORS (Cross-Origin Resource Sharing) 配置服务器**: 在服务器端设置响应头,允许特定源进行跨域访问,并允许携带凭据(cookies)。 ```javascript Access-Control-Allow-Origin: <你的前端应用域名> Access-Control-Allow-Credentials: true ``` 然后在前端发起Ajax请求时,也需要设置`withCredentials`为true: ```javascript var xhr = new XMLHttpRequest(); xhr.open('GET', 'http://api.example.com/data', true); xhr.withCredentials = true; xhr.send(); ``` 或者在axios中: ```javascript axios.get('http://api.example.com/data', { withCredentials: true }); ``` 2. **JSONP**: JSONP不是真正的Ajax请求,它通过动态创建script标签绕过同源策略,但JSONP不支持POST等其他HTTP方法且无法处理session和cookie。 3. **token验证**: 可以采用JWT(Json Web Token)或其他token机制,将session信息放在token中,每次请求时将token附加到请求头或URL参数中,由服务器解析并验证。 4. **服务器端代理**: 如果你正在使用Node.js服务作为前端应用的一部分,可以考虑在服务器端设置一个代理,所有跨域请求先发送给自己的服务器,再由自己的服务器转发到目标服务器,这样就不会存在跨域问题了。例如,在create-react-app中可以通过配置proxy来实现。
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部