前后端分离 ajax 跨域 session 传值 (后端使用 node)

前端:ajax访问时要加上“xhrFields: {withCredentials: true}” ,实现session可以传递

后端:Access-Control-Allow-Credentials 设置为 true;同时 Access-Control-Allow-Origin 必须指定 url

npm 安装 express、body-parser、express-session、svg-captcha

后台代码:

 1 var express = require(‘express‘);
 2 var app = express();
 3 var svgCaptcha = require(‘svg-captcha‘); // 动态验证码
 4 var session = require(‘express-session‘);
 5 var bodyParser = require(‘body-parser‘); // Express框架请求体解析的中间件
 6
 7 var urlencodedParser = bodyParser.urlencoded({ extended: false });
 8
 9 app.use(session({
10   resave: true, // don‘t save session if unmodified
11   saveUninitialized: false, // don‘t create session until something stored
12   secret: ‘node‘
13 }));
14 app.use(function (req, res, next) {
15   // Website you wish to allow to connect
16   res.setHeader(‘Access-Control-Allow-Origin‘, req.headers.origin);
17   // res.setHeader(‘Access-Control-Allow-Origin‘, "*");
18
19   // Request methods you wish to allow
20   res.setHeader(‘Access-Control-Allow-Methods‘, ‘GET, POST, OPTIONS, PUT, PATCH, DELETE‘);
21
22   // Request headers you wish to allow
23   res.setHeader(‘Access-Control-Allow-Headers‘, ‘X-Requested-With,content-type‘);
24
25   // Set to true if you need the website to include cookies in the requests sent
26   // to the API (e.g. in case you use sessions)
27   res.setHeader(‘Access-Control-Allow-Credentials‘, true);
28
29   // Pass to next layer of middleware
30   next();
31 });
32
33
34 app.get(‘/‘, function (req, res) {
35   res.send(‘Hello World‘);
36 });
37 app.post(‘/trendsCode‘, urlencodedParser, function (req, res) {
38   var code = req.body.code;
39   if (code) {
40     var response = {
41       msg: ‘success‘,
42       trendsCode: req.session.trendsCode
43     };
44     res.send(JSON.stringify(response));
45   } else {
46     var codeConfig = {
47       size: 5, // 验证码长度
48       noise: 2, // 干扰线条的数量
49       height: 44
50     }
51     var captcha = svgCaptcha.create(codeConfig);
52     req.session.trendsCode = captcha.text;
53     res.send(captcha.data);
54   }
55 });
56
57 var server = app.listen(8080, function () {
58   var host = server.address().address
59   var port = server.address().port
60
61   console.log("应用实例,访问地址为 http://%s:%s", host, port);
62 });

前端代码:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3
 4 <head>
 5   <meta charset="UTF-8">
 6   <meta name="viewport" content="width=device-width, initial-scale=1.0">
 7   <meta http-equiv="X-UA-Compatible" content="ie=edge">
 8   <title>ajax 跨域 session 传值</title>
 9 </head>
