1. 程式人生 > >Springmvc攔截器的配置與應用

Springmvc攔截器的配置與應用

今天介紹下springmvc學習中的攔截器,常用我們在訪問專案的時候會攔截判斷使用者是否登入等,有點類似於我們在servlet中使用的filter過濾器

1.那麼springmvc攔截器是在什麼地方攔截的(執行規則)?

2.springmvc攔截器是怎麼在專案中應用的?

我們定義一個攔截器的類,實現HandlerInterceptor介面:

接著我們在springmvc的配置檔案中配置攔截

只有當攔截器的方法preHandle返回了true,才可以執行後面的兩個方法

那麼如果我們配置了多個攔截器,那麼他的執行規則怎麼樣的,我們來配置多個攔截器測試

        <!-- SPringmvc的攔截器 ,裡面可以放多個攔截器-->
       <mvc:interceptors>
       <mvc:interceptor>
         <!-- 攔截的路徑-->
           <mvc:mapping path="/**" />
         <!-- 定義的攔截器類-->
           <bean class="com.itheima.springmvc.interceptor.interceptor3"/>
       </mvc:interceptor>
           <mvc:interceptor>
         <!-- 攔截的路徑-->
           <mvc:mapping path="/**" />
         <!-- 定義的攔截器類-->
           <bean class="com.itheima.springmvc.interceptor.interceptor4"/>
       </mvc:interceptor>
       </mvc:interceptors>
package com.itheima.springmvc.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class interceptor4 implements HandlerInterceptor {
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
		System.out.println("preHandle4方法是在controller方法的執行之前執行");
		return true;
	}
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3)
			throws Exception {
		System.out.println("postHandle4方法是方法的執行之後執行");
		
	}
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("afterCompletion4方法是方在jsp-->html頁面渲染後再執行");
		
	}}

我們來看下執行的結果

總結:

preHandle按攔截器定義順序呼叫

postHandler按攔截器定義逆序呼叫

afterCompletion按攔截器定義逆序呼叫

 

postHandler在攔截器鏈內所有攔截器返成功呼叫

afterCompletion只有preHandle返回true才呼叫


攔截器的執行規則大家知道了,那麼我們來應用一下,後面用程式碼來解釋

public class interceptor3 implements HandlerInterceptor {
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
		System.out.println("preHandle3方法是在controller方法的執行之前執行");
		//判斷使用者的請求是否是在登入的頁面,不是的話重定向到登入的頁面
		String requestURI = request.getRequestURI();
		if(!requestURI.contains("/login")){
			String username = (String) request.getSession().getAttribute("USER_SESSION");
			if(null == username){
				response.sendRedirect(request.getContextPath() + "/login.action");
				return false;
			}
		}
		//登入的話直接放行
		return true;
	}
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3)
			throws Exception {
		System.out.println("postHandle3方法是方法的執行之後執行");
		
	}
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("afterCompletion3方法是方在jsp-->html頁面渲染後再執行");
		
	}
	//去登陸的頁面
	@RequestMapping(value = "/login.action",method = RequestMethod.GET)
	public String login(){
		return "login";
	}
	@RequestMapping(value = "/login.action",method = RequestMethod.POST)
	public String login(String username
			,HttpSession httpSession){
		//登入後將資訊放在session中,轉發到列表頁面
		httpSession.setAttribute("USER_SESSION", username);
		return "redirect:/item/itemlist.action";
	}