https://geeknote.net/yanghailong
yanghailong
事不宜迟,滴水穿石。
https://geeknote-storage.oss-cn-hongkong.aliyuncs.com/6mhnd03a4cyk91149dz4jvtytrff?x-oss-process=image%2Fresize%2Cm_fill%2Cw_160%2Ch_160
2022-10-28T15:03:46Z
yanghailong
https://geeknote.net/yanghailong
https://geeknote.net/yanghailong/posts/1513
2022-09-16T13:48:18Z
2022-10-28T15:03:46Z
Vue.js 项目本地调试 session 丢失问题
<p>进行 Vue.js 本地调试时,遇到了 API 请求到后端服务后 session 丢失的现象。</p>
<p>本地开发环境:</p>
<ul>
<li>后端服务是 SpringBoot 本地启动的项目,运行在 8080 端口;</li>
<li>Vue.js 本地调试时启动在 8081 端口;</li>
</ul>
<p>排查发现多个请求中 JSESSIONID 会发生变更,导致前面登录时写入的 session 后续请求读取不到,都是 null。</p>
<p>如下面两张图所示的正常情况下,JSESSIONID 是用户请求服务端时服务器生成并通过 HTTP response 写 Cookies 到浏览器,浏览器后续访问便会带上该 Cookies,服务端就可以通过 Cookies 中的 JSESSIONID 来获取到当前用户的 session 了。</p>
<p><img src="/attachments/JVo5KZjETXUap3WMCD1TbhVX/image.png" alt="image.png">
<img src="/attachments/uTgk1UM32213vYjCPifR8BTP/image.png" alt="image.png"></p>
<p>今天遇到问题时的异常情况下如下图,请求时没有携带 Cookies,所以导致每次服务器都生成新的 Cookies 返回。
<img src="/attachments/96i7Ss8f1PsxZ8MyfkHmWRr8/image.png" alt="image.png">
<img src="/attachments/XV9HFmuQPpPjVzkoszP6Zs4X/image.png" alt="image.png"></p>
<p>怀疑是 webpack-dev-server 有什么透传 Cookies 的配置漏掉了,Google 了一圈,发现很多文章提到的 Cookies 问题都是和 AJAX 跨域请求有关,重新看了下发现果然是,Vue.js 项目前端 8081 端口直接在 AJAX 跨域请求了 8080 的服务端接口,导致 Cookies 丢失 。如下图:</p>
<p><img src="/attachments/Zb57KDqtMJVrZmweGYuzKrtK/image.png" alt="image.png"></p>
<p>看了下 Vue.js 的配置,果然本地开发时请求服务端接口并没有走 webpack-dev-server 的 proxy 模式,而是直接跨域请求。由于服务端接口开启了跨域配置,所以请求接口是成功的,但是服务端的 session 失效了。</p>
<p>修改 vue.config.js,添加 proxy 配置,一切恢复正常:</p>
<pre class="highlight"><code class="language-javascript"> <span class="nx">devServer</span><span class="p">:</span> <span class="p">{</span>
<span class="nl">port</span><span class="p">:</span> <span class="mi">8081</span><span class="p">,</span>
<span class="nx">https</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
<span class="nx">proxy</span><span class="p">:</span> <span class="p">{</span>
<span class="c1">// 使用 proxy 模式,不然可能遇到跨域请求接口时 cookie 丢失的问题</span>
<span class="dl">'</span><span class="s1">/webapi</span><span class="dl">'</span><span class="p">:</span> <span class="p">{</span>
<span class="nl">target</span><span class="p">:</span> <span class="dl">'</span><span class="s1">http://localhost:8080</span><span class="dl">'</span><span class="p">,</span>
<span class="p">},</span>
<span class="p">},</span>
<span class="p">},</span>
</code></pre>
<p>由于该项目使用了 OAuth,并没有通过 session 维护登录态,所以之前大家本地开发也没发觉出太大异常。</p>
进行 Vue.js 本地调试时,遇到了 API 请求到后端服务后 session 丢失的现象。
本地开发环境:
后端服务是 SpringBoot 本地启动的项目,运行在 8080 端口;
Vu...
yanghailong
https://geeknote.net/yanghailong
https://geeknote.net/yanghailong/posts/1391
2022-07-25T07:30:34Z
2022-10-28T15:01:29Z
Maven 使用公司自签证书访问内部仓库
<p>通过 <code>~/.m2/settings.xml</code> 文件配置了公司内部 Maven 仓库镜像,Maven 下载依赖时报错:</p>
<blockquote>
<p>PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target</p>
</blockquote>
<h2>
<a id="%E5%8E%9F%E5%9B%A0" href="#%E5%8E%9F%E5%9B%A0" class="anchor"></a>原因</h2>
<p>是由于公司搭建内部 Maven 仓库时使用了自签证书,JRE 不识别该证书,导致 SSL 校验失败。</p>
<h2>
<a id="%E4%BF%AE%E5%A4%8D%E6%96%B9%E6%B3%95" href="#%E4%BF%AE%E5%A4%8D%E6%96%B9%E6%B3%95" class="anchor"></a>修复方法</h2>
<h3>
<a id="%E5%AF%BC%E5%85%A5%E8%AF%81%E4%B9%A6%E5%88%B0+JRE+%E7%9A%84+Keystore+%E4%B8%AD" href="#%E5%AF%BC%E5%85%A5%E8%AF%81%E4%B9%A6%E5%88%B0+JRE+%E7%9A%84+Keystore+%E4%B8%AD" class="anchor"></a>导入证书到 JRE 的 Keystore 中</h3>
<p><a href="https://www.ibm.com/docs/en/tnpm/1.4.2?topic=security-import-certificate-jre-keystore">Import security certificate to the JRE Keystore</a></p>
<p>假设证书保存在 <code>~/Downloads/ca.pem</code></p>
<pre class="highlight"><code>$ cd $JAVA_HOME/jre/lib/security/
$ keytool -import -alias mycertificate -keystore cacerts -file ~/Downloads/ca.pem
</code></pre>
<p>如果执行 keytool 过程中提示"输入秘钥库口令(Enter keystore password)",输入 <code>changeit</code> 即可。</p>
<h3>
<a id="%E3%80%90%E4%B8%8D%E6%8E%A8%E8%8D%90%E3%80%91Maven+%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%B7%B3%E8%BF%87+SSL+%E6%A0%A1%E9%AA%8C" href="#%E3%80%90%E4%B8%8D%E6%8E%A8%E8%8D%90%E3%80%91Maven+%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%B7%B3%E8%BF%87+SSL+%E6%A0%A1%E9%AA%8C" class="anchor"></a><del>【不推荐】Maven 命令行跳过 SSL 校验</del>
</h3>
<p>❌ 有安全风险,不推荐使用该方法
在执行命令式添加 <code>-Dmaven.wagon.http.ssl.insecure=true</code></p>
<p>如:</p>
<pre class="highlight"><code>mvn clean compile -Dmaven.wagon.http.ssl.insecure=true
</code></pre>
<h3>
<a id="%E3%80%90%E4%B8%8D%E6%8E%A8%E8%8D%90%E3%80%91IDEA+Maven+%E4%B8%8B%E8%BD%BD%E5%8C%85%E6%97%B6%E8%B7%B3%E8%BF%87+SSL+%E6%A0%A1%E9%AA%8C" href="#%E3%80%90%E4%B8%8D%E6%8E%A8%E8%8D%90%E3%80%91IDEA+Maven+%E4%B8%8B%E8%BD%BD%E5%8C%85%E6%97%B6%E8%B7%B3%E8%BF%87+SSL+%E6%A0%A1%E9%AA%8C" class="anchor"></a><del>【不推荐】IDEA Maven 下载包时跳过 SSL 校验</del>
</h3>
<p>❌ 有安全风险,不推荐使用该方法
Maven 的 "VM options for importer" 中配置 <code>-Dmaven.wagon.http.ssl.insecure=true</code></p>
<p><img src="/attachments/9QUGfm1cuKY79vd8kcoDyWGP/%E6%88%AA%E5%B1%8F2022-07-25%2011.53.35.png" alt="截屏2022-07-25 11.53.35.png"></p>
通过 ~/.m2/settings.xml 文件配置了公司内部 Maven 仓库镜像,Maven 下载依赖时报错:
PKIX path building failed: sun.securit...
yanghailong
https://geeknote.net/yanghailong