2019独角兽企业重金招聘Python工程师标准>>>

##简介## 本文介绍一种采用annotation来对spring-mvc进行权限控制的方法. 通过枚举类来定义权限项. 将annotation标注到需要控制权限的spring-mvc方法上. 然后,在spring-mvc中定义全局过滤器, 过滤所有spring-mvc方法, 查看方法上的权限annotation信息, 以此对权限进行控制.
程序源代码: https://github.com/eagle0445/sample/

##优点## 编写比较方便, 在需要控制权限的方法上进行annotation的标注即可, ide能够对annotation进行识别支持. 查看权限配置比较方便, 因为annotation就在方法上, 不用去其他地方翻看. 实现方式比较简单.

##具体实现##

###1.建立权限枚举类### 建立权限枚举类型, 用于描述权限的种类, 包含了权限的名称. 每个枚举值中包含了权限中文名称和权限索引值(即权限位). (思考:是否可以直接用中文名称作为枚举值的名称,我在其他程序已经用了中文枚举名称了,暂时没有遇到问题)

<!-- lang: java -->
public enum AuthorityType{
// 包含了枚举的中文名称, 枚举的索引值
WORKER("增删改查员工", 1),SALES_ORDER_CREATE("创建订单", 6),
SALES_ORDER_FIND("查看订单", 7),
SALES_ORDER_MODIFY("修改订单", 8),
SALES_ORDER_DELETE("删除订单", 9),
;
private String name;
private int index;private AuthorityType(String name, int index) {this.name = name;this.index = index;
}
public String getName() {return name;
}
public void setName(String name) {this.name = name;
}
public int getIndex() {return index;
}
public void setIndex(int index) {this.index = index;
}
}

###2.登录方式的枚举类### 登录方式的枚举类, page代表传统登录页面, json表示ajax的登录

<!-- lang: java -->
public enum ResultTypeEnum {
//整页刷新
page,
//json数据
json
}

###3.建立表示权限annotation类### 建立annotation类, 用于标注到需要权限验证的地方

<!-- lang: java -->
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FireAuthority {AuthorityType[] authorityTypes();ResultTypeEnum resultType() default ResultTypeEnum.page;
}

###4.在user类中加入权限字段### 在user用户类中添加文本字段表示权限, 字段长度为250字符(因为mysql默认255个字符,可以代表250个权限应该够用了), 字符内容是0或者1. 1表示有权限, 0表示无权限. 提示: 对于用户的权限配置, 只要将对应的权限位设置为0或者1即可.

<!-- lang: sql -->create table user (id integer not null auto_increment,name varchar(255),right_content varchar(255),primary key (id)) type=InnoDB

###5.权限验证算法### 权限判断方法, 权限判断的实现算法, 用于判断是否有权限

<!-- lang: java -->
public class AuthorityHelper {/*** 判断是否有权限* @param akey  aString中位置的索引值,也就是权限位* @param aString  权限字段,比如 11010101011101* @return*/
public static boolean hasAuthority(int akey,String aString){return ConstanHelper.getAuthorityVaule(akey,rc);if(aString==null || "".equals(aString)){return false;}char value = aString.charAt(akey);if(value == '1'){return true;}return false;}}

###6.建立控制权限的interceptor类### 建立interceptor类, 用于过滤需要控制权限的方法.

<!-- lang: java -->
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;public class AuthorityAnnotationInterceptor extends HandlerInterceptorAdapter {final Logger logger = LoggerFactory.getLogger(getClass());@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {logger.debug("");HandlerMethod handler2=(HandlerMethod) handler;FireAuthority fireAuthority = handler2.getMethodAnnotation(FireAuthority.class);if(null == fireAuthority){//没有声明权限,放行return true;}logger.debug("fireAuthority", fireAuthority.toString());HttpSession session = request.getSession();Worker manager = (Worker)session.getAttribute(SessionHelper.WorkerHandler);boolean aflag = false;for(AuthorityType at:fireAuthority.authorityTypes()){if(AuthorityHelper.hasAuthority(at.getIndex(), manager.getRightContent())==true){aflag = true;break;}}if(false == aflag){if (fireAuthority.resultType() == ResultTypeEnum.page) {//传统的登录页面               StringBuilder sb = new StringBuilder();sb.append(request.getContextPath());sb.append("/oprst.jsp?oprst=false&opmsg=").append(URLEncoder.encode(ControllerProperty.NOT_HAVE_AUTHORITY,"utf-8"));response.sendRedirect(sb.toString());} else if (fireAuthority.resultType() == ResultTypeEnum.json) {//ajax类型的登录提示response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");OutputStream out = response.getOutputStream();PrintWriter pw = new PrintWriter(new OutputStreamWriter(out,"utf-8"));pw.println("{\"result\":false,\"code\":12,\"errorMessage\":\""+ControllerProperty.NOT_HAVE_AUTHORITY+"\"}");pw.flush();pw.close();}return false;}return true;}}

###7.配置interceptor类### 在spring-mvc中配置interceptor, 实现过滤.

<!-- lang: xml --><mvc:interceptors><bean class="interceptor.AuthorityAnnotationInterceptor"></bean></mvc:interceptors>

###8.标注需要控制权限的方法### 在需要控制访问的spring-mvc方法上面加上对应的标注.
//方式一

<!-- lang: java -->
@FireAuthority(AuthorityType. SALES_ORDER_CREATE)
@RequestMapping(value="/save.spr", method=RequestMethod.POST)
public ModelAndView save(String  name) throws Exception {//some code
}

//方式二

<!-- lang: java -->
@FireAuthority(authorityTypes = {AuthorityType.SALES_ORDER_DELETE,AuthorityType.SALES_ORDER_CREATE})@RequestMapping(value="/save.spr", method=RequestMethod.POST)public ModelAndView save(String  name) throws Exception {//some code}

//方式三

    <!-- lang: java -->
@FireAuthority(authorityTypes = AuthorityType.SALES_ORDER_DELETE, resultType=ResultTypeEnum.page)
@RequestMapping(value="/save.spr", method=RequestMethod.POST)
public ModelAndView save(String  name) throws Exception {//some code
}

###9.完成了### ^_^

##后续## 还需要一套界面,以便进行用户权限的配置, 幸运的是本人已经实现了这一功能, 而代码相对比较简单, 将在后面的博客中进行详细解说.
程序源代码: https://github.com/eagle0445/sample/

转载于:https://my.oschina.net/kingfire/blog/102760

一种基于annotation的Spring-mvc权限控制方法相关推荐

  1. spring基于注释的配置_基于注释的Spring MVC Web应用程序入门

    spring基于注释的配置 这是使Maven启动Spring 3 MVC项目的最小方法. 首先创建spring-web-annotation/pom.xml文件,并包含Spring依赖项: <? ...

  2. 基于注释的Spring MVC Web应用程序入门

    这是使Maven启动Spring 3 MVC项目的最小方法. 首先创建spring-web-annotation/pom.xml文件,并包含Spring依赖项: <?xml version=&q ...

  3. 领航机器人广告段子_一种基于领航跟随的移动机器人编队控制方法

    一种基于领航跟随的移动机器人编队控制方法 [技术领域] [0001] 本发明设及移动机器人运动控制领域,尤其设及一种基于领航跟随的移动机器人 编队运动控制方法. [背景技术] [0002] 随着机器人 ...

  4. 基于注解的Spring MVC与JPA如何解决实体的延时加载问题

    本文出处:http://blog.csdn.net/chaijunkun/article/details/7673931,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...

  5. Java Web之基于注解的Spring MVC环境配置

    1.在web.xml中配置前端控制器,拦截请求,然后配置加载SpringMVC的配置文件(处理器映射器.处理器适配器.视图解析器等) <!-- springmvc前端控制器 -->< ...

  6. 基于注解的Spring MVC整合Hibernate(所需jar包,spring和Hibernate整合配置,springMVC配置,重定向,批量删除)

    1.导入jar 2.web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app ver ...

  7. 基于注解的Spring MVC(所需jar包,web.xml配置,Spring文件配置,@Controller,@RequestMapping,@RequestParam,model填参,EL取值)

    1.添加jar 2.web.xml配置: <?xml version="1.0" encoding="UTF-8"?> <web-app ve ...

  8. java around_基于Annotation的Spring AOP: @Around | 学步园

    @Around 增强处理是功能比较强大的增强处理,它近似等于Before 和AfterReturning的总和.@Around既可在执行目标方法之前织入增强动作,也可在执行目标方法之后织入增强动作.@ ...

  9. 基于 Annotation 拦截的 Spring AOP 权限验证方法

    余 清, 软件工程师, IBM 简介: 使用 Annotation 可以非常方便的根据用户的不同角色,分配访问 Java 方法的权限.在 Java Web 开发中,使用这种方法,可以提高系统的松耦合度 ...

  10. Spring MVC 中的基于注解的 Controller

    为什么80%的码农都做不了架构师?>>>    Spring MVC 中的基于注解的 Controller @Controller 基于注解的 Controller   终于来到了基 ...

最新文章

  1. C错误异常处理,异常处理
  2. i386平台和x86-64平台机器代码的区别
  3. 佛山市禅城区计算机培训机构排名前十,佛山名气大的机器人编程教育品牌排名...
  4. 在RedHat4 64位操作系统下,安装Oracle 10g
  5. py-rfcn算法caffe配置,训练及应用到自己的数据集
  6. linux安装grub界面,系统安装: GRUB安装,配置及使用汇总
  7. c语言电报关系的题目,c语言所有题目以跟答案.doc
  8. 「ROI 2017 Day 2」反物质(单调队列优化dp)
  9. Spark调优 shuffle调优
  10. L1-002. 打印沙漏-PAT团体程序设计天梯赛GPLT
  11. python使用ssh 中文_使用Python进行SSH的最简单方法是什么?
  12. Python+Appium+夜神模拟器安装与简单运行(2/2)
  13. webpack@3.6.0(4) -- 配置模块化开发
  14. mysql嵌套查询是从外向内执行的吗_MySQL嵌套查询
  15. KNN实现手写字体的识别
  16. python的发展前景与展望_Python语言在未来的发展前景
  17. php生成gif1009php生成gif,怎样将几张图片做成会动的GIF的动态图像?GIF动画制作软件,将图片制作成GIF动图...
  18. 他是打破跳高世界纪录第一人,79岁倪志钦还在帮助中国田径
  19. java 垃圾回收题目_Java垃圾收集题目分析
  20. bump map(凹凸贴图)的一个简单生成方法

热门文章

  1. 微星安装双系统Linux卡顿,微星笔记本-gf63-1050-win10-ubuntu16双系统安装
  2. 蓝桥杯2016年第七届C/C++省赛B组第三题-凑算式
  3. Socket.io详解
  4. C#_基础_部分类partial(十八)
  5. Python内置函数(10)——float
  6. scrum 12.8
  7. 完美解决:Could not open the editor: Editor could not be initialized
  8. 2020行政区划重新划分_邯郸市的20年,2000年-2020年区划对比,你觉得成绩如何?...
  9. K8s CKA认证学习全套笔记
  10. linux中公钥和私钥的区别以及关系