背景:
最近在調用對方提供的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()是替換當前記錄;
以上是我解決這個問題的經過,希望有此問題困惑的人,能看到這篇文章,供您參考!
如果這篇文章對您有所幫助,請隨便打賞一下作為鼓勵,我會再接再厲的!!!