`
jaesonchen
  • 浏览: 311309 次
  • 来自: ...
社区版块
存档分类
最新评论

SpringMVC学习系列(9) 之 实现注解式权限验证

 
阅读更多

对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用servlet中的过滤器Filter来实现。但借助于Spring MVC中的action拦截器我们可以实现注解式的权限验证。

一.首先介绍一下action拦截器:

HandlerInterceptor是Spring MVC为我们提供的拦截器接口,来让我们实现自己的处理逻辑,HandlerInterceptor 的内容如下:

复制代码
public interface HandlerInterceptor {  
    boolean preHandle(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler)   
            throws Exception;  
  
    void postHandle(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler, ModelAndView modelAndView)   
            throws Exception;  
  
    void afterCompletion(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler, Exception ex)  
            throws Exception;  
}
复制代码

可以看到接口有3个方法,其含义如下:

preHandle:在执行action里面的处理逻辑之前执行,它返回的是boolean,这里如果我们返回true在接着执行postHandle和afterCompletion,如果我们返回false则中断执行。

postHandle:在执行action里面的逻辑后返回视图之前执行。

afterCompletion:在action返回视图后执行。

HandlerInterceptorAdapter适配器是Spring MVC为了方便我们使用HandlerInterceptor而对HandlerInterceptor 的默认实现,里面的3个方法没有做任何处理,在preHandle方法直接返回true,这样我们继承HandlerInterceptorAdapter后只需要实现3个方法中我们需要的方法即可,而不像继承HandlerInterceptor一样不管是否需要3个方法都要实现。

当然借助于HandlerInterceptor我们可以实现很多其它功能,比如日志记录、请求处理时间分析等,权限验证只是其中之一。

 

二.下面我们就来一步一步来完成注解式权限验证的功能。

首先添加一个账户的Controller和登录的Action及视图来模拟在没有权限时跳转到登陆页面,内容分别如下:

com.demo.web.controllers包中的AccountController.java:

复制代码
package com.demo.web.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping(value = "/account")
public class AccountController {
    
    @RequestMapping(value="/login", method = {RequestMethod.GET})
    public String login(){
        
        return "login";
    }
    
}
复制代码

views文件夹下的视图login.jsp:

复制代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    这里是登录界面
</body>
</html>
复制代码

新建包com.demo.web.auth,添加自定义注解AuthPassport,内容如下:

复制代码
package com.demo.web.auth;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthPassport {
    boolean validate() default true;
}
复制代码

添加自己的拦截器实现AuthInterceptor继承于HandlerInterceptorAdapter,内容如下:

复制代码
package com.demo.web.auth;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class AuthInterceptor extends HandlerInterceptorAdapter {
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        
        if(handler.getClass().isAssignableFrom(HandlerMethod.class)){
            AuthPassport authPassport = ((HandlerMethod) handler).getMethodAnnotation(AuthPassport.class);
            
            //没有声明需要权限,或者声明不验证权限
                if(authPassport == null || authPassport.validate() == false)
                return true;
            else{                
                //在这里实现自己的权限验证逻辑
                if(false)//如果验证成功返回true(这里直接写false来模拟验证失败的处理)
                    return true;
                else//如果验证失败
                {
                    //返回到登录界面
                    response.sendRedirect("account/login");
                    return false;
                }       
            }
        }
        else
            return true;   
     }
}
复制代码

配置项目的springservlet-config.xml添加如下内容:

<mvc:interceptors>  
    <!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 --> 
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />  
    <!-- 如果不定义 mvc:mapping path 将拦截所有的URL请求 -->
    <bean class="com.demo.web.auth.AuthInterceptor"></bean>
</mvc:interceptors>

这样在执行每个action方法是都会调用AuthInterceptor处理,当判断action上有我们定义AuthPassport注解时就会执行里面的权限验证逻辑。

运行项目:

1

可以看到执行了我们在springservlet-config.xml定义的HelloworldController的index方法。

<!-- 如果当前请求为“/”时,则转发到“/helloworld/index" -->
<mvc:view-controller path="/" view-name="forward:/helloworld/index"/>

下面我们在HelloworldController的index方法上加上自定义注解AuthPassport:

复制代码
@AuthPassport
@RequestMapping(value={"/index","/hello"})
public ModelAndView index(){
    
    ModelAndView modelAndView = new ModelAndView();  
    modelAndView.addObject("message", "Hello World!");  
    modelAndView.setViewName("index");  
    return modelAndView;
}
复制代码

重新运行项目:

2

可以看到正确执行了权限判断逻辑,这样我们只需要在我们在需要权限验证的action上加上这个注解就可以实现权限控制功能了。

 

注解式权限验证的内容到此结束。

 

分享到:
评论

相关推荐

    SpringMVC入门很简单之实现注解式权限验证

    在本文中,我们将深入探讨如何在SpringMVC框架中实现注解式的权限验证。SpringMVC是Java领域中广泛使用的Web开发框架,它为开发者提供了强大的功能,包括模型-视图-控制器(MVC)架构、依赖注入以及丰富的注解支持。...

    企业级开发-SpringMVC使用拦截器实现用户登录权限验证实验报告.docx

    本实验报告将探讨如何利用 SpringMVC 的拦截器(Interceptor)来实现用户登录权限验证,确保只有已登录的用户才能访问特定的受保护资源。 首先,我们来看一下实验的基本步骤: 1. 创建 `User` 类:这是表示用户...

    springmvc权限验证demo

    Spring MVC提供了多种方式来实现权限验证,确保只有授权的用户能够访问特定的资源或执行特定的操作。下面将详细讲解Spring MVC权限验证的相关知识点。 首先,Spring MVC权限验证的基础是Spring Security。Spring ...

    SpringMVC实现注解式权限验证的实例

    本篇文章将深入探讨如何使用Spring MVC的注解式权限验证,通过拦截器(Interceptor)来实现这一功能。 首先,我们需要理解Spring MVC中的拦截器(HandlerInterceptor)。这是一个接口,提供了三个关键方法: 1. `...

    超级详细SpringMVC学习资料

    7. Interceptor:拦截器,可以进行预处理和后处理,例如权限验证、日志记录等。 二、SpringMVC配置 1. 配置SpringMVC:在web.xml中配置DispatcherServlet,并设置servlet-context.xml作为SpringMVC的配置文件。 2. ...

    springmvc注解实现用户注册验证

    在Spring MVC框架中,注解是实现控制器逻辑和视图解析的重要工具,它们极大地简化了代码的编写。本文将深入探讨如何使用Spring MVC注解来实现用户注册验证功能。 首先,我们关注的是`@Controller`注解。这个注解...

    Shiro学习示例,以及与SpringMVC整合,标签注解等

    在这个"Shiro学习示例,以及与SpringMVC整合,标签注解等"项目中,我们可以深入理解Shiro的核心功能以及如何在实际开发中与SpringMVC集成。 首先,Shiro 提供了用户认证(Authentication)机制,允许应用验证用户...

    SpringMVC学习文档

    **SpringMVC学习文档概述** SpringMVC是Spring框架的一个模块,主要负责处理Web应用程序的请求和响应。它是一个基于模型-视图-控制器(MVC)架构模式的轻量级Java Web开发框架,旨在简化Web应用开发并提高可测试性...

    springMVC入门框架(非注解)

    12. **拦截器**:Spring MVC允许添加自定义拦截器,对请求进行预处理和后处理,比如登录检查、权限验证等。 13. **测试**:Spring MVC提供了MockMVC工具,方便进行单元测试和集成测试,模拟HTTP请求并验证...

    springMvc学习相关jar包

    在这个"springMvc学习相关jar包"中,包含了一系列与 Spring MVC 开发相关的 jar 包,这些 jar 包是构建和运行 Spring MVC 应用的基础。下面我们将详细探讨 Spring MVC 的核心概念和关键组件。 1. **...

    spingmvc集成shiro实现权限注解

    9. **测试验证**:编写测试用例,确保权限控制注解能够正常工作,不同角色的用户只能访问其有权限的资源。 在实际应用中,我们还需要关注以下几点: - **异常处理**:确保对Shiro抛出的权限不足等异常进行捕获和...

    权限管理系统hibernate+spring+springMVC

    本项目采用经典的SSH(Spring、Hibernate、SpringMVC)技术栈,结合Maven构建工具和Eclipse开发环境,以及MySQL或Oracle数据库,实现了一个高效、灵活的权限管理系统。 首先,Spring作为核心框架,负责管理应用中的...

    Spring注解驱动开发实战-springMVC

    例如,可以创建一个自定义的Interceptor,通过`@Component`和`@Order`注解来注册和设定拦截器的执行顺序,实现如登录检查、权限控制等功能。此外,还可以通过实现`HandlerAdapter`接口来自定义处理器适配器,扩展对...

    springmvc拦截器实现登录验证

    在本场景中,我们探讨的是如何利用拦截器来实现登录验证功能,确保只有经过身份验证的用户才能访问受保护的资源。 首先,我们需要了解Spring MVC的拦截器工作原理。拦截器链是由多个拦截器组成,每个拦截器都有`...

    SpringMVC+Mybatis+Mysql+权限+拦截器的整合实例 源码程序

    总之,这个实例为学习和理解SpringMVC、Mybatis与Mysql的整合,以及权限管理和拦截器的实现,提供了一个实践性的平台。通过研究提供的源码和SQL脚本,开发者可以深入了解这些技术的交互方式,提升自己的开发能力。

    springMVC实现的权限组件

    在“springMVC实现的权限组件”中,我们探讨的是如何利用Spring MVC来设计和实现一套完整的权限管理系统,包括用户、角色和功能权限的管理。 在权限管理中,用户是系统操作的基本单位,他们可以通过注册或由管理员...

    SpringMVC+JPA 注解开发 maven

    它可以处理登录、权限验证、会话管理等。`@Secured`或`@PreAuthorize`注解可以用来限制对某些方法的访问,基于角色的访问控制(RBAC)可以通过配置实现。 至于Spring拦截器,它允许我们在请求处理前、后以及视图...

    springMVC学习版源码

    10. **HandlerInterceptor**:拦截器允许在请求被处理之前和之后执行自定义逻辑,如权限验证、日志记录等。 11. **@Service和@Repository**:在业务层和服务层,我们通常会使用@Service和@Repository注解来标记业务...

    SpringMVC+Mybatis整合实现简单权限控制系统代码

    在IT行业中,构建一个权限控制...这个系统能够实现用户登录验证、角色分配、权限检查等功能,满足日常的权限管理需求。在实际项目中,可以根据具体需求进行扩展,比如增加日志记录、支持多租户、提供API权限控制等。

    springMVC注解+ security + redis 实例

    综上所述,"springMVC注解+ security + redis 实例"的学习资料将涵盖这些技术的基本用法和整合方式,帮助开发者掌握如何构建一个安全、高效的Web应用。通过这个实例,你可以了解到如何在Spring MVC应用中使用注解...

Global site tag (gtag.js) - Google Analytics