Web层框架对网站中所有异常的统一解决
一个网站的异常信息作为专业的人士,是不会轻易暴露给用户的,因为那样狠不安全,显得你漏是一回事,只要还是考虑到网站的数据安全问题,下面给大家分享一下一些常见的web层框架是如何处理统一的异常。
之前都是在Struts2的配置文件中配置拦截器来统一处理系统中所有的异常,给大家带点伪代码吧,好歹曾经用过,呵呵。
配置文件配置信息如下:
<package name="base" extends="struts-default">
<!-- 异常处理 -->
<interceptors>
<!-- 1.声明自定义异常拦截器 -->
<interceptor name="exceptionInterceptor" class="com.it.yycg.framework.exception.ExceptionInterceptor"></interceptor>
<!-- 2.声明拦截器栈 -->
<interceptor-stack name="customStack">
<interceptor-ref name="exceptionInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<!-- 设置默认执行的拦截器 -->
<default-interceptor-ref name="customStack"/>
<!-- 公用的 result -->
<global-results>
<result name="error_jsp" >/common/error.jsp</result>
<!-- 拒绝访问返回页面 -->
<result name="refuse" >/common/refuse.jsp</result>
</global-results> <!-- 配置访问Action返回jsp页面的标签
Struts默认执行类ActionSupport中的execute()方法
class默认ActionSupport
成功后的返回name默认为success
-->
<action name="ui_*_*">
<result>/business/{1}/{2}.jsp</result>
</action>
</package>
Java类伪代码如下:
/**
* 定义一个拦截器,作为系统统一异常处理类
*
* @author Easong
*
*/
public class ExceptionInterceptor extends AbstractInterceptor {
private static final long serialVersionUID = -3570177760250354837L;
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
String result = null;
try {
// 向后继续执行拦截器,最终拦截器执行完成执行action,最终action返回逻辑视图名赋值给result
result = actionInvocation.invoke();
} catch (Exception e) {
e.printStackTrace();
// 进行异常处理
// 异常流程
ExceptionResultInfo exceptionResultInfo = null;
// 如果是自定义的异常,直接获取异常信息
if (e instanceof ExceptionResultInfo) {
exceptionResultInfo = (ExceptionResultInfo) e;
} else if (e instanceof UnknownAccountException || e instanceof IncorrectCredentialsException) {
ResultInfo resultInfo = ResultUtil.createFail("用户名或密码错误!");
exceptionResultInfo = new ExceptionResultInfo(resultInfo);
} else if (e instanceof UnauthorizedException) {
ResultInfo resultInfo = ResultUtil.createFail("没有权限!");
exceptionResultInfo = new ExceptionResultInfo(resultInfo);
}
首先说说springmvc处理统一异常的方式,目前就我了解的有三种:直接使用springmvc提供的异常处理器、自己手动配置自定义全局异常处理器和使用注解(该种方式没用过)。
先说一下第一种吧,它是直接在springmvc的核心配置文件中配置springmvc自身提供的简单异常处理器。
<!-- springmvc提供的简单异常处理器 -->
<!-- <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
定义默认的异常处理页面
<property name="defaultErrorView" value="/WEB-INF/jsp/exception.jsp"/>
定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception
<property name="exceptionAttribute" value="ex"/>
定义需要特殊处理的异常,这是重要点
<property name="exceptionMappings">
<props>
<prop key="com.tgsit.cjd.model.CustomException">exception</prop>
</props>
还可以定义其他的自定义异常
</property>
</bean> -->
第二种就是自己定义一个异常处理器,然后通过在springmvc的核心配置文件中配置即可。
自定义异常处理器类伪代码如下:
/**
* 自定义全局异常处理器:
*/
public class CustomExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) { ex.printStackTrace();
CustomException customException = null;
//如果抛出的是自定义的异常则直接转换
if(ex instanceof CustomException) {
customException = (CustomException) ex;
} else {
//如果抛出的不是自定义的异常则重新构造一个未知错误异常
new SysException("系统正在维护中,请稍后重试...");
}
//向前台返回错误信息
ModelAndView modelAndView = new ModelAndView("exception");
modelAndView.addObject("message", customException.getMessage());
return modelAndView;
}
}
springmvc配置文件配置信息如下(各位在迫不得已的情况复制的时候记得修改一下包名):
<!-- 配置自定义的全局异常处理器 只要实现HandlerExceptionResolver接口就是全局异常处理器-->
<bean class="com.tgsit.cjd.utils.CustomExceptionResolver"/>
最后你随便制造一个异常,不管程序运行时异常还是自定义异常,页面跳转都会跳转到指定页面,再也不会干巴巴的给用户返回500啊、404啊那样sb的错误。可能写的有点糙,但是主干原理都按流程给大家总结了,如有不对,望给为留言指正,谢谢!
最后给大家送上一个开发便捷工具,是一位博友分享的,感觉非常好用,大家瞅一眼吧。【http://www.ofmonkey.com/】
Web层框架对网站中所有异常的统一解决的更多相关文章
- Web层框架对网站中所有异常的统一处理
一个网站的异常信息作为专业的人士,是不会轻易暴露给用户的,因为那样狠不安全,显得你漏是一回事,只要还是考虑到网站的数据安全问题,下面给大家分享一下一些常见的web层框架是如何处理统一的异常. 之前都是 ...
- MVC模式设计的Web层框架初识
struts是个什么东西? struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类 ...
- ASP.NET Web API Selfhost宿主环境中管道、路由
ASP.NET Web API Selfhost宿主环境中管道.路由 前言 前面的几个篇幅对Web API中的路由和管道进行了简单的介绍并没有详细的去说明一些什么,然而ASP.NET Web API这 ...
- 从零开始编写自己的C#框架(17)——Web层后端首页
后端首页是管理员登陆后进入的第一个页面,主要是显示当前登陆用户信息.在线人数.菜单树列表.相关功能按键和系统介绍.让管理员能更方便的找到息想要的内容. 根据不同系统的需要,首页会显示不同的内容,比如显 ...
- 从零开始编写自己的C#框架(16)——Web层后端父类
本章节讲述的各个类是后端系统的核心之一,涉及到系统安全验证.操作日志记录.页面与按键权限控制.后端页面功能封装等内容,希望学习本系列的朋友认真查看新增的类与函数,这对以后使用本框架进行开发时非常重要. ...
- 在 Web 层应用程序中使用Spring
前面已经配置成功后,就可以在Web 层的Servlet或Jsp中调用访问Spring了,如果你 编制的是一个Servlet/Jsp 程序,那么在你的Servlet/Jsp 使用下面的代码通过Sprin ...
- spring-boot+mybatis开发实战:如何在spring-boot中使用myabtis持久层框架
前言: 本项目基于maven构建,使用mybatis-spring-boot作为spring-boot项目的持久层框架 spring-boot中使用mybatis持久层框架与原spring项目使用方式 ...
- 03 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之web层
Github:https://github.com/nnngu 项目源代码:https://github.com/nnngu/nguSeckill 前端交互流程设计 对于一个系统,需要产品经理.前端工 ...
- 在ABP的Web层中实现复杂请求跨域访问
在最近的项目中,后端使用ABP,前端采用React,前后端完全分离.其中大部分接口都通过WebApi层调用,项目中未使用Session.但最后在添加一个网站的验证码验证留言功能时,使用了Session ...
随机推荐
- 1935: [Shoi2007]Tree 园丁的烦恼
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 648 Solved: 273[Submit][ ...
- Centos 7 上安装使用 vscode
#系统信息 Linux localhost.localdomain 3.10.0-327.el7.x86_64 x86_64 x86_64 x86_64 GNU/Linux 进入 vscode 下载 ...
- 一种抛弃GPS的中近距离高精度无线同步新方案
目前,对于需要做同步数据采集的项目,大家不约而同的选用GPS作同步源,用GPS的秒脉冲作同步基准.对于是1000米内的多采集点的应用来说,这是一种浪费. 目前福州慧聚通信技术有限公司推出一款无线同步数 ...
- Python中的变量
多个变量赋值 Python允许你同时为多个变量赋值.例如: a = b = c = 1 以上实例,创建一个整型对象,值为1,三个变量被分配到相同的内存空间上. 您也可以为多个对象指定多个变量.例如: ...
- 【转】深入理解RunLoop
RunLoop 是 iOS 和 OS X 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何 ...
- Android开发之AsyncTask示例Demo
今天做了一个AsyncTask的小Demo,内含注释,通过此Demo,可以对AsyncTask有一个详细的了解 已经将项目上传到了GitHub上(程序有一个小bug,在第一次提交有说明,有解决方法请留 ...
- 2017年3月23日 坚果性能测试Loadrunner 免费公开课
2017-03-23 坚果性能测试1群 607937164 我昨天看了一下飞扬老师的讲义PPT,真的很棒,BAT的专业性能老师果然是有好几把刷子,十分受教,相信周四的公开课一定会让大家收益颇丰的. ...
- Linux shell-grep
grep --help备忘录 Usage: grep [OPTION]... PATTERN [FILE]...Search for PATTERN in each FILE or standard ...
- iOS开发优秀博客和软件推荐
iOSBlogAndTools iOS开发优秀博客和软件推荐 本博客和工具列表由广大iOS开发者收集和推荐,如果大家有好的博客或者工具想要分享请点击:我要提交. 收到大家的提交后会及时收录与更新.Gi ...
- post和get请求的区别
post和get请求的区别: 1.post发送的数据在请求体中,用户看不到 get发送的数据在地址栏中 2.post请求中有content-type,作用是告诉服务器,发送给服务器的数据格式,是和ur ...