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

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

这里使用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. 9-9-B+树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第9章  查找 - B+树 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题 ...

  2. pandas通过皮尔逊积矩线性相关系数(Pearson's r)计算数据相关性

    皮尔逊积矩线性相关系数(Pearson's r)用于计算两组数组之间是否有线性关联,举个例子: a = pd.Series([1,2,3,4,5,6,7,8,9,10]) b = pd.Series( ...

  3. python列表中元素插入位置总结

    要完成的操作是把一个列表里的元素通过for循环添加到另外一个列表里,但是通过insert()方法添加到另外一个列表后却发现元素的位置与原始列表的颠倒了.如以下实例: li1 = ['] li2 = [ ...

  4. Hadoop 2.x 安装常见问题FAQ(一) NodeManager 无法启动问题解决

    一.问题描述 在搭建 Hadoop hadoop-2.4.1 集群的最后一步启动集群,在命令窗口并没有报任何错误,但是Slave 节点的 NodeManager进程始终启动不起来.随后查看了后台启动日 ...

  5. 模仿CyclicBarrier,自定义自己屏障类

    简介 在这里模仿CyclicBarrier,自定义一个自己多线程屏障类,里面有个计时器count,count为0时,才唤醒线程,否则就await挂起,(没错就是用的object类的挂起和唤醒全部线程方 ...

  6. 【iCore4 双核心板】4.3寸液晶模块程序发布

    一.说明 1.本资料包程序包含两部分,"CAPTURE"为液晶显示截图,"tft4.3"为ARM程序. 2.此程序只适合iCore4液晶模块. 3.iCore4 ...

  7. 【iCore1S 双核心板_ARM】例程十四:FATFS实验——读写文件

    实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ int i; int j; FIL file; FATFS fatfs; //Âß¼­Çý¶¯ ...

  8. 【GMT43智能液晶模块】例程九:RTC实验——时钟显示

    实验原理: STM32的实时时钟(RTC)是一个独立的定时器,有一组连续计数的 计数器,通过软件来对其进行相关的配置,可以提供时钟功能,通过修改计 数器的的值,可以调整时钟.最终通过emWin在显示屏 ...

  9. 瀑布 敏捷 精益 devops

    敏捷:  分工角色  大项目分小项目   每个节点时间设置里程碑 Scrum实施的核心可以概括为“化繁为简”,从几个维度解释下: 团队角色的定义,将团队人员定义为三个角色,Scrum Master(主 ...

  10. Caltech数据使用详情

    Caltech官网: http://www.vision.caltech.edu/Image_Datasets/CaltechPedestrians/ 以Caltech测试集为例(大概是4095个图片 ...