`

转:Spring3 MVC Login Interceptor

 
阅读更多

在学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 {
 
  @Override
  public boolean preHandle(HttpServletRequest request,
      HttpServletResponse response, Object handler) throws Exception {
    // intercept
    HttpSession 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;
  }
 
  @Override
  public 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-paths
    String requestUri = request.getRequestURI();
    for (String url : excludedUrls) {
      if (requestUri.endsWith(url)) {
        return true;
      }
    }
 
    // intercept
    HttpSession 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-page
      throw 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 {
  @Autowired
  private 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 

 

 

转载自:http://www.itniwo.net/blog/v/254207.html

 

 

分享到:
评论

相关推荐

    spring boot MVC

    在Spring Boot MVC中,我们可以创建自定义的Interceptor(拦截器)来处理JWT的验证。拦截器会在控制器处理方法之前执行,检查请求头中的JWT,并验证其有效性。如果令牌无效或已过期,拦截器可以阻止请求继续执行,...

    案例9:Spring整合MyBatis与Spring MVC+EasyUI实现电子商城后台用户管理.pdf

    本案例主要介绍的是如何将Spring框架与MyBatis集成,并结合Spring MVC和EasyUI来实现一个电子商城后台的用户管理功能。以下是对整个过程的详细解释: 1. **项目准备与依赖配置**: - 首先,从现有项目复制并重命名...

    案例9:Spring整合MyBatis与Spring MVC+EasyUI实现电子商城后台用户管理.docx

    本案例主要介绍如何整合Spring框架、MyBatis和Spring MVC,并结合EasyUI实现一个电子商城后台的用户管理系统。首先,我们需要准备一个基础项目——digital-ssm,然后将其复制并改名为digital-um,调整部署名称为“/...

    springmvc-login-interceptor

    在这个名为"springmvc-login-interceptor"的项目中,我们关注的核心是Spring MVC的拦截器(Interceptor)功能,它允许开发者在请求被控制器处理之前或之后执行自定义逻辑。拦截器在实际应用中常用于权限验证、日志...

    Spring MVC开发配置

    3. 使用注解驱动:Spring MVC支持注解驱动开发,通过注解可以使配置更加简洁。 4. 数据库集成:如果涉及数据库操作,还需要配置数据源、事务管理器以及DAO层的相关bean。 总之,Spring MVC提供了一套完整的MVC框架...

    spring mvc 用户管理

    这个基于Spring MVC的简易用户管理案例为初学者提供了一个很好的学习平台,让我们一起深入探讨其中的关键知识点。 首先,Spring MVC是Spring框架的一个模块,主要负责处理HTTP请求并返回响应。它采用了模型-视图-...

    springsecurity3.1官方手册(含中文版-英文版)

    3. **认证与授权**:Spring Security支持多种认证机制,如HTTP Basic Auth、Form Login、OAuth等,同时提供了细粒度的授权策略,如基于注解的访问控制(@Secured和@PreAuthorize)。 4. **表达式式访问控制**:...

    spring+springmvc+Interceptor+jwt+redis实现sso单点登录

    在Spring MVC框架中,Interceptor是一个重要的组成部分,它可以在请求处理前、后执行一些操作。在SSO实现中,Interceptor主要负责检查用户的登录状态,并根据不同的情况进行相应的处理。 #### 三、实现步骤 ##### ...

    spring security3笔记

    - **Spring MVC**:与Spring Web MVC无缝集成,轻松保护控制器方法。 - **Spring JDBC/ORM**:与Spring的数据访问层集成,进行用户认证和授权信息的持久化。 - **Spring AOP**:利用Spring的AOP功能实现安全切面...

    SpringMVC拦截器实现登录认证

    3. `spring-aop.jar`:支持AOP(面向切面编程),如声明式事务管理。 4. `spring-context.jar`:扩展了Spring核心,提供ApplicationContext和更多特性。 5. `spring-context-support.jar`:为Spring MVC提供额外支持...

    springmvc权限验证demo

    3. **拦截器与过滤器**:Spring MVC的权限验证通常结合拦截器(`HandlerInterceptor`)和过滤器(`Filter`)一起使用。`Filter`可以用于全局的请求处理,如登录检查、CSRF防护等,而`Interceptor`则可以对特定的...

    SpringMVC拦截器

    &lt;/mvc:interceptor&gt; &lt;/mvc:interceptors&gt; ``` 在这个例子中,`/**` 表示拦截所有请求。如果只想拦截特定路径,可以调整 `mvc:mapping` 的值。 拦截器的执行顺序取决于它们在配置文件中的顺序,先声明的拦截器会先...

    mvc的拦截器控制权限的例子

    在Spring MVC框架中,拦截器(Interceptor)是一个强大的工具,用于在请求被处理之前或之后执行自定义逻辑。它提供了一种机制,可以对HTTP请求进行预处理和后处理,例如进行权限验证、日志记录、性能统计等。在这个...

    SpringMVC拦截器的使用

    在Spring MVC框架中,拦截器(Interceptor)是一个强大的工具,用于在请求被控制器处理之前或之后执行特定的逻辑。它可以用来实现诸如权限验证、日志记录、性能统计、缓存控制等多种功能。在这个主题中,我们将深入...

    SpringMVC - 登录验证成功显示主页

    3. **安全控制**:为了防止跨站请求伪造(CSRF)等安全问题,Spring Security可以集成到Spring MVC项目中。它提供了一套完整的安全解决方案,包括身份验证、授权、会话管理等。登录成功后,Spring Security会生成一...

    struts2+spring3+hibernate3 示例下载

    Struts2、Spring3和Hibernate3是Java Web开发中的三个重要框架,它们分别负责MVC模式中的表现层、业务层和服务层。这个压缩包提供的示例下载,旨在帮助开发者快速理解这三个框架的集成与协同工作。 Struts2是Apache...

    spring-security-3.1.0

    - **MVC集成**:与Spring MVC紧密集成,提供便捷的Web安全配置。 7. **配置** - **XML配置**:传统的配置方式,通过Spring的XML配置文件进行设置。 - **Java配置**:从Spring Security 3.1.0开始,引入了Java...

    Struts2+Spring3+Mybatis3

    Struts2、Spring3和Mybatis3是Java Web开发中常用的三大框架,它们各自负责不同的职责,协同工作能构建出高效、灵活的应用。Struts2是MVC(Model-View-Controller)架构模式的一种实现,负责处理用户请求并展现视图...

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

    Spring MVC框架中,拦截器是一种非常重要的机制,能够在请求处理的不同阶段进行拦截和处理。下面,我们将详细介绍Spring MVC拦截器的实现和用户登陆例子。 一、拦截器的实现 在Spring MVC中,拦截器是通过实现...

    Spring-Security-3中文官方文档.pdf

    文档中还会涵盖Spring Security与其他Spring模块的集成,例如Spring MVC和Spring Data,以及Spring Security与WebSocket、RESTful服务的整合。同时,它会讲解如何处理安全性相关的异常,以及如何实现自定义的安全...

Global site tag (gtag.js) - Google Analytics