(轉) ssm 攔截器驗證使用者登入session
阿新 • • 發佈:2019-02-15
public class CommonInterceptor extends HandlerInterceptorAdapter{ private final Logger log = LoggerFactory.getLogger(CommonInterceptor.class); /* * 利用正則對映到需要攔截的路徑 private String mappingURL; public void setMappingURL(String mappingURL) { this.mappingURL = mappingURL; } */ /** * 在業務處理器處理請求之前被呼叫 * 如果返回false * 從當前的攔截器往回執行所有攔截器的afterCompletion(),再退出攔截器鏈 * 如果返回true * 執行下一個攔截器,直到所有的攔截器都執行完畢 * 再執行被攔截的Controller * 然後進入攔截器鏈, * 從最後一個攔截器往回執行所有的postHandle() * 接著再從最後一個攔截器往回執行所有的afterCompletion() */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if ("GET".equalsIgnoreCase(request.getMethod())) { RequestUtil.saveRequest(); } log.info("==============執行順序: 1、preHandle================"); String requestUri = request.getRequestURI(); String contextPath = request.getContextPath(); String url = requestUri.substring(contextPath.length()); log.info("requestUri:"+requestUri); log.info("contextPath:"+contextPath); log.info("url:"+url); User user = (User) request.getSession().getAttribute("userbean"); if(user == null){ response.setCharacterEncoding("UTF-8"); log.info("Interceptor:跳轉到login頁面!"); request.getRequestDispatcher("login.do").include(request, response); return false; }else return true; } /** * 在業務處理器處理請求執行完成後,生成檢視之前執行的動作 * 可在modelAndView中加入資料,比如當前時間 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { log.info("==============執行順序: 2、postHandle================"); if(modelAndView != null){ //加入當前時間 modelAndView.addObject("var", "測試postHandle"); } } /** * 在DispatcherServlet完全處理完請求後被呼叫,可用於清理資源等 * * 當有攔截器丟擲異常時,會從當前攔截器往回執行所有的攔截器的afterCompletion() */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { log.info("==============執行順序: 3、afterCompletion================"); } }
springMVC 配置檔案
<mvc:interceptors> <mvc:interceptor> <!-- 匹配的是url路徑, 如果不配置或/**,將攔截所有的Controller --> <mvc:mapping path="/" /> <mvc:mapping path="/main.do" /> <bean class="com.hys.interceptor.CommonInterceptor"></bean> </mvc:interceptor> <!-- 當設定多個攔截器時,先按順序呼叫preHandle方法,然後逆序呼叫每個攔截器的postHandle和afterCompletion方法 --> </mvc:interceptors>
不攔截 配置
<!--不攔截的連線
<mvc:exclude-mapping path="/login/load.do"/>-->
session 過期處理 iframe 跳轉
HttpSession session = request.getSession(); Object obj = session.getAttribute(Constant.LOGIN_USER); if (obj == null) { PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<script>"); out.println("window.open ('"+request.getContextPath()+"/index.html','_top')"); out.println("</script>"); out.println("</html>"); return false; }