SpringMvc拦截器

103 阅读2分钟

以前没有好好研究拦截器,今天研究一下,拦截器类似于Servlet 中的Filter,一般用来拦截请求,或者过滤一些东西,进行日志处理,编码等等!

 

 

1 SpringMvc拦截器实现机制实现接口HandlerInterceptor  接口中含有三个方法分别是:

 

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

此方法用在请求进入方法之前,参数request 可以获取一些session,获取请求的一些参数值等!

一般可以用来拦截登录,权限等。

return true 继续往下进行,return false; 不往下面执行,以下两个实现类方法不执行。

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

表示进入方法之后,返回视图之前执行。modelAndView参数,可以看到返回视图之前视图中的参数。

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

执行请求方法完成之后进行。一般用去异常处理,日志处理。

 

2 SpringMvc配置:

 

    
	<!-- 配置拦截器 -->
	<mvc:interceptors>
	    <!-- 多个拦截器,按顺序执行 -->    
	    <mvc:interceptor>
	        <mvc:mapping path="/**"/> <!-- 拦截所有的url -->
	        <bean class="com.udeam.intercepit.LoginIntercepit1"/>
	    </mvc:interceptor>
	    

	    <!-- 其他拦截器 -->
	</mvc:interceptors>

 

 

3 SpringMvc 登陆拦截器

public class LoginIntercepit1 implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		
		System.out.println("拦截前1");
	
		if(request.getRequestURI().indexOf("/login") > 0) {
			return true;
			// 这个 if是判断是否是登录的请求,return true 完成之后会执行请求方法。  执行login请求,完成之后在进行下面代码
		}
		
		 
		
		HttpSession session = request.getSession();
		String name = (String) session.getAttribute("name");
		
		if(name != null) {
			return true;
		}
		
		request.getRequestDispatcher("/login.jsp").forward(request, response);
		
		return false;  // false  不放行 ,  true  放行    
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		
		
		System.out.println("拦截中1");
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("拦截后1");
	}

	
	
	
}

​

 

UserController

 

@Controller
public class UserController {
 
	
	@RequestMapping("login")
	public String lgin(String name , String pwd ,HttpServletRequest request) {
		
		if(name.equals("zs") && pwd.equals("zs")) {
			request.getSession().setAttribute("name", name);
		}
		
		request.setAttribute("name",request.getSession().getAttribute("name"));
		return "user";
	}
	
}

 

 

多个拦截器:

在定义两个拦截器,配置并且运行:

public class LoginIntercepit2 implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		
		System.out.println("拦截前2");
		return false;   
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		
		
		System.out.println("拦截中2");
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("拦截后2");
	}

	
	
	
}
public class LoginIntercepit2 implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		
		System.out.println("拦截前3");
		return false;   
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		
		
		System.out.println("拦截中3");
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("拦截后3");
	}

	
	
	
}
	<!-- 配置拦截器 -->
  	<mvc:interceptors>
	    <!-- 多个拦截器,按顺序执行    --> 
	    <mvc:interceptor>
	        <mvc:mapping path="/**"/> <!-- 拦截所有的url包括子url路径 -->
	        <bean class="cn.itvk.intercepit.LoginIntercepit1"/>
	    </mvc:interceptor>
	    
	    <mvc:interceptor>
	     <mvc:mapping path="/**"/>
	        <bean class="cn.itvk.intercepit.LoginIntercepit2"/>
	    </mvc:interceptor>
	    
	    <mvc:interceptor>
	     <mvc:mapping path="/**"/>
	        <bean class="cn.itvk.intercepit.LoginIntercepit3"/>
	    </mvc:interceptor>
	    <!-- 其他拦截器 -->
	</mvc:interceptors>  

运行结果

 

preHandle 方法会顺序执行,postHandle 和  afterCompletion 方法会逆向执行

 

将第二个拦截器 preHandle 返回改为 false, 你会发现后面2个方法不执行;