个人随笔
目录
把某一个服务器当作静态资源服务器也会遇到跨域导致cookie切换问题,无语
2023-03-17 17:35:59

在这篇文章中,静态资源文件发布设想(jsp,html) 我是打算把某一个服务器当作静态资源来放的,比如放html,图片这些啊,美滋滋的采取用ajax读取html文件流的方案来在前端聚合页面,昨晚上线了后才发现有坑

问题重现

1、需求背景

我有两个应用,假设一个域名是www.suibibk.com ,一个域名是static.suibibk.com,现在我想把静态资源(html文件)就上传到static.suibibk.com服务器的某个静态目录,请求路径为 :static.suibibk.com/includeHtml/xxxx/index.html

然后我现在是打算在static.suibibk.com的页面把静态文件包含进来,然后我只需要提供相关js业务方法给index.html里面要实现的业务场景调用即可。

2、我采取的实现方式

因为想着是静态资源来的,那么最简单的方式就是在我的主页面里面,用ajax把那个index.html当作流加载下来放到某一个div里面,这个我在之前的文章已经写过。又为了解决跨域问题,我在我的nginx做了代理,具体代码片段如下

主页面

  1. ...
  2. <div id="includeHtml"></div>
  3. ...
  4. $.ajax({
  5. type:"GET",
  6. url:"https://static.suibibk.com/includeHtml/xxxx/index.html",
  7. data: "",
  8. success:function(msg){
  9. //因为msg是一个html文件,里面也有很多引用的相对路径的图片样式资源
  10. //所以这里需要对./进行替换
  11. var html = msg.replace(/\.\//g,baseUrl);
  12. $("#includeHtml").html(html);
  13. },
  14. error:function(XMLHttpRequest, textStatus, thrownError){}
  15. })
  16. ...

nginx

  1. ...
  2. upstream static{
  3. server 静态资源服务器的IP:端口
  4. }
  5. ...
  6. if ($uri ~* ^/includeHtml){
  7. set $urlport http://static;
  8. set $s_port 80;
  9. }

这里直接配置static.suibibk.com对应的资源服务器的ip端口即可。也就做到了前端不会有跨域问题

3、生产发布后遇到的问题

生产发布后,我们index.html里面有个点击按钮,记录访问日志,调用的是主页面封装的一个ajax方法,请求的是 www.suibibk.com 的后台接口。点击发现,session不见了,明明进入主页面有登录过的,最后调试发现,在执行ajax拉去静态html的时候,因为后端走了另一个upstream,jsessionid变化了,导致session失效。

我这种业务场景只是需要当作一个静态资源服务器,并不需要做什么跨域session同步的,但是这样一搞导致我们的session变化了,因为自身并不是运维,不知道怎么用nginx配置可以解决这个问题,解决产生新的jsessionid的问题。那我就只能采取暴力的解决方法

4、暴力解决方案

我去问了产品需求,发现以往这个index.html大小平均30k左右,最多60多k,很小,所以我采取了直接在java代码里用httpClient把index.html的字符流读取回来,然后request直接到页面。

测试发现可行。

20230323 换上生产环境发现还是不可行,估计是图片资源也因为走nginx转发到了upstream里面,session又搞没了,怎么办呢?目前的解决方案是去掉nginx配置文件中upstream的ip_hash,或则sticky,或者静态资源用旧的域名

 101

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2