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 输 ...
随机推荐
- 11G新特性 -- RMAN Multisection Backups
Oracle 11g支持以sections的方式来备份和还原数据文件.在section级别进行备份,被称作multisection backup(多段备份).section是一个数据文件中连续的块.m ...
- 【转】java 读取 excel 2003 或 excel 2007
package com.my.login; import java.io.File; import java.io.FileInputStream; import java.io.IOExceptio ...
- SNF快速开发平台MVC-EasyUI3.9之-ueditor富文本编辑在 asp.net MVC下使用步骤
mvc项目中用到了这个富文本编辑就试着把遇到的问题个使用步骤在这里记录一下,希望大家少走弯路. 1.首先我们先下载net版本的uediot 2.然后把整个文档拷贝到我们的项目中,记得是整个 把下载的文 ...
- Atitit 大json文件的结构化查看解决方案,高性能的jsonview attilax总结.docx
Atitit 大json文件的结构化查看解决方案,高性能的jsonview attilax总结.docx 1.1. 实现目标:1 1.2. 实现key与value类型的..一直分析到非 jsonob ...
- 【iCore4 双核心板_ARM】例程九:ADC实验——电源监控
实验原理: STM32内部集成三个12位ADC,iCore1S的所有电源经过电阻分压或者直接 接入STM32的ADC的输出通道内,输入电流经过高端电流检测芯片ZXCT1009F 输入到ADC的输入通道 ...
- Java多线程系列——线程池简介
什么是线程池? 为了避免系统频繁地创建和销毁线程,我们可以让创建的线程进行复用.用线程时从线程池中获取,用完以后不销毁线程,而是归还给线程池. JDK 对线程池的支持 为了更好的控制多线程,JDK 提 ...
- app嵌入的H5页面的数据埋点总结
好久没写博客了,大半年时间花费在了许多杂事上. 最近1个月专门为H5页面的app开发了一些埋点功能,主要是考虑到以后的可复制性和通用型,由于不是前端开发出身,相对来说还是比较简陋的. 正题开始:H5页 ...
- (转载)Redis5.0重量级特性Stream尝鲜
转 导读:Redis5.0最新重点推出了Stream的支持,给众多架构师在消息队列方面带来了新的选择,特别是Redis粉丝们绝对是一个福音.那么Redis的Stream有哪些特别的功能?跟kafka有 ...
- ASP.NET MVC 4 (十三) 基于表单的身份验证
在前面的章节中我们知道可以在MVC应用程序中使用[Authorize]特性来限制用户对某些网址(控制器/控制器方法)的访问,但这都是在对用户认证之后,而用户的认证则依然是使用ASP.NET平台的认证机 ...
- WPF之依赖属性和附加属性
参考资料: 一站式WPF--依赖属性(DependencyProperty)一 一站式WPF--依赖属性(DependencyProperty)二 依赖属性之我见: 这两篇文章介绍的 ...