1. 程式人生 > >SpringMVC總結之攔截器Interceptor(例:登入攔截器)

SpringMVC總結之攔截器Interceptor(例:登入攔截器)

目錄

 

1.前言

2.HandleInterceptor介面

3.攔截器實現使用者登入攔截


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>