SpringMVC總結之攔截器Interceptor(例:登入攔截器)
目錄
1.前言
使用攔截器,主要是為了攔截使用者的請求並進行相應的處理,比如通過攔截器進行使用者登入驗證,使用者許可權驗證等;SpringMVC中的攔截器攔截請求是通過實現HandleInterceptor介面來完成;
2.HandleInterceptor介面
2.1 HandleInterceptor介面定義了三個方法:
2.1.1 boolean public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) :該方法在請求處理之前被呼叫,若在一個應用中或者一個請求中存在多個Interceptor,每個Interceptor的呼叫會根據他的宣告順序依次執行;方法返回Boolean型別,當返回false時,表示請求結束,後續的Interceptor和Controller將不會再執行,當返回true時,會據需呼叫下一個Interceptor的preHandle方法,執行到最後一個Interceptor,就會呼叫當前請求的控制器方法。
2.1.2 void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler ModelAndView m):在當前請求被處理之後,在DispatcherServlet進行檢視渲染前呼叫;該方法只有在preHandle返回true時才會執行;postHandle方法被呼叫的方向跟preHandle相反,即後宣告的Interceptor的postHandle反而會先執行。
2.1.3 void afterHandle(HttpServletRequest request, HttpServletResponse response, Object handler,Exception e):該方法只有在preHandle返回true時才會執行,顧名思義,該方法在請求結束之後,即檢視被渲染之後才會執行,主要作用是進行資源清理。
3.攔截器實現使用者登入攔截
3.1 功能描述:使用者必須登入才能訪問應用頁面,若沒有登入直接訪應用任何地址或者session過期,都會被攔截器攔截請求,跳轉至登入頁,提示使用者登入;
3.2 定義LoginInterceptor實現類實現HandleInterceptor介面:
package org.aaron.framework.common.interceptor; import java.io.PrintWriter; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.aaron.framework.common.Constants; import org.aaron.sysMgr.sysUser.entity.SysUser; import org.apache.cxf.transport.http.policy.NoOpPolicyInterceptorProvider; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class LoginInterceptor implements HandlerInterceptor{ private String[] noInterceptors = {"/login/toLogin.do","/login/login.do","/sysUser/toRegister.do","/sysUser/register.do"}; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String requestUrl = request.getServletPath(); System.out.println("=========:"+requestUrl); String isAjax = request.getHeader("X-Requested-With"); String ctx = request.getServletContext().getContextPath(); if (Arrays.asList(noInterceptors).contains(requestUrl)) { return true; } SysUser sysUser = (SysUser) request.getSession().getAttribute(Constants.CURRENT_USER); if (sysUser == null) { /*if (isAjax !=null && isAjax.equals("XMLHttpRequest")) { Map<String,Object> resultMap = new HashMap<>(); resultMap.put("status",0); resultMap.put("msg", Constants.NO_LOGIN); resultMap.put("isLogin", false); resultMap.put("url", ctx); }*/ PrintWriter writer = response.getWriter(); response.setContentType("text/html;charset=utf-8"); writer.print("<script type='text/javascript'>alert('登入資訊過期,請重新登入!');top.location='"+ctx+"/login/toLogin.do'</script> "); writer.close(); } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO Auto-generated method stub } }
3.3 在springmvc.xml(SpringMVC 配置檔案)中配置攔截器:
<mvc:interceptors>
<bean class="org.aaron.framework.common.interceptor.LoginInterceptor"></bean>
</mvc:interceptors>