SpringMVC之Interceptor拦截器之登录拦截器

原创 2016年04月10日 14:50:56

SpringMVC的拦截器是主要作用是拦截用户请求到后台之间的请求,在进入后台之前可以对其进行权限认证和用户登录的限制。

1.定义拦截器;

springmvc中拦截器中主要有两种方式:第一种是实现HandleInterceptor接口,重写里面的方法;第二种是实现WebRequestInterceptor接口,同样的重写里面的方法,实现自己自定义的逻辑处理。

1、实现handleInterceptor接口;

接口中定义了三个方法:preHandle(requsest,response.handle);postHandle(request,response,handle,modleandview);aftercompletion(request,response,handle,ex);下面说说每个方法的作用和作用空间。
1.preHandle(requsest,response.handle) :在请求处理之前调用这个方法,即请求从前台传递到controller之前调用的方法,返回值是boolean,如果返回的是true,那么继续进行下面两个方法;如果返回的是false,请求结束;我的拦截器里面获取了request中的session数据;来验证用户是否登录;如果flag为true返回true;反之返回false;
2.postHandle(request,response,handle,modleandview):由preHandle 方法的解释我们知道这个方法包括后面要说到的afterCompletion 方法都只能是在当前所属的Interceptor 的preHandle 方法的返回值为true 时才能被调用。postHandle 方法,顾名思义就是在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行,这和Struts2 里面的Interceptor 的执行过程有点类型。Struts2 里面的Interceptor 的执行过程也是链式的,只是在Struts2 里面需要手动调用ActionInvocation 的invoke 方法来触发对下一个Interceptor 或者是Action 的调用,然后每一个Interceptor 中在invoke 方法调用之前的内容都是按照声明顺序执行的,而invoke 方法之后的内容就是反向的。
3.aftercompletion(request,response,handle,ex):该方法也是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。

代码说明☺
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

public class SpringMVCInterceptor implements HandlerInterceptor {