10
11 <body>
12   <h1>trends code</h1>
13   <div id="code"></div>
14   <input type="text" id="input">
15   <input type="button" value="提交" onclick="submit()">
16
17   <script src="./jquery-3.3.1.min.js"></script>
18   <script>
19     window.onload = function () {
20       $.ajax({
21         url: "http://127.0.0.1:8080/trendsCode",
22         type: ‘POST‘,
23         xhrFields: {
24           withCredentials: true
25         },
26         success: function (response) {
27           // console.log(‘response--‘,response);
28           $(‘#code‘).html(response);
29         },
30         error: function (error) {
31           console.log(‘error--‘, error)
32         }
33       });
34     };
35     var submit = function () {
36       // console.log(‘submit‘);
37       var inputCode = $(‘#input‘).val();
38       $.ajax({
39         url: "http://127.0.0.1:8080/trendsCode",
40         data: {
41           code: inputCode
42         },
43         type: ‘POST‘,
44         xhrFields: {
45           withCredentials: true
46         },
47         success: function (response) {
48           console.log(‘response--‘, response);
49           // document.write(response);
50         },
51         error: function (error) {
52           console.log(‘error--‘, error)
53         }
54       });
55     };
56   </script>
57 </body>
58
59 </html>

前端 xhrFields 的设置(XMLHttpRequest 和 jquery)

 1 // XMLHttpRequest
 2 var xhr = new XMLHttpRequest();
 3 xhr.open(‘GET‘, ‘http://127.0.0.1:8080/trendsCode‘);
 4 xhr.withCredentials = true;
 5 xhr.onload = onLoadHandler;
 6 xhr.send();
 7
 8 // jquery
 9 $.ajax({
10     url: "http://127.0.0.1:8080/trendsCode",
11     type: "GET",
12     xhrFields: {
13         withCredentials: true
14     },
15     success: function (data) {
16         // do something
17     }
18 });

参考文章: https://blog.csdn.net/jiahao791869610/article/details/79175268

原文地址:https://www.cnblogs.com/landmass/p/9876842.html

时间: 2024-10-19 01:27:47

前后端分离 ajax 跨域 session 传值 (后端使用 node)的相关文章

Ajax跨域Session和跨域访问

一.关于ajax跨域请求,用jsonp老是不成功,虽然可以返回数据,但是error处报错.原因是返回的数据格式不是jsonp格式.但是用C#构造的请求却能够返回数据. 二.第三方的ajax请求肯定是不能获取得到你当前用户的session. 任务是这样的的,支付宝的页面返回notify页面(这个页面是异步访问的),而我的C#处理有一个处理模块,需要判断如果是已经登录则加积分之类的操作,结果老是获取不到session数据,可是明明登录了啊.这里的误区是,我们当前域肯定是已经登录了,可对于支付宝那边的

【js】【跨域问题】前后端分离的跨域问题

最近在研究nodejs,php的前后端分离相关东西,在调用接口的时候碰到一些跨域的问题,经过一段时间的摸索,总结出来的一些东西 php采用的是yii框架,登录的机制或者调用接口都需要前端传递cookie进去,但是nodejs的axios接口等默认是不会传递cookie的 跨域解析:浏览器请求非本域名的网站资源,如果目标服务器没有设置跨域的情况下,浏览器是会阻止用户的请求的 跨域的解决途径:可以配置后端服务转发的机制绕开跨域问题:也可以直接配置目标服务器的跨域配置 配置转发 搭建一个和前端处于同一

前后端分离之跨域问题

最近在做的一个项目,原本是通过SpringMVC结合freemarker模板引擎和JSP实现HTML页面和后端的数据交互,现在为了业务需要,要将前后端拆分出来.使用Restful API的形式进行交互.然后刚上路就遇到坑了,在这里记录一下如何填坑,以防不时之需.这里介绍的方法是SpringMVC架构通过CROS协议解决跨域问题. 错误信息 Response to preflight request doesn't pass access control check: No 'Access-Con

vue前后端分离解决跨域问题

用Vue-cli脚手架搭建了个demo,前后分离就有跨域问题的出现. vue-clie搭建demo步骤(传送门):https://www.cnblogs.com/wangenbo/p/8487764.html 我自己在网上找了2个接口做测试: CSDN:https://www.csdn.net/api/articles?type=more&category=home&shown_offset=1524276761019196&first_view=false 掘金:https://

前后端分离,跨域问题

解决跨域问题 1. 什么是跨域 1.1.不同域名的资源访问,存在跨域 1.2.同一个域名不同端口的资源访问,也属于跨域 1.3二级域名不同的资源访问,也属于跨域 只要域名(ip)和端口号有一样不同,那么都是跨域 http://localhost:8080 前端系统 发送Ajax取后端系统获取数据 http://localhost:80   后端系统 以上的两个地址也是跨域 2.跨域问题 跨域不一定会有跨域问题. 因为跨域问题是浏览器对于ajax请求的一种安全限制,也可以说是浏览器的同源策略 同源

前后端分离开发,跨域访问的apche设置

1,如何让Apache支持跨域访问呢? 步骤: 修改httpd.conf,windows中对应的目录是:C:\wamp\bin\apache\Apache2.4.4\conf\httpd.conf 把LoadModule headers_module modules/mod_headers.so 前面的注释删除 修改  改为:  即: <Directory />    AllowOverride none    Require all granted    Header set Access-

解决傻瓜式前后端分离前端跨域访问的问题

版本号49之后的chrome跨域设置chrome的版本升到49之后,跨域设置比以前严格了,在打开命令上加--disable-web-security之后还需要给出新的用户个人信息的目录.众所周知chrome是需要用gmail地址登录的浏览器,登录后就会生成一个存储个人信息的目录,保存用户的收藏.历史记录等个人信息.49版本之后,如果设置chrome浏览器为支持跨域模式,需要指定出一个个人信息目录,而不能使用默认的目录,估计是chrome浏览器怕用户勿使用跨域模式泄露自己的个人信息(主要是cook

前后端分离的跨域请求问题解决

因为工作中接触到了,就记录下来. 主要是两个jar包的使用 可以自己看看源码或是其他对内部方法讲解的资料. web.xml配置. 原文地址:https://www.cnblogs.com/helloworld-yjh/p/9689465.html

SpringSecurity解决跨域问题,在SpringBoot整合SprinSecurity中如何用前后端分离Ajax登录,Ajax登录返回状态200还是近error

先说说SpringSecurity如何实现前后端分离Ajax登录? 今天使用SpringBoot整合SpringSecurity中想使用Ajax替代SpringSecurit的Form表单提交,在这里我们的提交方式还是使用表单提交 http.formLogin().loginProcessingUrl("/authentication/form") loginProcessingUrl方法表示你登录请求的地址,在这里SpringSecurity默认登录页面地址是/login ,填写了u