Java自定义异常、全局捕获异常、拦截器 实现动态控制登录超时
参考文章:https://blog.csdn.net/psp0001060/article/details/53380160
自定义异常类
1 package com.jeeplus.common.customException;
2
3 /**
4 * 登陆超时自定义异常
5 */
6 public class LoginTimeOutException extends Exception {
7
8 private String message;
9
10 public LoginTimeOutException() {
11 }
12
13 public LoginTimeOutException(String message) {
14 super(message);
15 this.message = message;
16 }
17
18 @Override
19 public String getMessage() {
20 return message;
21 }
22
23 public void setMessage(String message) {
24 this.message = message;
25 }
26 }
全局捕获异常
1 import org.springframework.web.servlet.HandlerExceptionResolver; 2 import org.springframework.web.servlet.ModelAndView; 3 4 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletResponse; 6 7 /** 8 * 全局异常处理器 9 */ 10 public class OverallExceptionResolver implements HandlerExceptionResolver { 11 @Override 12 public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) { 13 //handler为当前处理器适配器执行的对象 14 String message = null; 15 //判断是否为系统自定义异常。 16 if(e instanceof LoginTimeOutException) { 17 message = ((LoginTimeOutException) e).getMessage(); 18 ModelAndView modelAndView = new ModelAndView(); 19 //跳转到相应的处理页面 20 modelAndView.setViewName("modules/sys/sysLogin"); 21 return modelAndView; 22 } 23 else { 24 e.printStackTrace(); 25 return null; 26 } 27 } 28 }
在springmvc.xml文件中配置
1 <!--全局异常捕获--> 2 <bean id="exceptionResolver" class="com.jeeplus.common.customException.OverallExceptionResolver"></bean>
监听器
1 public class TimeOutInterceptor extends BaseService implements HandlerInterceptor { 2 3 @Autowired 4 IdentityAuthenticationTimeService identityTimeService; 5 6 /** 7 * 判断是否登陆超时 8 * @param request 9 * @param response 10 * @param o 11 * @return 12 * @throws Exception 13 */ 14 @Override 15 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception { 16 Principal principal = UserUtils.getPrincipal(); 17 if (principal != null){ 18 HttpSession sessionStart = request.getSession(); 19 Long time = (Long) sessionStart.getAttribute("accessTime"); 20 21 if (time != null){ 22 Long timeSection = System.currentTimeMillis() - time; 23 Long ts = timeSection/1000/60; 24 Integer a = identityTimeService.getIdentityTime(); 25 logger.info("当前重鉴别时间:" + a + "分钟"); 26 logger.info("距离上次操作:" + ts + "分钟"); 27 if (ts >= a){ 28 logger.info("登录超过:" + a + "分钟,返回登录页!"); 29 UserUtils.getSubject().logout(); 30 throw new LoginTimeOutException("登录超时!"); 31 } 32 } 33 sessionStart.setAttribute("accessTime",System.currentTimeMillis()); 34 } 35 return true; 36 } 37 38 @Override 39 public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { 40 41 } 42 43 @Override 44 public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { 45 46 } 47 }
在springmvc.xml文件中配置监听器
1 <!-- 拦截器配置,拦截顺序:先执行后定义的,排在第一位的最后执行。--> 2 <mvc:interceptors> 3 <mvc:interceptor> 4 <mvc:mapping path="${adminPath}/**" /> 5 <mvc:exclude-mapping path="${adminPath}/"/> 6 <mvc:exclude-mapping path="${adminPath}/login"/> 7 <mvc:exclude-mapping path="${adminPath}/sys/menu/tree"/> 8 <mvc:exclude-mapping path="${adminPath}/sys/menu/treeData"/> 9 <mvc:exclude-mapping path="${adminPath}/oa/oaNotify/self/count"/> 10 <bean class="com.jeeplus.modules.sys.interceptor.LogInterceptor" /> 11 </mvc:interceptor> 12 <!-- 手机视图拦截器 --> 13 <mvc:interceptor> 14 <mvc:mapping path="/**" /> 15 <bean class="com.jeeplus.modules.sys.interceptor.MobileInterceptor" /> 16 </mvc:interceptor> 17 <!--登陆超时验证拦截器--> 18 <mvc:interceptor> 19 <mvc:mapping path="/**" /> 20 <bean class="com.jeeplus.modules.sys.interceptor.TimeOutInterceptor" /> 21 </mvc:interceptor> 22 </mvc:interceptors>