	/**
	 * preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用,SpringMVC中的Interceptor拦截器是链式的,可以同时存在
	 * 多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在
	 * Controller方法调用之前调用。SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返
	 * 回值为false,当preHandle的返回值为false的时候整个请求就结束了。
	 */
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {		
<span style="white-space:pre">		</span>HttpSession session = request.getSession();
		Enumeration<String> e = session.getAttributeNames();
		HashMap< String, String> map = new HashMap<String, String>();
		while(e.hasMoreElements()){
			map.put(e.nextElement(),"");
		}
		if (map.containsKey("isLogin")) {
			if (session.getAttribute("isLogin").equals(true)) {
				System.err.println("session 中 username is :"+session.getAttribute("username"));
				return true;
			}else{
				System.err.println("isLogin is false!");
				response.sendError(501, "你还没有登录呢!");
				return false;
			}
		}else{
			System.err.println("there is not exist isLogin flag!");
			response.sendError(502, "这里有点问题,请访问登录页面!");
			return false;
		}
		
}/** * 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之 * 后,也就是在Controller的方法调用之后执行,但是它会在DispatcherServlet进行视图的渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操 * 作。这个方法的链式结构跟正常访问的方向是相反的,也就是说先声明的Interceptor拦截器该方法反而会后调用,这跟Struts2里面的拦截器的执行过程有点像, * 只是Struts2里面的intercept方法中要手动的调用ActionInvocation的invoke方法,Struts2中调用ActionInvocation的invoke方法就是调用下一个Interceptor * 或者是调用action,然后要在Interceptor之前调用的内容都写在调用invoke之前,要在Interceptor之后调用的内容都写在调用invoke方法之后。 */@Overridepublic void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {}/** * 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执行, * 这个方法的主要作用是用于清理资源的,当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。 */@Overridepublic void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception {// TODO Auto-generated method stub}}

2.实现WebRequestInterceptor接口:(这个方法我没有使用;先码,方便后期学习)

WebRequestInterceptor 中也定义了三个方法,我们也是通过这三个方法来实现拦截的。这三个方法都传递了同一个参数WebRequest ,那么这个WebRequest 是什么呢?这个WebRequest 是Spring 定义的一个接口,它里面的方法定义都基本跟HttpServletRequest 一样,在WebRequestInterceptor 中对WebRequest 进行的所有操作都将同步到HttpServletRequest 中,然后在当前请求中一直传递。   (1 )preHandle(WebRequest request) 方法。该方法将在请求处理之前进行调用,也就是说会在Controller 方法调用之前被调用。这个方法跟HandlerInterceptor 中的preHandle 是不同的,主要区别在于该方法的返回值是void ,也就是没有返回值,所以我们一般主要用它来进行资源的准备工作,比如我们在使用Hibernate 的时候可以在这个方法中准备一个Hibernate 的Session 对象,然后利用WebRequest 的setAttribute(name, value, scope) 把它放到WebRequest 的属性中。这里可以说说这个setAttribute 方法的第三个参数scope ,该参数是一个Integer 类型的。在WebRequest 的父层接口RequestAttributes 中对它定义了三个常量:   SCOPE_REQUEST :它的值是0 ,代表只有在request 中可以访问。   SCOPE_SESSION :它的值是1 ,如果环境允许的话它代表的是一个局部的隔离的session,否则就代表普通的session,并且在该session范围内可以访问。   SCOPE_GLOBAL_SESSION :它的值是2 ,如果环境允许的话,它代表的是一个全局共享的session,否则就代表普通的session,并且在该session 范围内可以访问。   (2 )postHandle(WebRequest request, ModelMap model) 方法。该方法将在请求处理之后,也就是在Controller 方法调用之后被调用,但是会在视图返回被渲染之前被调用,所以可以在这个方法里面通过改变数据模型ModelMap 来改变数据的展示。该方法有两个参数,WebRequest 对象是用于传递整个请求数据的,比如在preHandle 中准备的数据都可以通过WebRequest 来传递和访问;ModelMap 就是Controller 处理之后返回的Model 对象,我们可以通过改变它的属性来改变返回的Model 模型。   (3 )afterCompletion(WebRequest request, Exception ex) 方法。该方法会在整个请求处理完成,也就是在视图返回并被渲染之后执行。所以在该方法中可以进行资源的释放操作。而WebRequest 参数就可以把我们在preHandle 中准备的资源传递到这里进行释放。Exception 参数表示的是当前请求的异常对象,如果在Controller 中抛出的异常已经被Spring 的异常处理器给处理了的话,那么这个异常对象就是是null 。
import org.springframework.ui.ModelMap;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.context.request.WebRequestInterceptor;

public class AllInterceptor implements WebRequestInterceptor {
	
	/**
	 * 在请求处理之前执行,该方法主要是用于准备资源数据的,然后可以把它们当做请求属性放到WebRequest中
	 */
	@Override
	public void preHandle(WebRequest request) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("AllInterceptor...............................");
		request.setAttribute("request", "request", WebRequest.SCOPE_REQUEST);//这个是放到request范围内的,所以只能在当前请求中的request中获取到
		request.setAttribute("session", "session", WebRequest.SCOPE_SESSION);//这个是放到session范围内的,如果环境允许的话它只能在局部的隔离的会话中访问,否则就是在普通的当前会话中可以访问
		request.setAttribute("globalSession", "globalSession", WebRequest.SCOPE_GLOBAL_SESSION);//如果环境允许的话,它能在全局共享的会话中访问,否则就是在普通的当前会话中访问
	}

	/**
	 * 该方法将在Controller执行之后,返回视图之前执行,ModelMap表示请求Controller处理之后返回的Model对象,所以可以在
	 * 这个方法中修改ModelMap的属性,从而达到改变返回的模型的效果。
	 */
	@Override
	public void postHandle(WebRequest request, ModelMap map) throws Exception {
		// TODO Auto-generated method stub
		for (String key:map.keySet())
			System.out.println(key + "-------------------------");;
		map.put("name3", "value3");
		map.put("name1", "name1");
	}

	/**
	 * 该方法将在整个请求完成之后,也就是说在视图渲染之后进行调用,主要用于进行一些资源的释放
	 */
	@Override
	public void afterCompletion(WebRequest request, Exception exception)
	throws Exception {
		// TODO Auto-generated method stub
		System.out.println(exception + "-=-=--=--=-=-=-=-=-=-=-=-==-=--=-=-=-=");
	}
	
}

2.将写好的拦截器放到spring容器中:

首先spring.xml中需要定义mvc组件:
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-3.0.xsd
     http://www.springframework.org/schema/mvc
     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

然后定义自己的拦截器:
	<mvc:interceptors>
		<!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
		<bean class="com.host.app.web.interceptor.AllInterceptor"/>//没写,拦截所有的请求
		<mvc:interceptor>
			<mvc:interceptor>
			//拦截指定的请求
	        <mvc:mapping path="/Validate"/>
	        <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->
	        <bean class="com.sinoiov.interceptors.LoginInterceptor"/>
	    </mvc:interceptor>
	</mvc:interceptors>

OK  重启你的项目;开始你的调试吧!


版权声明:本文为博主原创文章,未经博主允许不得转载。

springMVC 拦截器如何做登录检查及页面跳转

