• 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/】

  • 相关阅读:
    Flash/Flex学习笔记(30):不用startDrag和stopDrag的对象拖动
    Flash/Flex学习笔记(33):如何用As3协同Flash CS IDE控制MovieClip实例
    Flash/Flex学习笔记(26):AS3自定义右键菜单
    Flash/Flex学习笔记(32):播放音乐并同步显示lyc歌词(适用于Silverlight)
    Flash/Flex学习笔记(35):如何正确监听Stage对象的事件
    jQuery autoComplete 自动完成 支持中文
    黑马程序员视频学习下载地址记录一下
    汉语分词系统 网址
    【转】Lucene.Net 详解
    MongoDB开发学习 开天辟地,经典入门 解决关系型数据库大数据量处理的瓶颈问题
  • 原文地址:https://www.cnblogs.com/1315925303zxz/p/6772784.html
Copyright © 2020-2023  润新知