HttpServletResponse中sendError與setStatus的區別

最近在開發項目時,因爲前端代碼調用後端接口,須要使用響應狀體碼告知前端登陸異常(401)和權限驗證不經過(403)。前端拿到對應的狀態碼會作出相應的處理。html

上述的登陸驗證和權限驗證,後端採用Spring攔截器技術實現。爲了返回指定的狀態碼,使用了HttpServletResponse中的setStatus方法。一切都正常運行,沒問題!但忽然我有了個想法,若是登陸驗證不經過,須要跳轉到專門負責顯示401友好提示信息的頁面,如何作?有人會說使用sendRedirect方法,能夠。還有嗎?前端

個人作法是直接根據響應狀態碼,依賴web.xml中的error-page配置實現報錯頁面的跳轉。相信下面代碼的配置,搞JavaWeb開發的人應該都會熟悉:web

<error-page>
    <error-code>401</error-code>
    <location>/WEB-INF/view/401.jsp</location>
</error-page>

但在真正運行時發現,setStatus確實能夠設置response的狀態碼,卻沒法像設想的那樣,顯示出401.jsp頁面中的內容。通過一番搜索查證,發現使用sendError代替setStatus,能夠達到指望的效果。但是,爲何?sendError和setStatus有何區別?下面是直譯官方API文檔的內容:後端

sendError(int sc):使用指定的狀態碼並清空緩衝,發送一個錯誤響應至客戶端。若是響應已經被提交,這個方法會拋出IllegalStateException。使用這個方法後,響應則應該被認爲已被提交,且不該該再被進行寫操做了。服務器

sendError(int sc, String msg):使用指定的狀態碼發送一個錯誤響應至客戶端。服務器默認會建立一個HTML格式的服務錯誤頁面做爲響應結果,其中包含參數msg指定的文本信息,這個HTML頁面的內容類型爲「text/html」,保留cookies和其餘未修改的響應頭信息。若是一個對應於傳入的錯誤碼的錯誤頁面已經在web.xml中聲明,那麼這個聲明的錯誤頁面將會優先於建議的msg參數服務於客戶端。(ps:相比較上面的方法,我更傾向於前者。使用上面的方法,能夠經過定製不一樣狀態的響應結果顯示於客戶端,咱們應該不想讓客戶端看到服務器建立出的簡單粗暴的頁面吧?)cookie

setStatus(int sc):設置響應的狀態碼。這個方法被用於當響應結果正常時(例如,狀態碼爲SC_OK或SC_MOVED_TEMPORARTLY)設置響應狀態碼。若是發生錯誤,並且來訪者但願調用在web應用中定義的錯誤頁面做爲顯示,那麼應該使用sendError方法代替之。使用setStatus方法以後,容器會清空緩衝並設置Location響應頭,保留cookies和其餘響應頭信息。jsp

從直譯的結果不難發現哈,sendError適用於報錯且存在對應的報錯頁面配置做爲輸出顯示的狀況,而setStatus適用於正常響應的狀況,僅僅能夠改變響應狀態碼而已。code

相關文章
相關標籤/搜索