首页 > 其他分享 >Axios 代理跨域后后端无法接收Session问题

Axios 代理跨域后后端无法接收Session问题

时间:2023-06-12 16:46:10浏览次数:45  
标签:Axios 跨域 exploded server Session Cookie war 请求

将一个 MVC 项目重构为一个前后端分离项目,前端使用了 react + axios + vite...。

在前后端分离项目中,通常都会使用代理来解决跨域问题,vite 需要在 vite.config.js 文件中配置代理:

export default defineConfig({
  server: {
    // 代理配置
    proxy: {
      // 请求前缀
      '/api': {
        target: 'http://localhost:8080/server_war_exploded',
        // 开启跨域
        changeOrigin: true,
        // 正式请求时将前缀替换为空字符
        rewrite: path => path.replace(/^\/api/, '')
      }
    }
  }
})

配置了代理之后请求能过去了,但后端保存在 Session 中的用户信息无法拿到。检查发现请求头中并没有携带 Cookie,这是因为 axios 在跨域请求中是默认不提供凭据信息,也就是在跨域请求中不携带 cookie、HTTP认证及客户端SSL证明等。需要在 axios 中手动开启:

axios.defaults.withCredentials = true;

开启之后再次请求后检查请求头...嗯...好像携带 Cookie 进行请求了,但后端还是无法获取 Session,再检查发现这个 Cookie 的作用范围不对,Path/server_war_exploded

set-cookie: JSESSIONID=DD2CCA381F1EA1AAEEE912E3DCDC5A43; Path=/server_war_exploded; HttpOnly

将代理中请求的前缀改为 /server_war_exploded 再次发送请求就可以了

export default defineConfig({
  server: {
    // 代理配置
    proxy: {
      '/server_war_exploded': {
        target: 'http://localhost:8080/server_war_exploded',
        changeOrigin: true,
        rewrite: path => path.replace(/^\/server_war_exploded/, '')
      }
    }
  }
})

这是因为没改之前你请求的时候地址看着http://localhost:3000/api/login , 而 Cookie 作用于 /server_war_exploded 所以你的请求无权访问 Cookie。修改之后请求地址看着就是 http://localhost:3000/server_war_exploded/login

下面是请求使用代码:

private onFinish = (values: {[index: string]: any}) => {

  this.context.http.post('/server_war_exploded/login', {}, {
    params: {
      '__method__': 'doLogin',
      ...values
    }
  })
    .then((response: AxiosResponse) => {
      const {data} = response;
      console.log(data)
    })
    .catch((err: any) => {
      console.log(err)
    })
};

后端使用 Session 保存用户登录信息,那么后端是如何确定当前会话对应的是哪一个 Session 你知道吗?

在每一次请求中,其实浏览器都会默认携带一个 Cookie JSESSIONID ,这个 Cookie 记录了一大串乱七八糟的字符串,后端就是通过这个字符串来确定一个会话的 Session 对象的。

标签:Axios,跨域,exploded,server,Session,Cookie,war,请求
From: https://www.cnblogs.com/CloverYou/p/17475429.html

相关文章

  • cookie 和session的区别
    1、对象不同cookie:是针对每个网站的信息,每个网站只能对应一个,其他网站无法访问,这个文件保存在客户端,每次您拨打相应网站,浏览器都会查找该网站的cookies,如果有,则会将该文件发送出去。cookies文件的内容大致上包括了诸如用户名、密码、设置等信息。session:是针对每个用户的,只有客......
  • nginx+tomcat+memcached (msm)实现 session同步复制
    这里重点强调如何实现linux服务器上服务器session共享,软件安装不再赘述。 首先我们需要对cookie和session的工作机制非常了解,如果不了解其中的原理,就算配置成功,也毫无意义。换了工作换了环境,重新配置起来 仍然需要重头来过,事倍功半。    cookie是怎样工作的? 例如,我们创......
  • CInternetSession(获取网页源码)
    CObject└CInternetSession使用类CInternetSession创建并初始化一个或多个同时的Internet会话。如果需要,还可描述与代理服务器的连接。如果Internet连接必须在应用过程中保持着,可创建一个类CWinApp的CInternetSession成员。一旦已建立起Internet会话,就可调用OpenUR......
  • Vue 中通过事件总线方式组件间传递数据及调用 Vue脚手架中的axios数据调用方式获取git
    1:看界面效果2:代码结构3:代码内容3.1:引入第三方css样式表:bootstrap.css/*!*Bootstrapv3.3.5(http://getbootstrap.com)*Copyright2011-2015Twitter,Inc.*LicensedunderMIT(https://github.com/twbs/bootstrap/blob/master/LICENSE)*//*!normalize.cssv3.0.3|......
  • Vue跨域配置异常采坑:Request failed with status code 401
    本地用Express作为服务端,前端Vue项目配置跨域代理,调用服务端api接口始终报错“Requestfailedwithstatuscode401”。原来发现是端口3000被占用了,被VSCode的一个插件占用了,修改为其他端口解决。具体解决过程记录一下。后端、前端配置Express服务端接口为3000,地址:http://lo......
  • 使用axios 请求后端
    1、使用CDN的方式导入axios点击查看代码<scriptsrc="https://unpkg.com/axios/dist/axios.min.js"></script>二,跨域问题的解决1,什么是跨域CORS,全称是:Cross-OriginResourceShareing2,跨域问题的解决后端增加全局的过滤器三,前端elementUI点击查看代码<!--引......
  • 读了会 axios 源码,虽然云里雾里,但是我想到了三个有趣的对比
    源码阅读最近翻来了axios源码,信心满满的看了会,虽然哪跟哪都没串起来,但是意外收获了一些新的想法。有几组不错的知识点,对比看,比单独看每个知识点,更有趣一些。遇到有趣的知识点,当然要分享一下。文章速读本文从axios的源码联想到了几个不错的知识点对比。阅读文章,可以有以下收获:知......
  • Vue——vuex使用、Router使用、localstorage、sessionstorage和cookie
    vuex使用#vuex:状态管理器---》存数据(变量)的地方,所有组件都可以操作在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信<h1>1vuex的使用基本使用(操作state的数据)</h1>......
  • 八、匿名访问和跨域
    一、匿名访问新建AnonymousController@RestController@RequestMapping("/anoy")publicclassAnonymousController{@RequestMapping("/hello")publicMono<String>hello(){returnMono.just("123");......
  • chrome 跨域问题解决
    1.后端设置了跨域,https下可以,http不可以高版本chrome配置了策略,如果访问私有网络,会出现禁止跨域chrome://flags/#block-insecure-private-network-requestsBlockinsecureprivatenetworkrequests.......