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";
	}

猜你喜欢

转载自blog.csdn.net/linlinlinfeng/article/details/82723860