在这篇文章中,静态资源文件发布设想(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做了代理,具体代码片段如下
主页面
...
<div id="includeHtml"></div>
...
$.ajax({
type:"GET",
url:"https://static.suibibk.com/includeHtml/xxxx/index.html",
data: "",
success:function(msg){
//因为msg是一个html文件,里面也有很多引用的相对路径的图片样式资源
//所以这里需要对./进行替换
var html = msg.replace(/\.\//g,baseUrl);
$("#includeHtml").html(html);
},
error:function(XMLHttpRequest, textStatus, thrownError){}
})
...
nginx
...
upstream static{
server 静态资源服务器的IP:端口
}
...
if ($uri ~* ^/includeHtml){
set $urlport http://static;
set $s_port 80;
}
这里直接配置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,或者静态资源用旧的域名