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  重启你的项目;开始你的调试吧!


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

相关文章推荐

Spring MVC - 拦截器实现 和 用户登陆例子

1.拦截器   SpringMvc中的拦截器实现了HandlerInterceptor接口,通常使用与身份认证,授权和校验,模板视图,统一处理等;    public class HanderIn...

SpringMVC-Interceptor拦截Session登录

目录(?)[-] 首先新建一个自定义的拦截器新建一个登录失败异常类SpringMVC配置文件LoginControllerjava 背景: 开发的项目都需要账号密...

Spring MVC实现的登录拦截器

之前接触过struts拦截器,但是没有使用过Spring MVC拦截器,今天花了一天时间好好研究了一下。 定义拦截器        SpringMVC 中的Interceptor 拦截请求是通过Han...

使用springmvc拦截器进行登录控制

使用springmvc拦截器和session控制登录和获取登录用户的信息。  1.LoginInterceptor.java 解析session,获取登录用户信息。 public clas...

JavaWeb--Servlet过滤器Filter和SpringMVC的HandlerInterceptor(Session和Cookie登录认证)

拦截一些请求进行处理,比如通过它来进行权限验证,或者是来判断用户是否登陆,日志记录,编码,或者限制时间点访问等等,是非常有必要的。所以就有了此篇文章啦。JavaWeb--Servlet过滤器Filte...

SpringMVC 使用验证框架 Bean Validation(下)

本文接上一篇《SpringMVC 使用验证框架 Bean Validation(上)》:四、Controller 普通参数验证与视图错误信息的展示对于 form 表单提交绑定到对象的验证方式,上面已经...
  • catoop
  • catoop
  • 2016-04-29 22:34
  • 16161

Spring MVC 拦截器

上篇博文我在博客中讲到如何使用Spring MVC框架来实现文件的上传和下载,今天小钱给大家再来分享和介绍Spring MVC框架中相当重要的一块功能——拦截器。 关于拦截器的概念我在这里就不多说了...

【SpringMVC学习11】SpringMVC中的拦截器

Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用...

SpringMVC拦截器

一、拦截器和过滤器的区别:         ①拦截器是基于Java的反射机制的,而过滤器是基于函数回调。   ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。   ③拦截器只能对a...

springmvc 拦截器拦截静态资源

springmvc拦截器interceptors   springmvc拦截器能够对请求的资源路径进行拦截,极大的简化了拦截器的书写。但是,千万千万要注意一点:静态资源的放行。  上代码: ....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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