国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html
内部邀请码: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 拦截器)相关推荐

  1. Spring拦截器配置详解(如何定义一个拦截器)

    一.前言 Spring和SpringBoot的拦截器也是对请求进行的系列验证或处理,关于拦截器和过滤器的区别此文不做介绍,之前我看到过一篇相关系列的文章,讲述的还比较详细,给大家参考参考:拦截器与过滤 ...

  2. Spring—拦截器和过滤器介绍

    文章目录 介绍 过滤器(Filter) 拦截器(Interceptor) 包含关系 比较 关注微信公众号:CodingTechWork,一起学习进步. 介绍 过滤器(Filter) 过滤器是Java ...

  3. Filter(过滤器) 和 interceptor(拦截器)的区别

    Filter(过滤器) 和 interceptor(拦截器)的区别 1.拦截器是基于java反射机制的,而过滤器是基于函数回调的. 2.过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容 ...

  4. AOP(面向切面编程)、Filter(过虑器)、Interceptor(拦截器)

    AOP(面向切面编程) 面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ,我们知道,面向对象的特点是继承.多态和封装.而封装就要求将功能分散到不同的对象中去,这在软 ...

  5. Spring拦截器实现登录拦截

    hello,大家好,好久没发文章了,之前一段时间因为没遇到太好的内容.昨天研究了下登录时Spring拦截器实现功能,今天和大家分享下,有问题的话欢迎大家指出与批评,好,下面进入正题.    说起拦截器 ...

  6. Java(Spring拦截器、过滤器、AOP)

    过滤器: 过滤器是servlet提供的API,需要实现javax.servlet.Filter接口.过滤器可以拦截到方法的请求和响应(ServletRequest request, SetvletRe ...

  7. 「深入源码」Spring拦截器的实现原理和执行机制

    我一直以为Spring的拦截器是基于AOP原理实现的,仔细阅读完源码,才知道自己的认知是错误的. 今天我们就从源码的角度剖析下Spring拦截器. 一.创建一个自己的拦截器 实现一个自己的拦截器,需要 ...

  8. Spring拦截器校验Json格式参数

    Json已经成为一种主流的数据传输格式,请求参数是整个RequestBody. 那么,拦截器中如何获取Json呢? 办法是:通过request.getInputStream. RequestBody是 ...

  9. spring拦截器传递传递参数到controller+Aop切面环绕方法传递参数到目标方法

    一.前言 由于业务需要,在网上找了很久得到了这两种方式.本文代码偏少,主要讲解一下怎么传,如何接收,也记录一下,以便之后查看. 二.Spring拦截器传递参数到controller 下面是我拦截器中的 ...

最新文章

  1. JZOJ 5184. 【NOIP2017提高组模拟6.29】Gift
  2. Ribbon服务器状态:ServerStats及其断路器原理
  3. 【SpringBoot实战】员工部门管理页面,增删改查,含源码
  4. Android开发之Socket通信的方法
  5. 以太网交换机坏了,能否用光纤收发器来替代?
  6. 前端学习(1304):package.json
  7. php项目数据库控制器代码_如何为大型代码库组织Express控制器
  8. 大型网站技术架构(二)--架构模式(转)
  9. [CentOS]CentOS下编译CPP文件时报错[undefined reference to `__gxx_personality_v0' collect2: ld]的解决办法...
  10. 4.4.4 无锁的对象引用:AtomicReference和AtomicStampedReference
  11. SCU4487 king's trouble I(深搜DFS)
  12. angular图片裁剪
  13. 单像空间后方交会编程实现
  14. 零代码上线小布对话技能:技能平台的实践与思考
  15. 安卓系统开机时间优化分析
  16. 计算机语言学考研考什么,语言学及应用语言学考研有哪些内容-考研经验
  17. Arduino智能小车设计(一)
  18. js执行oracle函数吗,执行javascript函数
  19. c# ffmpeg视频转换
  20. Unable to satisfy the following requirements解决方案

热门文章

  1. iscsi存储的简单配置
  2. eclipse打开当前文件所在文件夹
  3. 科普文丨Java 单元测试相关概念理清
  4. Github 上 10 个值得学习的 Springboot 开源项目
  5. 一份数据分析学习清单.xls
  6. css3 仿aero,让Qt支持Win7的Aero和毛玻璃效果
  7. MySQL高级 - 锁 - MyISAM表锁 - 查看锁争用情况
  8. TopicPartition的存储
  9. J .U.C 简介-Lock
  10. 执行SQL-MapperProxy.invoke()