Ajax跨域请求action方法,无法传递及接收cookie信息

最近的项目中涉及到了应用ajax请求后台系统登录,身份认证失败,经过不断的调试终于找到解决方案。

应用场景:

项目测试环境:前端应用HTML,js,jQuery ajax请求,部署在Apache服务器;后端业务系统应用spring mvc,mybatis,部署在tomcat服务器。当在一个系统需要调用另一个系统的时候,就会出现跨域的问题,即本次我们遇到了ajax请求的跨域问题。

系统权限安全框架使用shiro,系统登录时发送ajax请求调用springmvc action方法进行系统登录及身份认证,角色权限授权等。由于ajax请求时,浏览器会认为携带Cookie是不安全请求,将限制其携带Cookie信息,导致登录action方法无法获取并响应相应的Cookie(JSESSIONID),身份认证及角色权限授权、退出等都操作都无法正常使用。

解决方案:

1、当发送ajax请求时,查看浏览器调试信息中Headers和Cookies,发现发送到后端的跨域请求并没有携带 cookie 信息,可见Request Headers不包含Cookie属性,Response Headers中也不包含Set-Cookie属性,导致无法得到后台业务系统的认证。

 

解决:在ajax里添加withCredentials的配置,允许其请求携带cookie信息。通过设置withCredentials=true,发送Ajax时,Request header中便会带上 Cookie 信息。

复制代码
$.ajax({
            type: "post",
            url:url,
            async:false,
            data:datatosend,
            dataType:"json",
            beforeSend: function(xhr) {
                xhr.withCredentials = true;
            }
            crossDomain:true,
            success: function (data) { var a=JSON.stringify(data); if(data.result==true){
                  ...........
               }else{
               ...........
             }
            },
            error:function (data) { var a=JSON.stringify(data);
                alert(a);
            }
        }); 
复制代码

注意:<踩过的坑>我们在beforeSend方法里设置withCredentials=true;在上述代码情境下,如果使用xhrFields:{ withCredentials:true }方法,则允许携带cookie信息的配置并不生效。(原因:ajax中添加了async:false,即修改为同步了,在窗口上下文的同步模式中,已不再支持使用XMLHttpRequest的withCredentials属性)。当保持异步模式时,我们可以更换对应的方法。注意2种方法的区分。

   2、服务器server端要配置Access-Control-Allow-Credentials

我们在客户端设置了withCredentials=true 参数,对应着,服务器端要通过在响应 header 中设置Access-Control-Allow-Credentials = true来运行客户端携带证书式的访问。通过对Credentials参数的设置,就可以保持跨域Ajax时传递的Cookie。

response.setHeader("Access-Control-Allow-Credentials", "true");

3、服务器server端要配置Access-Control-Allow-Origin

到以上配置为止,发送ajax请求,我们发现还会出现一个错误,提示我们 Access-Control-Allow-Origin 不能用 * 通配符。原因是:当服务器端 Access-Control-Allow-Credentials = true时,参数Access-Control-Allow-Origin 的值不能为 '*' 。

我们重新设置Access-Control-Allow-Origin的值,当服务器端接收到请求后,在返回响应时,把请求的域Origin填写到响应的Header信息里(即谁访问我,我允许谁),代码如下:

response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));

ok,到目前问题搞定了,经过测试,可成功传递及响应cookie信息,浏览器调试信息如下图所示:

 

, ,

Related posts

JS如何实现多线程?

单线程的问题

javascript是单线程执行的,在处理运算过程中,浏览器不能执行其它javascript脚本,UI渲染线程也会被挂起,从而导致浏览器进入僵死状态

例如执行经典的 Fibonacci(斐波拉契) 计算,这个递归运算比较耗时,我们就以此为例

代码

fibonacci(3)
fibonacci(2)
fibonacci(1)
fibonacci(0)
fibonacci(1)
后续操作

可以看到,fibonacci执行完成后才能继续执行,fibonacci(3) 很快可以执行完,如果是 fibonacci(30) 就会很慢了,严重阻塞了其他代码

 

解决方法如果把fibonacci计算放到另一个线程中执行,当前线程就可以继续执行,这就需要多线程的能力

Web Worker 是 HTML5 提供的一个javascript多线程解决方案,可以将一些大计算量的代码交由web Worker运行而不冻结用户界面

web worker有两个好处:快速、不阻塞浏览器响应

对于上面的示例,可以创建一个worker线程来执行fibonacci运算

代码

 

worker.js

结果

开始计算1
worker执行的时候继续执行
结果1用时:779

开启worker线程后,就不再阻塞当前线程了,并且可以开启多个worker线程,web worker很好的解决JS单线程模型的不足

使用场景web worker不能操作DOM,适合运算型操作

例如:

(1)长文本格式化

(2)语法高亮

(3)图片处理

(4)图片合成

(5)大数组处理

Latest posts

CloudflareCDN+nginx配置特定IP访问限制

Cloudflare公开中国节点IP段
https://www.cloudflare.com/zh-cn/ips/

# 获取CF代理IP
# 配置加入nginx Server前
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from...

git系统间换行符的问题CRLF/LF/CR

CR回车 LF换行Windows/Dos CRLF \r\n
Linux/Unix LF \n
MacOS CR \r

一、AutoCRLF
#提交时转换为LF,检出时转换为CRLF
git config --global core.autocrlf true

#提交时转换为LF,检出时不转换
git config --global...

数据采集触发防火墙

通过dns分析,目标网站使用阿里云ECS云盾.网站流量先经过aliyunddos1001.com服务器

经过反复尝试将之前Curl请求改成基于HTTP_Request2的Socket请求,顺利绕过防火墙.
通过tcpdump抓包比较

# socket
23:37:37.498916 IP localhost.58718 > localhost.http: Flags , seq 258486799, win 65495, options [mss...

wsl2使用genie守护进程

安装 wsl-transdebian

sudo apt install apt-transport-https

wget -O /etc/apt/trusted.gpg.d/wsl-transdebian.gpg https://arkane-systems.github.io/wsl-transdebian/apt/wsl-transdebian.gpg

chmod a+r /etc/apt/trusted.gpg.d/wsl-transdebian.gpg

cat << EOF > /etc/apt/sources.list.d/wsl-transdebian.list
deb...

CloudFlare的SSL证书浏览器提示不安全原因

Cloudflare Origin CA 证书安装说明

1、先创建CA证书

2、将证书文件下载

3、获取CloudFlare的根证书

4、将根证书合并的xxxxx.pem的后面

再将证书部署到服务器,浏览器刷新显示“连接安全”。

Leave a Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注