@ControllerAdvice -- 处理异常示例

Class : SessionInterceptor

package com.estate.web.filter;

import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.ucenter.api.exception.SessionException;
import com.ucenter.api.exception.SignatureException;
import com.ucenter.api.exception.TimeOutException;
import com.ucenter.api.session.bean.Result;
import com.ucenter.api.session.service.IWebSessionService;

public class SessionInterceptor extends HandlerInterceptorAdapter {
    @Resource
    private IWebSessionService webSessionService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 从request中获取sessionid
        String sessionid = request.getParameter("sessionid");
        if (StringUtils.isBlank(sessionid)) {
            // 从cookies中获取sessionid
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    if ("sessionid".equals(cookie.getName())) {
                        sessionid = cookie.getValue();
                    }
                }
            }
        }
        if (StringUtils.isBlank(sessionid))
            throw new SessionException();
        // 获取时间戳
        long timestamp = NumberUtils.toLong(request.getParameter("timestamp"), 0);
        if (timestamp <= 0)
            throw new TimeOutException();
        // 获取签名
        String signature = request.getParameter("signature");
        if (StringUtils.isBlank(signature))
            throw new SignatureException();
        // dubbo校验
        Result result = webSessionService.checkSessionid(sessionid, signature, timestamp);

        // 校验成功,将sessionid放入request对象中
        request.setAttribute("sessionid", sessionid);
        request.setAttribute("ecid", result.getEcid());
        request.setAttribute("uid", result.getUid());
        return true;

    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        super.postHandle(request, response, handler, modelAndView);
    }
}

Class : GlobalExceptionHandler

package com.xindatai.ibs.web.exception;

import java.io.IOException;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.ucenter.api.exception.SessionException;
import com.ucenter.api.exception.SignatureException;
import com.ucenter.api.exception.TimeOutException;
import com.xindatai.common.web.resp.BaseRespWriter;

@ControllerAdvice
public class GlobalExceptionHandler {
    public static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "IOException occured")
    @ExceptionHandler(IOException.class)
    @ResponseBody
    public void handleIOException() {
        // returning 404 error code
    }

    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    @ExceptionHandler(TimeOutException.class)
    public void timeOutException(HttpServletRequest request, HttpServletResponse response, TimeOutException ex) throws IOException {
        outputMessage(response, JSON.toJSONString(ex.getWriter(), SerializerFeature.DisableCircularReferenceDetect));
        // return JSON.toJSONString(ex.getWriter(), SerializerFeature.DisableCircularReferenceDetect);
    }

    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    @ExceptionHandler(SessionException.class)
    public void sessionException(HttpServletRequest request, HttpServletResponse response, SessionException ex) throws IOException {
        outputMessage(response, JSON.toJSONString(ex.getWriter(), SerializerFeature.DisableCircularReferenceDetect));
        // return JSON.toJSONString(ex.getWriter(), SerializerFeature.DisableCircularReferenceDetect);
    }

    // @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    @ExceptionHandler(SignatureException.class)
    public void tokenException(HttpServletRequest request, HttpServletResponse response, SignatureException ex) throws IOException {
        outputMessage(response, JSON.toJSONString(ex.getWriter(), SerializerFeature.DisableCircularReferenceDetect));
    }

    @ExceptionHandler
    @ResponseBody
    public void handleException(HttpServletRequest request, HttpServletResponse response, Exception e) throws IOException {
        LOGGER.error("API Exception! ", e);
        BaseRespWriter writer = new BaseRespWriter();
        writer.setErrMsg("API Exception!");
        outputMessage(response, JSON.toJSONString(writer));
    }

    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    @ExceptionHandler(BindException.class)
    public void bindException(HttpServletRequest request, HttpServletResponse response, Exception e) throws IOException {
        LOGGER.error("Param Exception! ", e);
        BaseRespWriter writer = new BaseRespWriter();
        writer.setErrMsg("Param Exception!");
        outputMessage(response, JSON.toJSONString(writer));
    }

    private void outputMessage(HttpServletResponse response, String errMsg) throws IOException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/json");
        ServletOutputStream os = response.getOutputStream();
        os.write(errMsg.getBytes("utf-8"));
    }

}

啦啦啦

时间: 2024-10-09 19:28:02

@ControllerAdvice -- 处理异常示例的相关文章

@ControllerAdvice 拦截异常并统一处理

在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@ModelAttribute,并应用到所有@RequestMapping中.参考:@ControllerAdvice 文档 一.介绍 创建 MyControllerAdvice,并添加 @ControllerAdvice注解. package com.sam.demo.controller; import org.springframework.ui

