Spring3 MVC Login Interceptor(Spring 拦截器)
内部邀请码:C8E245J (不写邀请码,没有现金送)
国内私募机构九鼎控股打造,九鼎投资是在全国股份转让系统挂牌的公众公司,股票代码为430719,为“中国PE第一股”,市值超1000亿元。
原文: http://my.oschina.net/uniquejava/blog/83657
在学spring3 mvc,做了个简单的CRUD,但是用户不登录也能直接访问任何页面。我的想法是写个SecurityInterceptor在preHandle中判断session是不是存在user对象。配置如下:
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/*" /><bean class="smartcrud.common.spring.SecurityInterceptor"></bean></mvc:interceptor> </mvc:interceptors>
代码如下:
public class SecurityInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {// interceptHttpSession session = request.getSession();if (session.getAttribute("user") == null) {throw new AuthorizationException();} else {return true;} }
很快,我发现登录页面是不需要拦截的。。搜索了一下。<mvc:interceptor>没有提供配置exclude url的功能。只能在SecurityInterceptor中手动处理。。于是修改配置如下:
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/*" /><bean class="smartcrud.common.spring.SecurityInterceptor"><property name="excludedUrls"><list><value>/login</value></list></property></bean></mvc:interceptor> </mvc:interceptors>
修改代码如下:
public class SecurityInterceptor implements HandlerInterceptor {private List<String> excludedUrls;public void setExcludedUrls(List<String> excludedUrls) {this.excludedUrls = excludedUrls;}@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {// excluded URLs:// see http://stackoverflow.com/questions/9908124/spring-mvc-3-interceptor-on-all-excluding-some-defined-pathsString requestUri = request.getRequestURI();for (String url : excludedUrls) {if (requestUri.endsWith(url)) {return true;}}// interceptHttpSession session = request.getSession();if (session.getAttribute("user") == null) {// see http://stackoverflow.com/questions/12713873/spring-3-1-how-do-you-send-all-exception-to-one-pagethrow new AuthorizationException();} else {return true;}}
这样以/login结尾的请求不做拦截处理。。
接下来需要处理非/login结尾的情况,此时我设计为抛出一个自定义的AuthorizationException异常。
public class AuthorizationException extends Exception { }
当抛出这个异常时,spring框架应该能够处理它,并将用户导向/WEB-INF/views/adminLogin.jsp页面以便让用户登录。。
搜索了一下资料,配置如下:
<bean id="handlerExceptionResolver"class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><prop key="smartcrud.common.exception.AuthorizationException">redirect:/login</prop></props></property> </bean>
注意这里的视图名为redirect:/login,spring会去找标记了@RequestMapping(value="/login")的方法来处理它。
代码如下:
@Controller public class LoginController {@Autowiredprivate UserService userService;@RequestMapping(value = "/login", method = RequestMethod.GET)public String loginForm() {return "adminLogin";}
如果handlerExceptionResolver那里的视图名没有redirect前缀,像这样
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><prop key="smartcrud.common.exception.AuthorizationException">/login</prop></props></property> </bean>
spring会尝试去找/WEB-INF/views/login.jsp。。如果恰好登录页面不叫这个名字,spring就会给出404,搞不懂spring为什么不去@RequestMapping中查找呢。
参考:
http://stackoverflow.com/questions/9908124/spring-mvc-3-interceptor-on-all-excluding-some-defined-paths
http://stackoverflow.com/questions/12713873/spring-3-1-how-do-you-send-all-exception-to-one-page
Spring3 MVC Login Interceptor(Spring 拦截器)相关推荐
- Spring拦截器配置详解(如何定义一个拦截器)
一.前言 Spring和SpringBoot的拦截器也是对请求进行的系列验证或处理,关于拦截器和过滤器的区别此文不做介绍,之前我看到过一篇相关系列的文章,讲述的还比较详细,给大家参考参考:拦截器与过滤 ...
- Spring—拦截器和过滤器介绍
文章目录 介绍 过滤器(Filter) 拦截器(Interceptor) 包含关系 比较 关注微信公众号:CodingTechWork,一起学习进步. 介绍 过滤器(Filter) 过滤器是Java ...
- Filter(过滤器) 和 interceptor(拦截器)的区别
Filter(过滤器) 和 interceptor(拦截器)的区别 1.拦截器是基于java反射机制的,而过滤器是基于函数回调的. 2.过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容 ...
- AOP(面向切面编程)、Filter(过虑器)、Interceptor(拦截器)
AOP(面向切面编程) 面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ,我们知道,面向对象的特点是继承.多态和封装.而封装就要求将功能分散到不同的对象中去,这在软 ...
- Spring拦截器实现登录拦截
hello,大家好,好久没发文章了,之前一段时间因为没遇到太好的内容.昨天研究了下登录时Spring拦截器实现功能,今天和大家分享下,有问题的话欢迎大家指出与批评,好,下面进入正题. 说起拦截器 ...
- Java(Spring拦截器、过滤器、AOP)
过滤器: 过滤器是servlet提供的API,需要实现javax.servlet.Filter接口.过滤器可以拦截到方法的请求和响应(ServletRequest request, SetvletRe ...
- 「深入源码」Spring拦截器的实现原理和执行机制
我一直以为Spring的拦截器是基于AOP原理实现的,仔细阅读完源码,才知道自己的认知是错误的. 今天我们就从源码的角度剖析下Spring拦截器. 一.创建一个自己的拦截器 实现一个自己的拦截器,需要 ...
- Spring拦截器校验Json格式参数
Json已经成为一种主流的数据传输格式,请求参数是整个RequestBody. 那么,拦截器中如何获取Json呢? 办法是:通过request.getInputStream. RequestBody是 ...
- spring拦截器传递传递参数到controller+Aop切面环绕方法传递参数到目标方法
一.前言 由于业务需要,在网上找了很久得到了这两种方式.本文代码偏少,主要讲解一下怎么传,如何接收,也记录一下,以便之后查看. 二.Spring拦截器传递参数到controller 下面是我拦截器中的 ...
最新文章
- JZOJ 5184. 【NOIP2017提高组模拟6.29】Gift
- Ribbon服务器状态:ServerStats及其断路器原理
- 【SpringBoot实战】员工部门管理页面,增删改查,含源码
- Android开发之Socket通信的方法
- 以太网交换机坏了,能否用光纤收发器来替代?
- 前端学习(1304):package.json
- php项目数据库控制器代码_如何为大型代码库组织Express控制器
- 大型网站技术架构(二)--架构模式(转)
- [CentOS]CentOS下编译CPP文件时报错[undefined reference to `__gxx_personality_v0' collect2: ld]的解决办法...
- 4.4.4 无锁的对象引用:AtomicReference和AtomicStampedReference
- SCU4487 king's trouble I(深搜DFS)
- angular图片裁剪
- 单像空间后方交会编程实现
- 零代码上线小布对话技能:技能平台的实践与思考
- 安卓系统开机时间优化分析
- 计算机语言学考研考什么,语言学及应用语言学考研有哪些内容-考研经验
- Arduino智能小车设计(一)
- js执行oracle函数吗,执行javascript函数
- c# ffmpeg视频转换
- Unable to satisfy the following requirements解决方案