1. 程式人生 > >關於異步請求時出現的問題

關於異步請求時出現的問題

根據 記得 剛才 就會 XML pac 重新發送 處理 更新

第一個問題:

在struts2的配置文件中 如果不指定type的類型 那麽在action中任何跳轉都是默認forword類型的 稱為內部跳轉 比如下面的例子

第一個例子:

管理員登錄成功之後 跳轉到list.jsp頁面

技術分享圖片

但是網頁上的url卻是下面的

技術分享圖片

第二個例子:

用戶登錄成功之後 跳轉到detail.jsp頁面

技術分享圖片

但是url

技術分享圖片

說了這麽多 就是為了解決上面的操作和異步請求時 容易出現的問題

繼續拿第二個例子來說明 如果在該詳情頁面中 我使用異步操作(比如做更新)

只要我們使用了異步操作 那麽有沒有想過 將來action中做了相應操作之後 無論是否返回數據給瀏覽器

異步請求之後 最終都是需要一個返回一個地址的 這個地址怎麽確定呢

就是你在那個url上發送的異步請求 說到這 我們似乎有點明白了 即如果在一個url=.jsp上發送的異步請求 那麽將來返回的

地址就是這個.jsp頁面 如果在url =xxx.action上發送的異步請求 那麽將來返回的時候 還會去找這個action地址

所以就造成了如下的結果

登錄成功之後(url=xx.action 只是把登錄成功之後的detail.jsp頁面在當前url下展示了出來 所以請求地址不是xx.jsp 在以前的總結中提到過forward和redirect的區別) 在該頁面上 我想要修改員工的信息

技術分享圖片

那麽我們點擊提交 打個斷點來觀察 下面是點擊“信息變更”之後 準備發送異步請求(時刻記得當前請求的url=empAction_login.action 因為一會返回時就會返回個這個action 而不是detail這個頁面)

技術分享圖片

繼續下一步

技術分享圖片

正常進入提高的更新action 這裏我把response給註銷掉了(其實有沒有該語句 執行效果都 一樣 如下面的情況)

首先 我在empAction_login.action中 打上了斷點 易於觀察

技術分享圖片

然後繼續下一步

技術分享圖片

可以看到 我們剛才的推論是正確的 它的確返回給了發送異步請求處的url 即empAction.action

所以這就出現了問題 我們明明做的是更新操作 預想結果:要麽成功 要麽失敗 可以現在卻又來到了登錄處的action 無論登錄成功或者失敗 都不是我們想要的處理流程

所以 結論:

如果在一個url=.jsp上發送的異步請求 那麽將來返回的地址就是這個.jsp頁面 如果在url =xxx.action上發送的異步請求 那麽將來返回的時候 還會去找這個action地址

問題二:根據上邊出現的問題 我現在的思路就是在登錄成功之後 在struts2中的配置文件中 改變type類型 使其直接重定向到detail.jsp頁面 這樣就可以解決上面的問題了

修改如下:

技術分享圖片

然後登錄訪問

技術分享圖片

登錄成功

技術分享圖片

然後根據struts2.xml的配置 進行重定向

但是卻出現了如下的結果:

技術分享圖片

這是因為 我們的detail.jsp頁面在WEB-INF下面 重定向 相當於客戶端重新發送一次請求 直接訪問 所以 訪問不到

技術分享圖片

到這都非常有意思了 一方面是 為了保證頁面的安全 不登錄不讓其訪問 一方面又想通過重定向訪問 這怎麽搞呢

解決辦法(其實也可以把該頁面給拿到web-inf外部 因為這個頁面不是安全性不是非常高)

技術分享圖片

看到沒 我在web.xml中配置了一個映射 註意和servlet程序映射的不同

技術分享圖片

這樣配置之後 就可以通過瀏覽器直接訪問web-inf下的內容了

技術分享圖片

然後 在struts配置文件中 我們這樣寫

技術分享圖片

不過因為使用了重定向 所以需要把查詢到的數據放在session域中 但是問題還是存在 因為我們登錄成功 重定向之後的url是這樣的

技術分享圖片

比較坑爹 這樣提交之後

關於異步請求時出現的問題