重寫ajax方法實現異步請求session過時時跳轉登陸頁面(轉)

<div id="article_content" class="article_content csdn-tracking-statistics tracking-click" data-mod="popu_519" data-dsm="post">javascript

<p>通常咱們會在過濾器裏判斷登陸狀態,若是沒登陸就跳轉登陸頁面,過濾器java核心代碼以下:</p> <p></p> <div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 496px; top: 250px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&amp;width=16&amp;height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>UserItem&nbsp;loginUser&nbsp;=&nbsp;(UserItem)request.getSession().getAttribute(</span><span class="string">"loginUser"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">if</span><span>(loginUser&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;response.sendRedirect(<span class="string">"/login.action"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>}&nbsp;&nbsp;</span></li></ol></div><pre code_snippet_id="437852" snippet_file_name="blog_20140729_1_3487486" name="code" class="java" style="display: none;">UserItem loginUser = (UserItem)request.getSession().getAttribute("loginUser"); if(loginUser == null) { response.sendRedirect("/login.action"); }</pre>這個對於普通頁面來講徹底沒問題,可是在使用ajax的時候每每得不到想要的效果。由於頁面根本沒跳轉,只是捕獲到了登陸頁面的源碼而已。 <p></p> <p>網上一堆庸人給出一堆扯蛋的方法,主要有。</p> <p>1.返回的字符串附加登陸狀態;<span style="color:#ff6666">(那麼多,你願意改麼,並且先後端都得改,編碼的時候還要總去考慮那個狀態煩不煩)</span></p> <p>2.修改http頭信息;<span style="color:#ff6666">(裝B深沉型)</span></p> <p>3.修改jquery源文件判斷;<span style="color:#ff6666">(勉強算個程序員,可是盡力不去動源,性能問題你還得解壓再壓縮,別人也不必定知道你改過源碼)</span></p> <p>個人解決方案跟第三種方法思路接近,重寫ajax方法實現前置處理,代碼以下:</p> <p></p> <div class="dp-highlighter bg_javascript"><div class="bar"><div class="tools"><b>[javascript]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 534px; top: 685px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&amp;width=16&amp;height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-c"><li class="alt"><span><span>jQuery(</span><span class="keyword">function</span><span>($){&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;備份jquery的ajax方法&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;_ajax=$.ajax;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;重寫ajax方法,先判斷登陸在執行success函數&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;$.ajax=<span class="keyword">function</span><span>(opt){&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;_success&nbsp;=&nbsp;opt&nbsp;&amp;&amp;&nbsp;opt.success&nbsp;||&nbsp;</span><span class="keyword">function</span><span>(a,&nbsp;b){};&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;_opt&nbsp;=&nbsp;$.extend(opt,&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success:<span class="keyword">function</span><span>(data,&nbsp;textStatus){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;若是後臺將請求重定向到了登陸頁,則data裏面存放的就是登陸頁的源碼,這裏須要找到data是登陸頁的證據(標記)</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(data.indexOf(</span><span class="string">'weinianjie'</span><span>)&nbsp;!=&nbsp;-1)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.location.href=&nbsp;Globals.ctx&nbsp;+&nbsp;<span class="string">"/login.action"</span><span>;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_success(data,&nbsp;textStatus);&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_ajax(_opt);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;</span></li><li class="alt"><span>});&nbsp;&nbsp;</span></li></ol></div><pre code_snippet_id="437852" snippet_file_name="blog_20140729_2_3378019" name="code" class="javascript" style="display: none;">jQuery(function($){ // 備份jquery的ajax方法 var _ajax=$.ajax; // 重寫ajax方法,先判斷登陸在執行success函數 $.ajax=function(opt){ var _success = opt &amp;&amp; opt.success || function(a, b){}; var _opt = $.extend(opt, { success:function(data, textStatus){ // 若是後臺將請求重定向到了登陸頁,則data裏面存放的就是登陸頁的源碼,這裏須要找到data是登陸頁的證據(標記) if(data.indexOf('weinianjie') != -1) { window.location.href= Globals.ctx + "/login.action"; return; } _success(data, textStatus); } }); _ajax(_opt); }; });</pre> <p>在登陸頁面的源碼裏面,你隨便找個地方打個標記而後隱藏掉,好比個人標記就是weinianjie。對於$.get和$.post就不用說了吧,這兩個方法都是調用了$.ajax方法的,因此也就自動獲取了前置判斷能力。</p> <p>大功告成,注意以上擴展須要放在你的全部ajax請求以前執行。</p> <p><br> <br> </p> </div>java

相關文章
相關標籤/搜索