1.應用場景
java web項目中,有時我們需要在錯誤發(fā)生時托慨,需要跳轉到錯誤頁面鼻由,給出用戶提示信息,或者顯示站點維護者信息厚棵。發(fā)生錯誤的情況有很多種情況蕉世,做為一個完整的系統(tǒng),盡可能覆蓋所有情況婆硬。針對各種情況的具體措施主要有以下:
(1)特定場景的請求需要跳轉到制定頁面
可以通過自定義攔截器來處理特定環(huán)境的請求狠轻,做特殊處理,比如一些頁面只能在微信瀏覽器里面打開彬犯,不能允許在其他瀏覽器打開向楼。
(2)業(yè)務處理層查吊,控制層代碼產生異常,需要跳轉到錯誤頁面湖蜕,提示用戶
通過配置全局異常處理類來處理異常逻卖,設置跳轉。具體看我的另外一篇文章;
public class ExceptionResolver extends SimpleMappingExceptionResolver
{
@Override
protected ModelAndView doResolveException (HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
{
//登錄異常的錯誤處理
if (ex instanceof NoLoginException)
{ //如果請求是頁面昭抒,不是Json數據评也,跳轉到403頁面(error-page配置)
if (!isJsonRequest)
{
response.setStatus(403);
}
String returnUrl = "";
try
{
//請求頁面的地址
returnUrl = URLEncoder.encode(Constants.BASE_SERVER + request.getRequestURI() + (request.getQueryString() != null ? "?" + request.getQueryString() : ""), "utf-8");
}
catch (UnsupportedEncodingException e)
{
returnUrl = "";
}
//跳轉到登錄頁面,登錄成功后再回到請求頁面地址
String redirectUrl = WapUrl.LOGINPAGE + "?returnUrl=" + returnUrl;
return getModelAndView(redirectUrl, ex, request);
}
//其他異常錯誤
else
{
//如果請求是頁面灭返,不是Json數據盗迟,跳轉到500頁面(error-page配置)
if (!isJsonRequest)
{
response.setStatus(500);
}
return getModelAndView("/exception/500", ex, request);
}
}
(3)請求地址不存在,請求參數錯誤異常
可以通過web.xml的error-page標簽來實現(xiàn)熙含。比如輸入一個不存在地址路徑诈乒,請求參數錯誤
@RequestMapping(value = WapUrl.gobuy, method = RequestMethod.GET)
public String goSaleManCenter(@RequestParam(name = "account", required = true) String account,
HttpServletRequest request, @ModelAttribute("model") ModelMap modelMap) {
//如果請求地址參數account沒有,則出現(xiàn)異常婆芦,返回404狀態(tài)
}
2.error-page用法
error-page只要是一個java web項目便會支持怕磨,而不需要考慮框架插件等的引入。在web.xml中配置消约,主要有兩種用法
2.1 按錯誤狀態(tài)指定跳轉
只要服務器返回如下的400肠鲫,404,500等status狀態(tài)或粮,就可以跳轉到相應的頁面导饲,比如可在代碼中設置狀態(tài)response.setStatus(500);
<!-- 錯誤跳轉頁面 -->
<error-page>
<error-code>400</error-code>
<location>/WEB-INF/ftl/exception/404.ftl</location>
</error-page>
<error-page>
<!-- 路徑不正確 -->
<error-code>404</error-code>
<location>/WEB-INF/ftl/exception/404.ftl</location>
</error-page>
<error-page>
<!-- 不允許的方法 -->
<error-code>405</error-code>
<location>/WEB-INF/ftl/exception/404.ftl</location>
</error-page>
<error-page>
<!-- 內部錯誤 -->
<error-code>500</error-code>
<location>/WEB-INF/ftl/exception/404.ftl</location>
</error-page>
輸入一個不存在的url地址÷炔模可以看到404.ftl被正確顯示渣锦。
2.2 按異常類型指定跳轉
如果對業(yè)務處理層,控制層代碼產生的異常沒有做統(tǒng)一處理氢哮,很多異常都有可能被拋出來而沒有得到非常妥當的處理袋毙。前端用戶會面對一大段異常文本而不知所措。這時也可以設置異常類型指定跳轉冗尤。
比如空指針異常:
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/WEB-INF/jsp/errors/error.jsp</location>
</error-page>