关于这个功能,这里也就是提供一个思路,在做项目的时候因为要用到,肯定存在更好的方法,此思路仅供参考。

一、关于前台页面的接收方式

这里使用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 结构中 不同角色登录,显示不同的菜单的更多相关文章

  1. 设置ssh远程其他主机登录显示提示信息

    文件及路径: /etc/motd 实例: [root@A-client ~]# ssh -p 22 test@10.0.0.2 test@10.0.0.2's password: Last login ...

  2. 使用ssh对服务器进行登录

    一.什么是SSH? 简单说,SSH是一种网络协议,用于计算机之间的加密登录. 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会 ...

  3. Hadoop SSH+IP、SSH+别名 免密登录配置

    1.为什么要进行 SSH 无密码验证配置? Hadoop运行过程中需要管理远端Hadoop守护进程,在Hadoop启动以后,NameNode是通过SSH(Secure Shell)来启动和停止各个Da ...

  4. ssh证书免认证登录

    思路: 客户端私钥存放于客户端,/root/.ssh/id_rsa 将客户端公钥存放于要远程控制服务器上:将客户在公钥id_rsa.pub内容追加到 /root/.ssh/authorized_key ...

  5. Linux SSH实现无密码远程登录

      一.      SSH无密码远程登录原理 二.      SSH实现无密码远程登录 实现主机A 无密码远程登录主机B 主机A   IP地址:10.8.9.154 主机B   IP地址:10.8.9 ...

  6. Hadoop起步之图解SSH、免密登录原理和实现

    1. 前言 emmm….最近学习大数据,需要搭建Hadoop框架,当弄好linux系统之后,第一件事就是SSH免密登录的设置.对于SSH,我觉得使用过linux系统的程序员应该并不陌生.可是吧,用起来 ...

  7. ssh配置免密码登录

    日常工作中很多情况下都需要登录服务器进行管理,一般都是用ssh进行连接,为了防止密码外泄,可以配置下ssh的免密码登录. 首先服务器两台: A:43.224.34.* B:104.238.161.* ...

  8. ssh连接linux服务器只显示-bash-4.1#不显示路径解决方法

    ssh连接linux服务器只显示-bash-4.1#不显示路径时,我们只需要修改  ~/.bash_profile文件,如果不存在这个文件,那么新建一个,增加内容  export PS1='[\u@\ ...

  9. Linux SSH安全策略限制IP登录方法(转)

    本文介绍了Linux SSH安全策略限制IP登录的两种方法.具体如下: 方法一: 首先需要限制登录的ip(或者如果需要自己本地登录,查看最后登录ip即可) Vim /etc/hosts.allow 输 ...

随机推荐

  1. Lua Linux环境下安装

    首先下载Lua包 解压缩 进入执行make linux 如果碰到lua.c:67:31: fatal error: readline/readline.h: No such file or direc ...

  2. pandas DataFrame(1)

    之前介绍了numpy的二维数组,但是numpy二维数组有一些局限性,比如,它数组里所有的值的类型必须相同,不能某一列是数值型,某一列是字符串型,这样会导致无法使用 mean() , std() 等方法 ...

  3. 实现div里的img图片水平垂直居中

    body结构 <body> <div> <img src="1.jpg" alt="haha"> </div> ...

  4. Maven包下载不下来的情况

    从svn上遇到过项目下载下来,缺丢失了一些包,怎么都下载不了,只能从同事的电脑上给拷贝下来? 千万别这样,别问为何,说多了都是泪,然后发现. 如果是eclipse的话: 勾选这两个选项,就能下载下来了 ...

  5. 【iCore1S 双核心板_ARM】例程四:USART通信实验——通过命令控制LED

    实验原理: 开发板上自带一片CH340芯片,完成本实验电脑需要安装CH340驱动, CH340的TXD连接STM32的GPIO(PB6),CH340的RXD连接STM32的 GPIO(PB7),通过串 ...

  6. 微信mac版的bug 直接显示了消息原始数据

    <msg> <voicemsg endflag="1" cancelflag="0" forwardflag="0" vo ...

  7. 怎么关闭win10和win8快速启动

    电源选项-- 选择电源按钮的功能--- 更改当前不可用的设置-- 快速启动勾去掉

  8. EntLib 自动数据库连接字符串加密

    const string provider = "RsaProtectedConfigurationProvider"; Configuration config = null; ...

  9. CentOS5.x、CentOS6.x 使用NFS及mount实现两台服务器间目录共享

    一.环境介绍: 服务器:centos 192.168.1.225 客户端:centos 192.168.1.226 二.安装: NFS的安装配置:centos 5 : portmap:实现RPC(协议 ...

  10. matlab中如何将视频保存成图像

    利用MATLAB将视频的每一帧保存成一幅图像,并自动命名.本文方法简单,容易学习. 首先,读入视频.代码如下: mov = VideoReader('xxxxxx.avi'); % 将xxxxxx.a ...