參考文章: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>