 一个非常简单的登录权限拦截器 问题一:登录页面的提交请求肯定是要过滤掉的,目前采用在xml里配置来过滤,可不可以配置不拦截某种请求。如果是按目前这种配置需要拦截请求,当请求太多的时候那就太麻...
  • tianyuxinchuan
  • tianyuxinchuan
  • 2015年12月03日 14:47
  • 2782

通过Spring MVC 的自定义拦截器实现灵活的登录拦截

SpringMVC 中的Interceptor 拦截器,它的主要作用是拦截用户的请求并进行相应的处理。用户可以自定义拦截器来实现特定的功能,比如通过它来进行权限验证,或者是来判断用户是否登陆等。...
  • fullbug
  • fullbug
  • 2016年11月10日 14:39
  • 6510

SpringMVC拦截器实例

简介拦截器可以再请求被控制器处理前后做一些预处理或者后处理。该实例展示一个使用场景:在web开发中,常常需要设置网站的公用信息,比如网站名字,路径,协议等等。一般把这些信息存放到request或者se...
  • csujiangyu
  • csujiangyu
  • 2015年11月16日 11:39
  • 1740

springMVC3学习(七)--Interceptor拦截器(源码)

  • 2014年05月19日 22:46
  • 4.88MB
  • 下载

SpringMVC中使用Interceptor拦截器顺序等

SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那...
  • ufo2910628
  • ufo2910628
  • 2014年04月24日 17:04
  • 38363

springMVC中Interceptor拦截器的使用

1.环境配置 首先,这是在所有SSM环境都部署好的情况下操作: 1.在springMVC的配置文件spring-servlet.xml中配置自动扫描的包(为了使用springMVC注解) ...
  • qq_30258957
  • qq_30258957
  • 2017年03月12日 11:36
  • 2782

SpringMvc 拦截器 Interceptor的基础知识

1.spring的拦截器和struts2的拦截器概念一样 2.实现拦截器 a)实现HandlerInterceptor接口   package cn.com.jit.intercepter; imp...
  • jack__ming
  • jack__ming
  • 2016年05月15日 15:36
  • 295

SpringMVC的拦截器(Interceptor)和过滤器(Filter)详解

一 简介(1)过滤器:依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...
  • xujiangdong1992
  • xujiangdong1992
  • 2017年06月01日 11:54
  • 549

SpringMVC之interceptor拦截器

拦截器Interceptor是SpringMVC中的一个强大控件,它可以在进入处理器之前做一些操作,或者在处理器完成后进行操作,甚至是在渲染视图后进行操作。preHandle,postHandle,a...
  • u014282557
  • u014282557
  • 2017年07月31日 22:24
  • 116

SpringMVC-Interceptor拦截器

一、拦截器介绍 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是...
  • jibaole
  • jibaole
  • 2017年04月11日 18:15
  • 304
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SpringMVC之Interceptor拦截器之登录拦截器
举报原因:
原因补充:

(最多只允许输入30个字)