oauth2.0里回调地址返回code中如何让code不显示在URL里?
背景:
最近在调用对方提供的oauth2.0接口的时候,返回code在URL显示,但是会影响到本系统调用其他的菜单项的操作,所以想把返回的code值去掉。
解决办法:
想了各种解决办法,目前把自己解决办法的经过介绍给大家,有些办法存在弊端,但是最终我还是使用了一个影响几乎不大的办法,供大家学习参考!
方法一:
本人首先想到的是在源头把code去掉,就是在后端获取到code,accessToken,refreshToke等参数之后,把返回的URL地址修改掉,可是发现这个办法有点难,因为oauth 2.0的机制就是如此。
也许会有其他在后端解决的方法,我只是没有深入的去研究了。于是,我就想在前端去解决,把返回的URL地址修改一下,代码如下:
<script type="text/javascript"> $(document).ready(function() { var currenturl = window.location.href; if (location.href.indexOf("?code=")!=-1) { var newUrl = location.href.split("?")[0]; window.location.replace(newUrl); } }); </script>
这个办法虽然可以解决,但是跳转到该页面的时候,页面先加载一下,然后就刷新了一下,这样会导致页面效果不好,体验也非常的不好,而且还导致后台报一个错误,大概意思是:org.apache.catalina.connector.ClientAbortException: java.io.IOException: 远程主机强迫关闭了一个现有的连接。。。。。。。
应该就是说一个页面还没加载完,又重新加载一个页面。导致必须关闭一个连接。因为我把上面代码屏蔽掉后,就不报这个错误了。所以我就打算放弃这个方法,找其他解决办法。
方法二:
思来想去,突然一个念头闪现,会不会存在一个方法,修改URL地址,但是不刷新页面呢?于是便在网上搜索了一下,还真的存在。
利用history.pushState实现
<script type="text/javascript"> $(document).ready(function() { var currenturl = window.location.href; //alert("url="+url); if (location.href.indexOf("?code=")!=-1) { var newUrl = location.href.split("?")[0]; history.pushState('','',newUrl);//参数可省略 } }); </script>
补充一下pushState与replaceState的知识:
两者都是html5的新特性,支持IE10以上,都有三个参数:
以history.pushState(state,title,url)为例:
(1)state:存储JSON字符串,可以用在popstate事件中。
(2)title:现在大多数浏览器不支持或者忽略这个参数,最好用null代替。
(3)url:任意有效的URL,用于更新浏览器的地址栏,并不在乎URL是否已经存在地址列表中。更重要的是,它不会重新加载页面。
history.replaceState(state,title,url)
用新的state和URL替换当前。不会造成页面刷新。
state:与要跳转到的URL对应的状态信息。
title:不知道干啥用,传空字符串就行了。
url:要跳转到的URL地址,不能跨域。
两者的区别:
pushState()是在history栈中新建一个历史记录,而replaceState()是替换当前记录;
以上是我解决这个问题的经过,希望有此问题困惑的人,能看到这篇文章,供您参考!
如果这篇文章对您有所帮助,请随便打赏一下作为鼓励,我会再接再厉的!!!