简介:
在项目中为了阻止用户和管理员不登陆就进行操作的行为,特意创建登陆异常,并统一管理程序抛出的异常,对异常进行处理。
步骤一:创建两个异常类
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"/>