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 输 ...
随机推荐
- GuavaCache学习笔记二:Java四大引用类型回顾
前言 上一篇已经讲了,如何自己实现一个LRU算法.但是那种只是最基本的实现了LRU的剔除策略,并不能在生产中去使用.因为Guava Cache中使用的是SoftReference去做的value实现, ...
- Django-基础-2-ORM
参考文章: http://www.cnblogs.com/haiyan123/p/7732190.html https://www.cnblogs.com/liuqingzheng/articles/ ...
- 第三部分:Android 应用程序接口指南---第二节:UI---第八章 Toast通知
第8章 Toast通知 Toast通知是在窗口前面弹出的信息.它只占有信息所需要的空间量,并且用户当前的activity仍然是可见的.可互动的.这种通知自动地淡入和淡出,它不接受交互事件.他相当于一种 ...
- Atitit 数据融合merge功能v3新特性.docx
Atitit 数据融合merge功能v3新特性.docx 1.1. 版本历史1 1.2. 生成sql结果1 1.3. 使用范例1 1.4. 核心代码1 1.1. 版本历史 V2增加了replace部分 ...
- 彻底理解js中的闭包
闭包是js的一个难点也是它的一个特色,是我们必须掌握的js高级特性,那么什么是闭包呢?它又有什么用呢? 我们都知道,js的作用域分两种,全局和局部,基于我们所熟悉的作用域链相关知识,我们知道在js作用 ...
- CSA Enterprise Architecture图
https://research.cloudsecurityalliance.org/tci/index.php/explore/
- Coding in Delphi(前4章翻译版本) (PDF)
第四章翻译完成有一段时间了 写在前面的话 本次翻译纯属爱好,目的是提高对英文文档的理解和阅读能力,本文档大部分采用直 译的方式,而且保留了原来的英文.目的只是辅助大家理解,不喜勿喷.翻 ...
- 20款最好的jQuery文件上传插件
当它是关于开发网络应用程序和网页的时候,文件上传功能的重要性是不容忽视的.一个文件上传功能可以让你上传所有类型的文件在网站上,包括视频,图像,文件和更多.创建一个文件上传功能,对你的网站是不是很难,有 ...
- 9最好的JavaScript压缩工具
削减是一个从源代码中删除不必要的字符的技术使它看起来简单而整洁.这种技术也被称为代码压缩和最小化.在这里,我们为你收集了10个最好的JavaScript压缩工具将帮助您删除不必要的空格,换行符,评论, ...
- ajax实战用法详解
谦虚使人进步,总结使人提高! 以下5个方法执行一般Ajax请求的简短形式,在处理复杂的Ajax请求时应该使用jQuery.ajax() 1.load(url,[data],[callback])载入远 ...