}
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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
一次偶然,从朋友那里得到一份“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高分面试指南”应该起到不小的作用,所以今天想给大家分享一下。
请注意:关于这份“java高分面试指南”,每一个方向专题(25个)的题目这里几乎都会列举,在不看答案的情况下,大家可以自行测试一下水平 且由于篇幅原因,这边无法展示所有完整的答案解析
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
可以扫码获取!!(备注Java获取)**
最后
一次偶然,从朋友那里得到一份“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面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!