前言
最近做的项目中,计划使用Spring Security做权限控制,但以前大多项目都是采用spring拦截器来实现。在使用Spring Security之前,首先对spring拦截器进行总结,这有助与对Spring Security的理解。使用spring拦截器做权限控制有点千篇一律,有大量重复的工作,Spring Security其实就是把这些重复的工作抽取成为框架,方便复用。
在Spring MVC的项目中使用Spring 拦截器做权限控制,一般会有两类拦截器:一个登录拦截器和多个权限验证拦截器。
登录拦截器拦截:所有的请求,验证用户是否登录,以及用户名密码是否正确。权限验证拦截器。
多个权限验证拦截器:不同的链接规则使用不的连接器进行拦截,并进行权限验证。
配置方式如下:
<mvc:interceptors> <!--登录拦截器--> <mvc:interceptor> <!--拦截所有请求--> <mvc:mapping path="/**"/> <!—静态资源不需要权限验证--> <mvc:exclude-mapping path="/static/**"/> <ref bean="loginIntercepter"/> </mvc:interceptor> <!--普通拦截器 对应普通管理员--> <mvc:interceptor> <mvc:mapping path="/ update /**"/> <ref bean="commonIntercepter"/> </mvc:interceptor> <!--管理员拦截器 对应超级管理员--> <mvc:interceptor> <mvc:mapping path="/add/**"/> <mvc:mapping path="/delete/**"/> <ref bean="adminIntercepter"/> </mvc:interceptor> <!--省略其他拦截器--> </mvc:interceptors> <bean id=" loginIntercepter " class="com.xx.xx.xx" /> <bean id=" commonIntercepter " class="com.xx.xx.xx" /> <bean id=" adminIntercepter " class="com.xx.xx.xx" />
这里创建了三个spring 拦截器,形成一个拦截器链。正常用户请求会依次通过这三个拦截器,顺序与拦截器的定义顺序相同。对应有三个拦截器bean:loginIntercepter处理登陆权限验证, commonIntercepter对应普通管理员 只允许修改数据,adminIntercepter对应超级管理员 允许新增和删除数据。
Spring 拦截器实现
Spring的拦截器实现有两种方式:
第一种方式:自定义Interceptor类要实现Spring 的HandlerInterceptor 接口,
第二种方式是实现Spring的WebRequestInterceptor接口。
首先来看实现HandlerInterceptor 接口方式,该接口定义如下:
public interface HandlerInterceptor { boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView var4) throws Exception; void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception var4) throws Exception; }
preHandle 方法:在进入具体的Controller方法之前执行。在这个方法体实现里可以做权限校验,以及其他公共检测(比如 安全校验等)。校验通过返回true,进入下一个拦截器或者直接进入Controller方法。第三个参数handler,表示待执行的Controller方法。
postHandle方法:在具体Controller方法方法执行完成后,视图渲染之前执行。主要用途是在视图渲染前做一些通用的准备工作,可以把一些通用的数据放到第四个参数ModelAndView对象里,供视图渲染时使用。
afterCompletion方法:在视图渲染完成之后执行,主要用于在返回页面之前做一些清理工作。比如最常见的使用场景:在preHandle方法中可以把用户的基本信息放到 ThreadLocal中,以便在同一次请求内的任意方法里都可以取到用户信息,由于spring mvc处理用户请求是用的线程池技术,ThreadLocal是与线程绑定的,如果不及时清理就会导致内存泄漏,这时我们必须在afterCompletion方法中调用ThreadLocal的清理方法,清除掉本次请求中的信息。
再来看实现WebRequestInterceptor接口方式,该接口定义如下:
public interface WebRequestInterceptor { void preHandle(WebRequest request) throws Exception; void postHandle(WebRequest request, ModelMap var2) throws Exception; void afterCompletion(WebRequest request, Exception var2) throws Exception; }
可以看到与HandlerInterceptor 的接口定义很类似,三个主要方法名相同,只是参数有些诧异,下面分别来看WebRequestInterceptor接口的三个方法:
preHandle 方法:同样是在调用Controller方法之前执行。但这个方法没有返回值,这是与HandlerInterceptor 接口的最大区别。没有返回值,同时也没有HttpServletResponse参数,说明实现该方法无法实现对请求的拦截并返回页面,其作用仅仅局限于在进入Controller方法之前做一些通用的准备工作,比如放入一些通用的参数到WebRequest对象中,方便Controller方法执行时使用。
postHandle方法:作用与HandlerInterceptor 的postHandle方法相同,在Controller方法执行完成之后 视图渲染之前执行,主要作用是:为视图渲染做通用参数数据准备。
afterCompletion方法:作用与HandlerInterceptor 的afterCompletion方法相同,在视图渲染完成之后做一些清理工作,该方法的第一个参数是Exception类型,说明它还可以捕获到视图渲染过程中的异常,并根据异常做一些通用处理。
通过上述解析不难发现,如果要做权限验证和拦截 只能采用实现 HandlerInterceptor 接口的方式。实现WebRequestInterceptor接口方式,更多是用于一些通用参数准备。
Spring拦截器和过滤器Filter的区别
使用Spring拦截器做权限验证,有点类似于Struts中使用过滤器Filter进行权限验证。但他们也有区别(来自互联网):
1、拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2、拦截器在spring容器中不依赖与servlet容器,过滤器依赖于servlet容器。
3、过滤器在只在Servlet前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。所以在Spring构架的程序中,要优先使用拦截器。。
4、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
5、拦截器可以获取IOC容器中的各个bean,但过滤器就不行,也就是说在拦截器里注入一个service,可以调用业务逻辑更加灵活。
如有不全的地方,望留言补充,谢谢!
另外使用HandlerInterceptor 拦截器做权限控制,需要自己实现用户、角色、权限管理。Spring Security可以帮助我们实现对用户、角色、权限管理的封装,简化权限控制流程,需要注意的是Spring Security使用的是一系列的Filter来实现的。下次将抽时间对如何使用Spring Security进行总结。
转载请注明出处:
相关推荐
下面将详细探讨Spring拦截器的使用以及高级参数绑定和Controller返回值的相关知识。 首先,我们创建一个Spring拦截器需要实现HandlerInterceptor接口或继承HandlerInterceptorAdapter抽象类。以下是一个简单的拦截...
在深入研究Flex-Spring拦截器时,理解Spring AOP的核心概念和AMF的工作原理是至关重要的。通过这样的集成,开发者可以在保持Flex客户端的灵活性和交互性的同时,利用Spring的强大功能来处理复杂的业务逻辑和系统管理...
Spring 拦截器是 Spring 框架中一个非常重要的组件,主要用于处理请求和响应,实现业务逻辑之前和之后的预处理和后处理。它为开发者提供了在 MVC 模式下实现统一处理机制的机会,比如权限验证、日志记录、性能监控等...
而Spring拦截器则是实现AOP的一种方式,它类似于Java的Servlet过滤器,可以在方法调用前后执行自定义的操作。 AOP拦截器在Spring中主要通过`HandlerInterceptor`接口或者`@AspectJ`注解来实现。下面我们将详细探讨...
本文将深入探讨Spring拦截器的一个简单实例,通过源码分析和实际操作,帮助你理解其工作原理。 首先,我们需要了解Spring MVC的处理流程。当一个HTTP请求到达服务器时,Spring MVC会按照配置的DispatcherServlet...
Spring 拦截器是 Spring AOP(面向切面编程)的一个重要组成部分,它允许开发者在方法调用前后插入自定义的行为。在这个简单的例子中,我们将深入理解如何配置和使用 Spring 的拦截器来实现特定的功能。 首先,我们...
在`intercept`方法中,我们实现了类似Spring拦截器的功能,调用`preHandle`和`postHandle`方法,并根据`preHandle`的结果决定是否执行目标方法。 最后,`afterCompletion`方法的调用通常需要手动管理,因为它涉及到...
在本次的“spring MVC(新增拦截器demo)”项目中,我们将重点探讨如何在Spring MVC中添加拦截器来实现对请求的预处理和后处理。 拦截器在Spring MVC中扮演着关键的角色,它们可以用来执行一些全局性的任务,如日志...
这将设置Spring Web相关类的日志级别为DEBUG,以便我们能看到拦截器的执行过程。 启动类通常会包含`@SpringBootApplication`注解,该注解包含了`@EnableAutoConfiguration`,`@ComponentScan`和`@...
Spring Boot提供了对Spring MVC的集成,因此我们可以利用Spring MVC的拦截器机制来实现这些功能。 首先,让我们了解一下Spring Boot中创建拦截器的基本步骤: 1. 创建自定义拦截器类:你需要创建一个实现了`...
Spring拦截器HandlerInterceptor接口代码解析 Spring拦截器HandlerInterceptor接口代码解析是Spring框架中的一种重要机制,它允许开发者在请求处理过程中执行自定义逻辑,以达到验证、日志记录、性能监控、安全检查...
在Spring Boot应用中,登录拦截器是一个至关重要的组件,它用于保护特定的Web资源,确保只有经过身份验证的用户才能访问。Spring Boot结合了Spring MVC框架,提供了方便的方式来实现这样的拦截器。本篇文章将深入...
### Spring AOP 四种创建通知(拦截器)类型详解 Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要模块,它提供了在应用代码中添加横切关注点的能力,如日志记录、事务管理、权限...
在Spring Boot中注册拦截器,我们需要在配置类中使用`@EnableAspectJAutoProxy`开启AOP代理,并通过`@Bean`注解声明拦截器实例。然后,使用`@Around`注解定义切点,即拦截所有的JPA操作。 在实际开发中,为了使分库...
在Spring Boot应用中,拦截器(Interceptor)是Spring MVC框架的一部分,用于在请求处理之前、之后或在实际处理过程中执行一些预定义的任务。这通常包括权限检查、日志记录、性能监控等。自定义拦截器可以帮助我们更...
标题中的“spring配置JSON拦截器VIEW”指的是在Spring框架中设置JSON数据的处理方式,特别是通过拦截器(Interceptor)来优化视图层(View)的响应。在Web开发中,拦截器是一种常用的机制,用于在请求被实际处理之前...
Spring MVC拦截器是Spring Web框架的一个重要组成部分,它允许开发者在处理请求之前或之后执行自定义的操作,例如权限校验、日志记录等。在本篇文章中,我们详细探讨了如何通过Spring MVC拦截器实现session的控制,...
3. **Spring集成**:在Spring3.2中,我们可以使用`<cxf:bus>`和`<cxf:interceptor>`标签将自定义拦截器注册到CXF Bus中。这样,Spring容器会管理拦截器的生命周期,并在需要时注入其他依赖。 4. **拦截器链**:CXF...
在SpringBoot框架中,拦截器是一个非常重要的组件,它能够在请求到达控制器(Controller)之前或者之后对请求进行拦截,以完成一些预处理或后处理操作。拦截器通常用于权限检查、日志记录、性能监控等场景。 拦截器...
### 使用Spring拦截器实现日志管理实例 在Web应用程序中,日志管理是至关重要的,它可以帮助开发者跟踪和诊断系统中的问题。Spring框架提供了一种优雅的方式来实现这一目标,即通过使用`HandlerInterceptor`接口...