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>


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