SSH 结构中 不同角色登录,显示不同的菜单
关于这个功能,这里也就是提供一个思路,在做项目的时候因为要用到,肯定存在更好的方法,此思路仅供参考。
一、关于前台页面的接收方式
这里使用struts2的标签: <s:iterator value="值栈中的值"> 来从struts2的值栈中拿到需要的值。
<s:iterator value="#menusList">
<li>
<a href="#" class="dropdown-toggle">
<i class="${icon}"></i>
<span class="menu-text">${name}</span>
<b class="arrow icon-angle-down"></b>
</a>
<ul class="submenu"> <s:iterator value="children">
<li>
<a href="${url}" target="main">
<i class="${icon}"></i>${name}
</a>
</li>
</s:iterator> </ul>
</li>
</s:iterator>
二、在Action的默认方法中使用函数来查询当前用户所拥有的菜单列表.
@Override
public String execute() throws Exception {
Employee employee = (Employee) ActionContext.getContext().getSession().get(USER_IN_SESSION);
List<Menu> list = menuService.findByLoginUserId(employee.getId());
// 这里通过putContext()放进去
// 前台取值时<s:标签内的value中取
putContext("menusList", list);
return SUCCESS;
}
三、在Service的借口中和实现类 ServiceImpl 中添加此查询方法:
public interface IMenuService extends IBaseService<Menu> { List<Menu> findByLoginUserId(Long loginUserId); }实现类 MenuServiceImpl.java
public class MenuServiceImpl extends BaseServiceImpl<Menu> implements IMenuService { @Override
public List<Menu> findByLoginUserId(Long loginUserId) {
//String hql = "select distinct m from Employee e join e.roles r join r.menus m where e.id = ?";
String hql = "select distinct m from Employee e join e.roles r join r.menus m where e.id=?"; // 先拿该用户所有菜单:allList中有该用户所有菜单(包括一级菜单和二级菜单)
List<Menu> allList = baseDao.findByHql(hql, loginUserId); // 定义一个列表来装一级菜单
List<Menu> parentList = new ArrayList<Menu>();
// 筛选一级菜单
for (Menu pmenu : allList) {
// 筛选条件,此菜单没有父级菜单
if (pmenu.getParent() == null) {
parentList.add(pmenu);
}
} //筛选二级菜单
for (Menu cmenu : allList) {
//判断条件:此菜单的父级菜单存在
if (cmenu.getParent()!=null) {
//迭代上面已经取出的父级菜单
for (Menu pmenu : parentList) {
//判断条件:pmenu父级菜单的id和cmenu子级菜单属性中parent的getid相等
if (pmenu.getId() == cmenu.getParent().getId()) {
//把子菜单放入相应的父级菜单下
pmenu.getChildren().add(cmenu);
}
}
}
} return parentList;
}
}
至此,根据登录的用户,来获取相应所拥有的菜单列表的功能已经完成。
需要注意的是:
1. 在使用struts2的标签从值栈中取值的时候,需要注意后台存放的名字和前台struts标签中取值时候的名字,需要保持一致。
2. 关于不同用户显示不同权限菜单,原理很简单,从seesion中取当前登录的 id,根据 id 去数据库中查询该 id 所拥有的角色列表等。
(这里需要注意hibernate 多表联查 HQL 语句 的问题)
3. 在使用其他方法(如 JSON等),可能需要根据方法来调整相关实现类的细节处理等。
SSH 结构中 不同角色登录,显示不同的菜单的更多相关文章
- 设置ssh远程其他主机登录显示提示信息
文件及路径: /etc/motd 实例: [root@A-client ~]# ssh -p 22 test@10.0.0.2 test@10.0.0.2's password: Last login ...
- 使用ssh对服务器进行登录
一.什么是SSH? 简单说,SSH是一种网络协议,用于计算机之间的加密登录. 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会 ...
- Hadoop SSH+IP、SSH+别名 免密登录配置
1.为什么要进行 SSH 无密码验证配置? Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个Da ...
- ssh证书免认证登录
思路: 客户端私钥存放于客户端,/root/.ssh/id_rsa 将客户端公钥存放于要远程控制服务器上:将客户在公钥id_rsa.pub内容追加到 /root/.ssh/authorized_key ...
- Linux SSH实现无密码远程登录
一. SSH无密码远程登录原理 二. SSH实现无密码远程登录 实现主机A 无密码远程登录主机B 主机A IP地址:10.8.9.154 主机B IP地址:10.8.9 ...
- Hadoop起步之图解SSH、免密登录原理和实现
1. 前言 emmm….最近学习大数据,需要搭建Hadoop框架,当弄好linux系统之后,第一件事就是SSH免密登录的设置.对于SSH,我觉得使用过linux系统的程序员应该并不陌生.可是吧,用起来 ...
- ssh配置免密码登录
日常工作中很多情况下都需要登录服务器进行管理,一般都是用ssh进行连接,为了防止密码外泄,可以配置下ssh的免密码登录. 首先服务器两台: A:43.224.34.* B:104.238.161.* ...
- ssh连接linux服务器只显示-bash-4.1#不显示路径解决方法
ssh连接linux服务器只显示-bash-4.1#不显示路径时,我们只需要修改 ~/.bash_profile文件,如果不存在这个文件,那么新建一个,增加内容 export PS1='[\u@\ ...
- Linux SSH安全策略限制IP登录方法(转)
本文介绍了Linux SSH安全策略限制IP登录的两种方法.具体如下: 方法一: 首先需要限制登录的ip(或者如果需要自己本地登录,查看最后登录ip即可) Vim /etc/hosts.allow 输 ...
随机推荐
- 9-9-B+树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第9章 查找 - B+树 ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题 ...
- pandas通过皮尔逊积矩线性相关系数(Pearson's r)计算数据相关性
皮尔逊积矩线性相关系数(Pearson's r)用于计算两组数组之间是否有线性关联,举个例子: a = pd.Series([1,2,3,4,5,6,7,8,9,10]) b = pd.Series( ...
- python列表中元素插入位置总结
要完成的操作是把一个列表里的元素通过for循环添加到另外一个列表里,但是通过insert()方法添加到另外一个列表后却发现元素的位置与原始列表的颠倒了.如以下实例: li1 = ['] li2 = [ ...
- Hadoop 2.x 安装常见问题FAQ(一) NodeManager 无法启动问题解决
一.问题描述 在搭建 Hadoop hadoop-2.4.1 集群的最后一步启动集群,在命令窗口并没有报任何错误,但是Slave 节点的 NodeManager进程始终启动不起来.随后查看了后台启动日 ...
- 模仿CyclicBarrier,自定义自己屏障类
简介 在这里模仿CyclicBarrier,自定义一个自己多线程屏障类,里面有个计时器count,count为0时,才唤醒线程,否则就await挂起,(没错就是用的object类的挂起和唤醒全部线程方 ...
- 【iCore4 双核心板】4.3寸液晶模块程序发布
一.说明 1.本资料包程序包含两部分,"CAPTURE"为液晶显示截图,"tft4.3"为ARM程序. 2.此程序只适合iCore4液晶模块. 3.iCore4 ...
- 【iCore1S 双核心板_ARM】例程十四:FATFS实验——读写文件
实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ int i; int j; FIL file; FATFS fatfs; //Âß¼Çý¶¯ ...
- 【GMT43智能液晶模块】例程九:RTC实验——时钟显示
实验原理: STM32的实时时钟(RTC)是一个独立的定时器,有一组连续计数的 计数器,通过软件来对其进行相关的配置,可以提供时钟功能,通过修改计 数器的的值,可以调整时钟.最终通过emWin在显示屏 ...
- 瀑布 敏捷 精益 devops
敏捷: 分工角色 大项目分小项目 每个节点时间设置里程碑 Scrum实施的核心可以概括为“化繁为简”,从几个维度解释下: 团队角色的定义,将团队人员定义为三个角色,Scrum Master(主 ...
- Caltech数据使用详情
Caltech官网: http://www.vision.caltech.edu/Image_Datasets/CaltechPedestrians/ 以Caltech测试集为例(大概是4095个图片 ...