SpringMVC 攔截器

1、java裏的攔截器是動態攔截Action調用的對象。它提供了一種機制可以使開發者可以定義在一個action執行的前後執行的代碼,也可以在一個action執行前阻止其執行,同時也提供了一種可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中攔截器用於在某個方法或字段被訪問之前,進行攔截然後在之前或之後加入某些操作。

2、實現攔截器

 a)實現HandlerInterceptor接口

package com.wc.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 MyInterceptor implements HandlerInterceptor{
    //在請求處理的方法之前執行
	//如果返回true,執行下一個攔截器,如果返回false,則不執行
	@Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
    	// TODO Auto-generated method stub
    	System.out.println("-------處理前-------");
		return true;
    }
	//在請求處理的方法執行之後執行
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
		System.out.println("-------處理後-------");
		
	}
	//在DispatcherServlet處理後執行-----清理工作
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		// TODO Auto-generated method stub
		
	}
}

  b)配置攔截器

<!-- 攔截器的配置 -->
	<mvc:interceptors>
		<mvc:interceptor>
			<!-- /** 包括路徑及其子路徑
				如果是/admin/* 攔截是的/admin/add,/admin/list etc. 而/admin/user/add不被攔截
				如果是/admin/** 攔截 /admin/add,/admin/list, /admin/user/add etc.
			-->
			<mvc:mapping path="/**"/>
			<bean class="com.wc.interceptor.MyInterceptor"></bean>
		</mvc:interceptor>
	</mvc:interceptors>

3、如果被攔截能否到指定頁面?

使用HttpServletRequest和HttpServletResponse實現轉發

@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object arg2) throws Exception {
    	// TODO Auto-generated method stub
    	System.out.println("-------處理前-------");
    	resp.sendRedirect(req.getContextPath()+"/index.jsp");
		return false;
    }

4、攔截器的應用----登陸攔截器

package com.wc.interceptor;

import java.util.List;

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

import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class LoginInterceptor implements HandlerInterceptor{
    
	private List<String> allowedPass;
	//如果返回true表示不被攔截,執行下一個攔截器,如果返回false表示被攔截,則不執行
	//允許哪些url不被攔截,哪些需要被攔截
	@Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object obj) throws Exception {
    	// TODO Auto-generated method stub
		System.out.println("-------處理前-------");
		String url = req.getRequestURL().toString();
		//先判斷session中是否有
		Object user = req.getSession().getAttribute("user");
		if(user!=null)
			return true;
		for(String temp:allowedPass){
			if(url.endsWith(temp)){
				return true;
			}
		}
		resp.sendRedirect(req.getContextPath()+"/login.jsp");
		return false;
    }
	//在請求處理的方法執行之後執行
	@Override
	public void postHandle(HttpServletRequest req, HttpServletResponse resp, Object obj, ModelAndView maw)
			throws Exception {
		System.out.println("-------處理後-------");
		
	}
	//在DispatcherServlet處理後執行-----清理工作
	@Override
	public void afterCompletion(HttpServletRequest req, HttpServletResponse resp, Object obj, Exception exp)
			throws Exception {
		// TODO Auto-generated method stub
		
	}
	public void setAllowedPass(List<String> allowedPass) {
		this.allowedPass = allowedPass;
	}
}

配置,在XML文件中配置攔截更加靈活

<!-- 攔截器的配置 -->
	<mvc:interceptors>
		<mvc:interceptor>
			<!-- /** 包括路徑及其子路徑   -攔截所有controller
				如果是/admin/* 攔截是的/admin/add,/admin/list etc. 而/admin/user/add不被攔截
				如果是/admin/** 攔截 /admin/add,/admin/list, /admin/user/add etc.
			-->
			<mvc:mapping path="/**"/>
			<mvc:exclude-mapping path=""/>
			<!-- 對應的攔截器 -->
			<bean class="com.wc.interceptor.LoginInterceptor">
				<property name="allowedPass">
					<list>
						<!-- 表示可通過攔截器的 -->
						<value>login.do</value>
						<value>add.do</value>
					</list>
				</property>
			</bean>	
		</mvc:interceptor>
	</mvc:interceptors>


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