Web层框架对网站中所有异常的统一处理
时间:2022-04-24
本文章向大家介绍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/】
- C# 读写App.config配置文件的方法
- Golang语言社区--Go语言基础第四节类型
- Golang语言社区--go语言编写Web程序
- Golang语言社区--Go语言基础第五节流程控制
- (14)不同基因坐标转换-生信菜鸟团博客2周年精选文章集
- (15)基因组各种版本对应关系-生信菜鸟团博客2周年精选文章集
- go 并发处理脚本
- 生信菜鸟团博客2周年精选文章集(4)NCBI数据库的几个探索
- PHP 的前世今生
- 【直播】我的基因组49:Y染色体的SNV不能用常规流程来找?
- 【直播】我的基因组46:SNV突变(96种)频谱的制作
- 深入剖析-Oracle索引分支块的结构
- 【直播】我的基因组48:我可能测了一个假的全基因组
- 【直播】我的基因组47:测序深度和GC含量的关系
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 03.Android崩溃Crash库之ExceptionHandler分析
- 04.Android崩溃Crash库之Loop拦截崩溃和ANR
- [源码分析] 从实例和源码入手看 Flink 之广播 Broadcast
- [源码分析] 从FlatMap用法到Flink的内部实现
- [白话解析] 通俗解析集成学习之bagging,boosting & 随机森林
- [源码分析] 带你梳理 Flink SQL / Table API内部执行流程
- 从"UDF不应有状态" 切入来剖析Flink SQL代码生成
- [源码分析]从"UDF不应有状态" 切入来剖析Flink SQL代码生成 (修订版)
- [白话解析] 通俗解析集成学习之GBDT
- [源码解析]为什么mapPartition比map更高效
- [记录点滴]Redis实现简单消息队列
- [源码解析] Flink的groupBy和reduce究竟做了什么
- [记录点滴]在Ionic和Android中上传Blob图片
- [源码解析] GroupReduce,GroupCombine 和 Flink SQL group by
- [记录点滴] 小心 Hadoop Speculative 调度策略