一個網站的異常信息作為專業的人士,是不會輕易暴露給用戶的,因為那樣狠不安全,顯得你漏是一回事,只要還是考慮到網站的數據安全問題,下面給大家分享一下一些常見的web層框架是如何處理統一的異常。
之前都是在Struts2的配置文件中配置攔截器來統一處理系統中所有的異常,給大家帶點偽代碼吧,好歹曾經用過,呵呵。
配置文件配置信息如下:
1 <package name="base" extends="struts-default"> 2 <!-- 異常處理 --> 3 <interceptors> 4 <!-- 1.聲明自定義異常攔截器 --> 5 <interceptor name="exceptionInterceptor" class="com.it.yycg.framework.exception.ExceptionInterceptor"></interceptor> 6 <!-- 2.聲明攔截器棧 --> 7 <interceptor-stack name="customStack"> 8 <interceptor-ref name="exceptionInterceptor"/> 9 <interceptor-ref name="defaultStack"/> 10 </interceptor-stack> 11 </interceptors> 12 <!-- 設置默認執行的攔截器 --> 13 <default-interceptor-ref name="customStack"/> 14 <!-- 公用的 result --> 15 <global-results> 16 <result name="error_jsp" >/common/error.jsp</result> 17 <!-- 拒絕訪問返回頁面 --> 18 <result name="refuse" >/common/refuse.jsp</result> 19 </global-results> 20 21 <!-- 配置訪問Action返回jsp頁面的標簽 22 Struts默認執行類ActionSupport中的execute()方法 23 class默認ActionSupport 24 成功后的返回name默認為success 25 --> 26 <action name="ui_*_*"> 27 <result>/business/{1}/{2}.jsp</result> 28 </action> 29 </package>
Java類偽代碼如下:
1 /** 2 * 定義一個攔截器,作為系統統一異常處理類 3 * 4 * @author Easong 5 * 6 */ 7 public class ExceptionInterceptor extends AbstractInterceptor { 9 private static final long serialVersionUID = -3570177760250354837L; 11 @Override 12 public String intercept(ActionInvocation actionInvocation) throws Exception { 13 HttpServletRequest request = ServletActionContext.getRequest(); 14 String result = null; 15 try { 16 // 向后繼續執行攔截器,最終攔截器執行完成執行action,最終action返回邏輯視圖名賦值給result 17 result = actionInvocation.invoke(); 18 } catch (Exception e) { 19 e.printStackTrace(); 21 // 進行異常處理 22 // 異常流程 23 ExceptionResultInfo exceptionResultInfo = null; 25 // 如果是自定義的異常,直接獲取異常信息 26 if (e instanceof ExceptionResultInfo) { 27 exceptionResultInfo = (ExceptionResultInfo) e; 28 } else if (e instanceof UnknownAccountException || e instanceof IncorrectCredentialsException) { 29 ResultInfo resultInfo = ResultUtil.createFail("用戶名或密碼錯誤!"); 30 exceptionResultInfo = new ExceptionResultInfo(resultInfo); 31 } else if (e instanceof UnauthorizedException) { 32 ResultInfo resultInfo = ResultUtil.createFail("沒有權限!"); 33 exceptionResultInfo = new ExceptionResultInfo(resultInfo); 34 }
首先說說springmvc處理統一異常的方式,目前就我了解的有三種:直接使用springmvc提供的異常處理器、自己手動配置自定義全局異常處理器和使用注解(該種方式沒用過)。
先說一下第一種吧,它是直接在springmvc的核心配置文件中配置springmvc自身提供的簡單異常處理器。
1 <!-- springmvc提供的簡單異常處理器 --> 2 <!-- <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 3 定義默認的異常處理頁面 4 <property name="defaultErrorView" value="/WEB-INF/jsp/exception.jsp"/> 5 定義異常處理頁面用來獲取異常信息的變量名,也可不定義,默認名為exception 6 <property name="exceptionAttribute" value="ex"/> 7 定義需要特殊處理的異常,這是重要點 8 <property name="exceptionMappings"> 9 <props> 10 <prop key="com.tgsit.cjd.model.CustomException">exception</prop> 11 </props> 12 還可以定義其他的自定義異常 13 </property> 14 </bean> -->
第二種就是自己定義一個異常處理器,然后通過在springmvc的核心配置文件中配置即可。
自定義異常處理器類偽代碼如下:
1 /** 2 * 自定義全局異常處理器: 3 */ 4 public class CustomExceptionResolver implements HandlerExceptionResolver { 5 @Override 6 public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, 7 Exception ex) { 8 9 ex.printStackTrace(); 10 CustomException customException = null; 11 //如果拋出的是自定義的異常則直接轉換 12 if(ex instanceof CustomException) { 13 customException = (CustomException) ex; 14 } else { 15 //如果拋出的不是自定義的異常則重新構造一個未知錯誤異常 16 new SysException("系統正在維護中,請稍后重試..."); 17 } 18 //向前台返回錯誤信息 19 ModelAndView modelAndView = new ModelAndView("exception"); 20 modelAndView.addObject("message", customException.getMessage()); 21 return modelAndView; 22 } 23 }
springmvc配置文件配置信息如下(各位在迫不得已的情況復制的時候記得修改一下包名):
1 <!-- 配置自定義的全局異常處理器 只要實現HandlerExceptionResolver接口就是全局異常處理器--> 2 <bean class="com.tgsit.cjd.utils.CustomExceptionResolver"/>
最后你隨便制造一個異常,不管程序運行時異常還是自定義異常,頁面跳轉都會跳轉到指定頁面,再也不會干巴巴的給用戶返回500啊、404啊那樣sb的錯誤。可能寫的有點糙,但是主干原理都按流程給大家總結了,如有不對,望給為留言指正,謝謝!
最后給大家送上一個開發便捷工具,是一位博友分享的,感覺非常好用,大家瞅一眼吧。【http://www.ofmonkey.com/】