博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springmvc 实现注解式权限验证
阅读量:6332 次
发布时间:2019-06-22

本文共 4401 字,大约阅读时间需要 14 分钟。

hot3.png

对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在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"%>
Insert title here    这里是登录界面

复制代码

新建包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添加如下内容:

      
     
      
    

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

运行项目:

可以看到执行了我们在springservlet-config.xml定义的HelloworldController的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;}

复制代码

重新运行项目:

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

 

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

转载于:https://my.oschina.net/tinglanrmb32/blog/418714

你可能感兴趣的文章
Android系统的开机画面显示过程分析(6)
查看>>
vivo Hi-Fi+QQ音乐 数字音乐市场的一剂良方
查看>>
Cocos2d-x 3.2 异步动态加载 -- 保卫萝卜开发总结
查看>>
聚焦触宝反侵权事件:中国创业者用什么护航海外市场大门
查看>>
AOP技术基础
查看>>
Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析(2)
查看>>
无线802.11n 2.4G与5G性能测试
查看>>
子域名信息收集攻略
查看>>
[Android]开发数独游戏思路分析过程
查看>>
SpreadJS 类Excel表格控件 - V12 新特性详解
查看>>
理解并取证:IPv6与IPv4在报文结构上的区别
查看>>
EOS主网上线只是开始,如何运营决定未来
查看>>
不用Visual Studio,5分钟轻松实现一张报表
查看>>
(译)如何使用cocos2d和box2d来制作一个Breakout游戏:第一部分
查看>>
计算机图形学(一) 图形系统综述
查看>>
持续集成(CI)- 几种测试的区别(摘录)
查看>>
多用户虚拟Web3D环境Deep MatrixIP9 1.04发布
查看>>
求高手,求解释
查看>>
[MSSQL]NTILE另类分页有么有?!
查看>>
winform datagridview 通过弹出小窗口来隐藏列 和冻结窗口
查看>>