Web層框架對網站中所有異常的統一處理


  一個網站的異常信息作為專業的人士,是不會輕易暴露給用戶的,因為那樣狠不安全,顯得你漏是一回事,只要還是考慮到網站的數據安全問題,下面給大家分享一下一些常見的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/】

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM