自定义注解+拦截器实现权限控制

}

public void setPopedomModule(String popedomModule) {

this.popedomModule = popedomModule;

}

public String getPopedomPrivilege() {

return popedomPrivilege;

}

public void setPopedomPrivilege(String popedomPrivilege) {

this.popedomPrivilege = popedomPrivilege;

}

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result

  • ((popedomModule == null) ? 0 : popedomModule.hashCode());

result = prime

  • result
  • ((popedomPrivilege == null) ? 0 : popedomPrivilege.hashCode());

return result;

}

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

final SysPopedomId other = (SysPopedomId) obj;

if (popedomModule == null) {

if (other.popedomModule != null)

return false;

} else if (!popedomModule.equals(other.popedomModule))

return false;

if (popedomPrivilege == null) {

if (other.popedomPrivilege != null)

return false;

} else if (!popedomPrivilege.equals(other.popedomPrivilege))

return false;

return true;

}

}

操作权限表:


/**

  • 操作权限表

  • @author grace

*/

@SuppressWarnings(“serial”)

public class SysPopedomPrivilege implements java.io.Serializable {

/*

  • CREATE TABLE sys_popedom_privilege

  • (

  • roleId VARCHAR(36), #权限组编号

  • popedomModule VARCHAR(30), #模块名称

  • popedomPrivilege VARCHAR(30), #操作名称

  • PRIMARY KEY(roleId,popedomModule,popedomPrivilege)

  • )

*/

private SysPopedomPrivilegeId id;

public SysPopedomPrivilegeId getId() {

return id;

}

public void setId(SysPopedomPrivilegeId id) {

this.id = id;

}

}

/**

  • 操作权限表的联合主键类

  • @author grace

*/

@SuppressWarnings(“serial”)

public class SysPopedomPrivilegeId implements java.io.Serializable {

private String roleId;

private String popedomModule;

private String popedomPrivilege;

public String getRoleId() {

return roleId;

}

public void setRoleId(String roleId) {

this.roleId = roleId;

}

public String getPopedomModule() {

return popedomModule;

}

public void setPopedomModule(String popedomModule) {

this.popedomModule = popedomModule;

}

public String getPopedomPrivilege() {

return popedomPrivilege;

}

public void setPopedomPrivilege(String popedomPrivilege) {

this.popedomPrivilege = popedomPrivilege;

}

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result

  • ((popedomModule == null) ? 0 : popedomModule.hashCode());

result = prime

  • result
  • ((popedomPrivilege == null) ? 0 : popedomPrivilege.hashCode());

result = prime * result + ((roleId == null) ? 0 : roleId.hashCode());

return result;

}

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

final SysPopedomPrivilegeId other = (SysPopedomPrivilegeId) obj;

if (popedomModule == null) {

if (other.popedomModule != null)

return false;

} else if (!popedomModule.equals(other.popedomModule))

return false;

if (popedomPrivilege == null) {

if (other.popedomPrivilege != null)

return false;

} else if (!popedomPrivilege.equals(other.popedomPrivilege))

return false;

if (roleId == null) {

if (other.roleId != null)

return false;

} else if (!roleId.equals(other.roleId))

return false;

return true;

}

}

如果需要*.hbm.xml则进行配置。

四、写自定义拦截器

=============

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

/**

  • 自定义拦截器

  • @author grace

*/

@SuppressWarnings(“serial”)

public class LimitInterceptor extends MethodFilterInterceptor{

public String doIntercept(ActionInvocation invocation) throws Exception {

//获取请求的action对象

Object action=invocation.getAction();

//获取请求的方法的名称

String methodName=invocation.getProxy().getMethod();

//获取action中的方法的封装类(action中的方法没有参数)

Method method=action.getClass().getMethod(methodName, null);

//获取request对象

HttpServletRequest request=ServletActionContext.getRequest();

//检查注解

boolean flag=isCheckLimit(request,method);

if(!flag){

//没有权限,通过struts2转到事先定义好的页面

return “popmsg_popedom”;

}

//有权限,可以调用action中的方法

String returnvalue=invocation.invoke();

return returnvalue;

}

public boolean isCheckLimit(HttpServletRequest request, Method method) {

if(method==null){

return false;

}

//获取当前的登陆用户

SysUser sysUser=SessionUtils.getSysUserFormSession(request);

if(sysUser==null){

return false;

}

//如果用户的权限组为空

if(sysUser.getSysRole()==null){

return false;

}

//获取当前登陆用户的权限组id

String roleId=sysUser.getSysRole().getId();

//处理注解

/*

  • @Limit(module=“group”,privilege=“list”)

public String list(){

}

*/

//判断用户请求的method上面是否存在注解

boolean isAnnotationPresent= method.isAnnotationPresent(Limit.class);

//不存在注解

if(!isAnnotationPresent){

return false;

}

//存在注解,拿到由Limit类写的注解

Limit limit=method.getAnnotation(Limit.class);

//获取注解上的值

String module=limit.module(); //模块名称

String privilege=limit.privilege(); //操作名称

/**

  • 如果登陆用户的权限组id+注解上的@Limit(module=“group”,privilege=“list”)

    • 在sys_popedom_privilege表中存在 flag=true;
    • 在sys_popedom_privilege表中不存在 flag=false;

*/

boolean flag=false;

//通过自己封装的方法拿到操作权限的业务层对象

ISysPopedomPrivilegeService sysPopedomPrivilegeService=

(ISysPopedomPrivilegeService)ServiceProvinder.getService(ISysPopedomPrivilegeService.SERVICE_NAME);

//查询sys_popedom_privilege表中的所有的数据

//因为后面用到二级缓存,因此这里直接查询出所有的操作权限,而不是通过登陆用户的权限组来查询

List list=sysPopedomPrivilegeService.findAllSysPopedomPrivileges();

if(list!=null&&list.size()>0){

for(int i=0;i<list.size();i++){

SysPopedomPrivilege s=list.get(i);

if(s!=null){

//判断登陆用户是否拥有该方法的权限:如果登陆用户的roleId和登陆用户访问的方法

//的注释中的module和privilege(例如@Limit(module=“group”,privilege=“list”)),这三个字段

//在sys_popedom_privilege表中有记录与之对应,则代表该用户拥有权限访问此方法

if(roleId.equals(s.getId().getRoleId())&&module.equals(s.getId().getPopedomModule())

&&privilege.equals(s.getId().getPopedomPrivilege())){

flag=true;

break;

}

}

}

}

return flag;

}

}

五、在struts.xml中配置自定义拦截器和没有权限时访问的页面。

======================================

isLogin,logout,top,left

/WEB-INF/page/popmsg_popedom.jsp

六、通过在Action的方法中进行注释,实现权限控制。

===============================

import cn.grace.annotation.Limit;

public class testUserAction {

/** 用户添加页面 */

@Limit(module=“user”,privilege=“add”)

public String add(){

return “add”;

}

/** 用户添加 **/

@Limit(module=“user”,privilege=“save”)

public String save(){

return “save”;

}

/** 用户删除 **/

@Limit(module=“user”,privilege=“delete”)

public String delete(){

return “delete”;

}

/** 用户修改页面 **/

@Limit(module=“user”,privilege=“edit”)

public String edit() {

return “edit”;

}

/** 用户修改 **/

@Limit(module=“user”,privilege=“update”)

public String update() {

return “update”;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。

这不,马上就要到招聘季了,很多朋友又开始准备“金三银四”的春招啦,那我想这份“java高分面试指南”应该起到不小的作用,所以今天想给大家分享一下。

image

请注意:关于这份“java高分面试指南”,每一个方向专题(25个)的题目这里几乎都会列举,在不看答案的情况下,大家可以自行测试一下水平 且由于篇幅原因,这边无法展示所有完整的答案解析
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
可以扫码获取!!(备注Java获取)**

img

最后

一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。

这不,马上就要到招聘季了,很多朋友又开始准备“金三银四”的春招啦,那我想这份“java高分面试指南”应该起到不小的作用,所以今天想给大家分享一下。

[外链图片转存中…(img-cjBWP8UC-1712509502784)]

请注意:关于这份“java高分面试指南”,每一个方向专题(25个)的题目这里几乎都会列举,在不看答案的情况下,大家可以自行测试一下水平 且由于篇幅原因,这边无法展示所有完整的答案解析
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值