ExceptionFilter

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.log4j.Logger;

import com.alibaba.fastjson.JSON;
import com.yundaex.common.basic.vo.ResponseVO;
import com.yundaex.common.exception.DefaultResponseException;
import com.yundaex.common.exception.ExceptionHelper;
import com.yundaex.common.exception.WrappedRuntimeException;
import com.yundaex.common.exception.WrappedWriteResponseException;

public class ExceptionFilter implements Filter {

    private static final Logger logger =
            Logger.getLogger(ExceptionFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletResponse res = (HttpServletResponse) response;
        HttpServletRequest req = (HttpServletRequest) request;
        try {
           chain.doFilter(req, res);
       } catch (Exception ex) {
            response.setContentType("text/json; charset=utf-8");
               response.setCharacterEncoding("UTF-8");
               if(logger.isDebugEnabled()) {
                   logger.debug("exception has been captured.");
               }
               String fullStackTrace = ExceptionUtils.getFullStackTrace(ex);
               logger.error(fullStackTrace);
               WrappedRuntimeException gre = ExceptionHelper.convert2GeneralResponseException(ex,DefaultResponseException.class);
               ResponseVO responseVO = ExceptionHelper.generateResponseVOFromGenerateResponseException(gre);
               String result = JSON.toJSONString(responseVO);
               if(logger.isDebugEnabled()) {
                   logger.debug(result);
               }
               try{
                   byte[] bytes = result.getBytes("utf8");
                   ServletOutputStream outputStream = response.getOutputStream();
                   outputStream.write(bytes);
               } catch(Exception e){
                   WrappedRuntimeException e1 = new WrappedWriteResponseException("excpetion handler write response occurs error");
                   throw e1;
               }
       }
    }

    @Override
    public void destroy() {

    }

}
/**
 * HTTP 请求响应对应的实体
 * @author JiangWubo-kris
 * @version 2.0
 * @date 2014-10-11
 */
public class ResponseVO {

    /***
     * 处理结果,TURE/FALSE
     */
    private String result;

    /***
     * 返回的数据
     */
    private Object data;

    /***
     * 异常代码
     */
    private String errorCode;

    /***
     * 描述信息
     */
    private Object remark;

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public String getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    @Override
    public String toString() {
        return "ResponseVO [result=" + result + ", data=" + data
                + ", errorCode=" + errorCode + ", remark=" + remark + "]";
    }

    /**
     * @return the remark
     */
    public Object getRemark() {
        return remark;
    }

    /**
     * @param remark the remark to set
     */
    public void setRemark(Object remark) {
        this.remark = remark;
    }

    public static ResponseVO constructNullValue(){
        ResponseVO responseVO = new ResponseVO();
        responseVO.setResult("TRUE");
        responseVO.setData(new Object());
        return responseVO;
    }
}

web.xml

    <filter>
        <filter-name>exceptionFilter</filter-name>
        <filter-class>com.yundaex.common.exception.filter.ExceptionFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>exceptionFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
时间: 2024-10-02 10:46:58

ExceptionFilter的相关文章

asp.net core MVC 全局过滤器之ExceptionFilter过滤器(一)

本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter过滤器(一) asp.net core MVC 过滤器之ActionFilter过滤器(二) asp.net core MVC 过滤器之ResultFilter过滤器(三) asp.net core MVC 过滤器之ResourceFilter过滤器(四) asp.net core MVC 过滤器之AuthorizationFilter过

浅谈dubbo的ExceptionFilter异常处理

背景 我们的项目使用了dubbo进行不同系统之间的调用. 每个项目都有一个全局的异常处理,对于业务异常,我们会抛出自定义的业务异常(继承RuntimeException). 全局的异常处理会根据不同的异常类型进行不同的处理. 最近我们发现,某个系统调用dubbo请求,provider端(服务提供方)抛出了自定义的业务异常,但consumer端(服务消费方)拿到的并不是自定义的业务异常. 这是为什么呢?还需要从dubbo的ExceptionFilter说起. ExceptionFilter 如果D

MVC四大筛选器—ExceptionFilter

该筛选器是在系统出现异常时触发,可以对抛出的异常进行处理.所有的ExceptionFilter筛选器都是实现自IExceptionFilter接口 public interface IExceptionFilter { void OnException(ExceptionContext filterContext); } 实现OnException方法来实现对异常的自定义处理 MVC4中实现了默认的异常处理机制,源码如下 public virtual void OnException(Excep

Web API 下的 ActionFilter 与 ExceptionFilter

本文重点会标红. 背景需求,在进入action之前做sign验证,以及反正错误时,记录log,返回错误的json形式信息. #region 普通 ActionFilter add by caoheyang 20150319 /// <summary> /// sign 以及参数合法性验证过滤器 add by caoheyang 20150318 /// </summary> public class SignOpenApiAttribute : System.Web.Http.Fi

.Net Core中使用ExceptionFilter

.Net Core中有各种Filter,分别是AuthorizationFilter.ResourceFilter.ExceptionFilter.ActionFilter.ResultFilter.可以把他们看作是.Net Core自带的AOP的扩展封装. 今天来看其中的一种:ExceptionFilter(用于全局的异常处理) 首先新建一个.Net Core MVC的项目 新建一个控制器: 这里我们可以看到代码运行到16行时会报一个索引项超出集合范围的错误 按照常规的思维我们在代码中会加异常

.Net Core(三)MVC Core

MVC Core的改动感觉挺大的,需要的功能大多从Nuget安装,还内置了IOC,支持SelfHost方式运行等等. 一.项目结构的变化创建的新MVC项目的结构发生了变化,比如:静态文件需要统一放置到wwwroot文件夹,配置文件变成了appsettings.json,用startup.cs文件代替了global文件:原先对view命名空间的引用配置在view下的web.config,现在则改成了使用_ViewImport.cshtml文件,并且用razor语法来配置. 二.内置IOCa)Aut

System.Web.Mvc 和 using System.Net.Http 的 Filter

在尝试给webapi增加 ExceptionFilter时,出现了错误,经查询区别如下: System.Web.Mvc.Filters 是给mvc用的 System.Web.Http.Filters 是给webapi用的. MVC用的Filter在如下代码里增加新的filter: using System.Web; using System.Web.Mvc; namespace API { public class FilterConfig { public static void Regist

面向接口可扩展框架之“Mvc扩展框架及DI”

面向接口可扩展框架之“Mvc扩展框架及DI” 标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整合了一下 一.Mvc扩展框架主要功能: 1.Mvc的依赖注入(DI)功能(类MvcDependency) 依赖IContainerFactory接口,不再依赖具体容器 2.Mvc全局过滤器(GlobalFilterProvider) 配置在Mvc的依赖注

Web API系列(三) 异常处理

在上一篇教程中我为大家介绍了Web API中Filter的开发使用,其中讲到ExceptionFilter时留了一个坑:ExceptionFilter只能截获并处理Action执行过程中发生的异常,在Action执行过程之外如果出现异常,ExceptionFilter是无能为力的. 这些异常包括: 1.  Controller构造方法中出现的异常 2.  MessageHandlers中出现的异常 3.  路由过程中出现的异常 4.  Body在序列化/反序列化过程中出现的异常 由此可以看出,E