Spring Boot @ControllerAdvice 拦截异常并统一处理

在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@ModelAttribute,并应用到所有@RequestMapping中.参考:@ControllerAdvice 文档 一.介绍 创建 MyControllerAdvice,并添加 @ControllerAdvice注解. package com.sam.demo.controller; import org.springframework.ui

01.异常捕获

什么是异常? 解释:语法上没有错误,在程序运行的过程当中,犹豫某些原因,程序出现了错误,不能再正常运行. 我们在程序中经常会出现各种各样的异常,如果想要程序坚强一点, 我么应该经常性的的使用try-catch来进行异常捕获. 窍门: 哪行代码有可能出现异常,我们就try它一下 语法: try { 可能会出现异常的代码; } catch { 出现异常后要执行的代码; } 执行过程: 如果try中的的代码,没有出现异常,catch中的代码不会被执行. 如果try中的代码出现了异常,在出现异常的代码之

Python 标准异常总结

在我们编写脚本或者进行软件开发过程中总会遇见很多的异常和错误,而python里面有两个非常重要的功能,能够很好的处理异常和任何意外错误,这两个功能就是异常处理和断言. 异常处理:主要包含语法错误和其他的标准异常,标准异常介绍如下表. 断言:断言是一种理智检查,当程序的测试完成,你可以打开或关闭.断言的最简单的方法就是把它比作 raise-if 语句 (或者更准确,加 raise-if-not 声明). 一个表达式进行测试,如果结果出现 false,将引发异常.断言是由 assert 语句,在Py

08. Object类、异常类

八.黑马程序员_Object类.异常类 A.Object类  B.异常类 A.Object类介绍 a.介绍 Object类是所有类的直接或间接父类,它里面定义的功能是所有类都具备的. b.Object类中常用的方法有 getClass():返回该对像的运行时类.它返回一个Class类型的对像.在反射中较常用: toString():返回该对像的字符串表现形式.返回值为String类型.通常我们都要覆写这个方法: hashCode():返回该对象的哈希码值.它返回一个int类型的值.通常情况下我们

MathType弧度符号显示异常该怎样解决

MathType能够输入很多数学符号,比Word中自带的数学公式编辑器要方便快捷很多,同时还能输入它不能输入的符号,比如弧度符号,但有时我们可能会发现在MathType中输入的弧度符号会显示异常,那么遇到这个问题该怎么进行解决呢? 若有疑问可直接访问:http://www.mathtype.cn/wenti/hudu-fuhao.html 弧度符号显示异常示例: 具体解决办法如下:        1.双击公式进入到MathType编辑窗口,选中弧度符号,选择"样式"--"定义

Lambda 表达式的示例-来源(MSDN)

本文演示如何在你的程序中使用 lambda 表达式. 有关 lambda 表达式的概述,请参阅 C++ 中的 Lambda 表达式. 有关 lambda 表达式结构的详细信息,请参阅 Lambda 表达式语法. 本文内容 声明 Lambda 表达式 调用 Lambda 表达式 嵌套 Lambda 表达式 高阶 Lambda 函数 在函数中使用 Lambda 表达式 配合使用 Lambda 表达式和模板 处理异常 配合使用 Lambda 表达式和托管类型 声明 Lambda 表达式 示例 1 由于

C# .NET编程基础-throw异常处理-Email格式检测示例

常用的异常处理有两类try-catch语句和throw语句. try-catch语句通常用于不可预见的错误出现时的异常处理. throw语句通常用于只要不满足特定要求时就抛出异常. 下面给大家举个用throw处理Email格式输入不正确的异常示例,Email格式检测对有些朋友来说确实是个问题,Email无非就是一个字符串,所以我们检测Email格式是否正确只需要检查'@'和'.'两个字符的位置是否正确 首先我自定义了一个异常类EmailErrorException. 然后,我们定义一个Check

[六字真言]4.叭.SpringMVC异常痛苦

"叭",除畜生道劳役之苦: 在学过的三阶段的时候,我们对SpringMVC的异常处理,一直可以算是简单中透着暴力,不要不重视异常!真的很重要,不要让它处在尴尬的位置! 在二阶段或者说三阶段中,技术一方面其中我认为最关键的地方是MVC思想的理解,对MVC理解程度决定着你学习过程中的难易程度,虽然有点夸张! 例如,当我们产生了一个 非业务异常 ,或者 非本业务可以处理的其他业务异常 ,那么我们一般会一直往 上层抛 (或者适当包装后继续抛出)直到 控制层 [我们就是这么解决问题,不知道你是否