springMVC-學習總結-攔截器

資料學習參考這裏http://jinnianshilongnian.iteye.com/blog/1752171
springmvc攔截器
public interface HandlerInterceptor {


	boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
	    throws Exception;

	void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
			throws Exception;

	void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception;
}

preHandle:預處理回調方法,實現處理器的預處理(如登錄檢查),第三個參數爲響應的處理器(如我們上一章的Controller實現);返回值:true 表示繼續流程(如調用下一個攔截器或處理器); false表示流程中斷(如登錄檢查失敗),不會繼續調用其他的攔截器或處理器,此時我們需要 通過response來產生響應;

postHandle:後處理回調方法,實現處理器的後處理(但在渲染視圖之前),此時我們可以通過modelAndView(模型和視圖對象)對模型數據進行處 理或對視圖進行處理,modelAndView也可能爲null;

afterCompletion:整個請求處理完畢回調方法,即在視圖渲染完畢時回調;

如果我們不想實現全部的方法,只使用其中的部分方法,可以繼續HandlerInterceptorAdapter(適配器模式)

public class MyInterceptor extends HandlerInterceptorAdapter {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// TODO Auto-generated method stub
		return super.preHandle(request, response, handler);
	}
	
}
入門小程序

定義攔截器:

public class MyInterceptorOne implements HandlerInterceptor {

	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("MyInterceptorOne===preHandle");
		return true;
	}

	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("MyInterceptorOne===postHandle");
		
	}

	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("MyInterceptorOne===afterCompletion");
		
	}

}
MyInterceptorTwo同MyInterceptorOne,但是sysout需要修改;

配置文件:

		<!-- 映射器 -->
		<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
			<property name="interceptors">
				<list>
					<ref bean="myInterceptorOne"/>
					<ref bean="myInterceptorTwo"/>
				</list>
			</property>
		</bean> 
		
		<!-- 適配器 -->
		<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
		
		<!-- 試圖解析器 -->
		<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
		    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  
		    <property name="prefix" value="/WEB-INF/jsp/"/>  
		    <property name="suffix" value=".jsp"/>  
		</bean>
		
		<!-- 處理器 -->
		<bean name="/hello" class="springMVC.HelloWorldController"></bean>
		
		
		<!-- 攔截器 -->
		<bean id="myInterceptorOne" class="lee.springmvc.interceptor.MyInterceptorOne"></bean>
		<bean id="myInterceptorTwo" class="lee.springmvc.interceptor.MyInterceptorTwo"></bean>	

訪問hello控制檯輸出如下:

MyInterceptorOne===preHandle
MyInterceptorTwo===preHandle
MyInterceptorTwo===postHandle
MyInterceptorOne===postHandle
MyInterceptorTwo===afterCompletion
MyInterceptorOne===afterCompletion


用攔截器我們可以進行攔截登錄:

public class LoginInterceptor extends HandlerInterceptorAdapter{

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		//1、請求到登錄頁面 放行  
	    if(request.getServletPath().startsWith("loginUrl")) {  
	        return true;  
	    }  
	          
	    //2、比如退出、首頁等頁面無需登錄  
	          
	    //3、如果用戶已經登錄 放行    
	    if(request.getSession().getAttribute("username") != null) {  
	        //更好的實現方式的使用cookie  
	        return true;  
	    }    
	  //4、如果頁面上某個按鈕進行ajax請求後臺數據。用戶請求前,服務器突然關掉,之後服務器啓動,用戶正好點擊按鈕進行ajax後臺請求
	    	//此時應該進行重定向到登錄頁面,需要加上如下代碼,否則頁面不發送任何改變
	if("XMLHttpRequest".equals(request.getHeader("X-Requested-With")) && request.getSession().getAttribute("username") == null){//判斷是否爲ajax請求
            PrintWriter out = response.getWriter();//如果是ajax請求,返回一個標識,告訴ajax請求無效,需要重新登錄
            out.print("login");
            return false;
        }
	    
	    //5、非法請求 即這些請求需要登錄後才能訪問  
	    //重定向到登錄頁面  
	    response.sendRedirect(request.getContextPath() + "loginUrl");  
	    return false;  
	    
	}
	
}
推薦能使用servlet規範中的過濾器Filte




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章