• 项目模块--2.统一处理异常


    简介:

      在项目中为了阻止用户和管理员不登陆就进行操作的行为,特意创建登陆异常,并统一管理程序抛出的异常,对异常进行处理。

    步骤一:创建两个异常类

    1.AdminLoginNoException类,管理员未登录异常,当管理员未登录却对数据进行操作时抛出。

    private static final long SerialVersionUID = 1L;    手动设置序列化版本号;

    对象被序列化后,对对象进行修改,也不会改变该序列化版本号(非手动设置的序列化版本号会被更改),可以成功反序列化。

    public class AdminLoginNoException extends Exception {
        private static final long serialVersionUID = 1L;//序列化版本号
        //手动设置序列化版本号,该版本号不会被JVM修改,在对象被序列化后更改对象也可以,序列号不变,反序列化能实现
        public AdminLoginNoException(String message){
            super(message);
        }
    }

    2.UserLoginNoException类,用户为登陆异常,当用户未登录却对数据进行操作时抛出。

    public class UserLoginNoException extends Exception {
        private static final long serialVersionUID = 1L;
        public UserLoginNoException(String message){
            super(message);
        }
    }

    步骤二:创建管理员登陆控制器和前端用户登陆控制器

      两个控制器用来检查管理员或用户是否登陆,如果没用登陆就会抛出相应种类的异常。

    1.BaseController.java用来抛出UserLoginNoException,使用@ModelAttribute标签,标识调用该类中的其它方法前,先调用isLogin方法。

     1 import javax.servlet.http.HttpSession;
     2 
     3 @Controller
     4 public class BaseController {
     5     @ModelAttribute
     6     public void isLogin(HttpSession session) throws UserLoginNoException {
     7         if (session.getAttribute("buser")==null){  /*session.getAttribute()和session.setAttribute
     8             相对应,是客户浏览器和服务器之间相互传递信息的工具*/
     9             throw new UserLoginNoException("您还没有登陆");
    10         }
    11     }
    12 }

    2.BaseController.java

     

     1 import exception.AdminLoginNoException;
     2 import org.springframework.stereotype.Controller;
     3 import org.springframework.web.bind.annotation.ModelAttribute;
     4 
     5 import javax.servlet.http.HttpServletRequest;
     6 import javax.servlet.http.HttpSession;
     7 
     8 @Controller
     9 public class BaseController1 {
    10     @ModelAttribute   //该注解下面的方法,在此类中其它方法被调用前均被调用
    11     public void idLogin(HttpSession session, HttpServletRequest request) throws AdminLoginNoException{
    12         if (session.getAttribute("backgroungUser") == null) {  //session
    13             throw new AdminLoginNoException("没有登陆");
    14         }
    15     }
    16 }

    在其它必须先登录后执行的的控制器类中继承这两个类,便能达到预期的效果。

    步骤三:MyExceptionHandler类对异常进行统一处理

      HandlerExceptionResolver接口是spring提供用来处理异常的接口,当产生异常时会被该类捕获,使用时在方法resolveException中对异常进行处理。

     1 public class MyExceptionHandler implements HandlerExceptionResolver {
     2     @Override
     3     public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
     4         Map<String,Object> model = new HashMap<String,Object>();
     5         model.put("ex",e);
     6         if (e instanceof  AdminLoginNoException){
     7             httpServletRequest.setAttribute("buser",new BackgroungUsertable());
     8             httpServletRequest.setAttribute("msg","没有登陆,请登陆");
     9             return new ModelAndView("/admin/login",model);
    10         }else if (e instanceof UserLoginNoException){
    11             httpServletRequest.setAttribute("buser",new ClientUser());
    12             httpServletRequest.setAttribute("msg","没有登陆,请登录");
    13             return new ModelAndView("/before/login",model);
    14         }else {
    15             return new ModelAndView("/error/error",model);
    16         }
    17     }

    步骤四:将MyExceptionHandler交给bean元素托管

      此步骤仅是为了将MyExceptionHandler的对象的创建,交由spring框架来完成。

    <bean id="MyExceptionResolver" class="exception.MyExceptionHandler"/>
  • 相关阅读:
    【luogu P4139】 上帝与集合的正确用法
    pb_ds学习
    【luogu P3868】 [TJOI2009]猜数字
    BZOJ3040: 最短路(road)
    【luogu P1064】 金明的预算方案
    【luogu P2893】 [USACO08FEB]修路Making the Grade
    【luogu P2801】 教主的魔法
    UVA10816 Travel in Desert
    P2916 [USACO08NOV]安慰奶牛Cheering up the Cow
    【BZOJ 2054】 疯狂的馒头
  • 原文地址:https://www.cnblogs.com/deijiawoyu/p/12502796.html
Copyright © 2020-2023  润新知