浏览 7379 次
|
锁定老贴子 主题:Struts-Menu结合角色权限的应用
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2006-10-26
在前一个项目当中要根据登入用户的权限进行菜单显示:我把其中相关的代码提炼出来.
在系统启动时把菜单信息加载近来.通过扩展ActionServlet进行加载.
/**
*加载菜单静态信息
*/
private void loadMenuRepository()
{
MenuConstructor menuConstructor=new MenuConstructor();
menuConstructor.createMenuRepository();
}
数据库表中一级菜单的roles值按2.4.8.16....增加 这样与用户的roles值进行位运算.只要值为1,就可以显示该菜单.
/**
* 加载系统菜单入菜单库
* @param defaultRepository :缺省库
*/
public void createMenuRepository()
{
ServletContext app=ApplicationContext.getContext();
MenuRepository defaultRepository = (MenuRepository)app.getAttribute(MenuRepository.MENU_REPOSITORY_KEY);
MenuRepository repository = new MenuRepository();
repository.setDisplayers(defaultRepository.getDisplayers());
List list = getMenuComponents();
for (int i=0; i < list.size(); i++)
{
MenuComponent mc = new MenuComponent();
MenuInfo menu=(MenuInfo) list.get(i);
String menuName = menu.getName();
mc.setName(menuName);
String parentName = (String) menu.getParentName();
if (parentName != null)
{
MenuComponent parentMenu = repository.getMenu(parentName);
if (parentMenu == null)
{
parentMenu = new MenuComponent();
parentMenu.setName(parentName);
repository.addMenu(parentMenu);
}
mc.setParent(parentMenu);
}
String title = (String)menu.getTitle();
String location = (String) menu.getLocation();
String target = (String) menu.getTarget();
String description = (String) menu.getDescription();
String action=(String)menu.getAction();
String roles=(String)menu.getRoles();
mc.setTitle(title);
mc.setLocation(location);
mc.setAction(action);
mc.setTarget(target);
mc.setDescription(description);
mc.setRoles(roles);
repository.addMenu(mc);
}
constant.setMenuRepository(repository);
//因为加载出来的菜单信息被打乱了.
//按照库表菜单顺序保存一级菜单信息,在struts-menu显示时要用
app.setAttribute("OrderMenuList",getOrderMenuList());
}
/**
* 从数据库中读取菜单信息
* @return List :菜单信息
*/
private static List getMenuComponents()
{
PersistenceService service = (PersistenceService)ApplicationContextProvider.getBean("persistenceService");
String hql=QlConstructor.getSqlContent("getMenuInfo");
List menuInfoList = service.list(hql);
return menuInfoList;
}
/**
* 将菜单表中的一级菜单按照显示顺序取出来
* @return List:一级菜单信息
*/
private static List getOrderMenuList()
{
List orderMenuList=new ArrayList();
PersistenceService service = (PersistenceService)ApplicationContextProvider.getBean("persistenceService");
String hql=QlConstructor.getSqlContent("getParentmenuSql");
orderMenuList = service.list(hql);
return orderMenuList;
}
/**
* 根据userId获取用户所能看到的菜单信息
* @param authSet :用户权限集
* @return MenuRepository : 用户所能看到的菜单库
*/
public MenuRepository getUserMenuRepository(long authSet)
{
Constant constant=Constant.getInstance();
//获取系统所有菜单
ServletContext app=ApplicationContext.getContext();
MenuRepository defaultRepository = (MenuRepository)app.getAttribute(MenuRepository.MENU_REPOSITORY_KEY);
MenuRepository menuRepository=constant.getMenuRepository();
MenuRepository userMenuRepository=new MenuRepository();
userMenuRepository.setDisplayers(defaultRepository.getDisplayers());
Set menuSet=menuRepository.getMenuNames();
Iterator itor=menuSet.iterator();
MenuComponent menuComponent =null;
//查找满足用户权限的菜单项
while(itor.hasNext())
{
String menuName=(String)itor.next();
menuComponent = menuRepository.getMenu(menuName);
long roles=Long.parseLong(menuComponent.getRoles());
if((roles&authSet)!=0)
{
userMenuRepository.addMenu(menuComponent);
}
}
//TODO:下面生成用户所能看到的菜单
userMenuRepository=menuRepository;
return userMenuRepository;
}
/**
* 获取用户所能看到的一级菜单列表,在画面展示时struts-menu标签需要用到
* @param userMenuRepository :用户自己的菜单库
* @return List: 用户能看到的一级菜单名称数组
*/
public List getParentMenuNameList(MenuRepository userMenuRepository) throws Exception
{
ServletContext app=ApplicationContext.getContext();
List orderMenuList=(List)app.getAttribute("OrderMenuList");
List parentMenuNameList=new ArrayList();
for(int i=0;i<orderMenuList.size();i++)
{
String menuName=((MenuInfo)orderMenuList.get(i)).getName();
if(userMenuRepository.getMenu(menuName)!=null) parentMenuNameList.add(menuName);
}
return parentMenuNameList;
}
显示菜单: <menu:useMenuDisplayer name="Velocity" config="/framework/res/menucomp/templates/xtree.html" bundle="org.apache.struts.action.MESSAGE" repository="userMenuRepository" permissions="menuPermession"> <logic:iterate id="menuName" name="userParentMenuNameList" indexId="index"> <menu:displayMenu name='<%=menuName.toString()%>' /> </logic:iterate> </menu:useMenuDisplayer> 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-01-15
代码贴出来吧,看的好累
|
|
| 返回顶楼 | |
|
最后更新时间:2007-01-15
把实现效果和实现代码贴出来给大家参考一下,包括数据表,这样看上去太累了啊
|
|
| 返回顶楼 | |
|
最后更新时间:2007-05-10
有完整的没有,按照你的代码不行呀。
|
|
| 返回顶楼 | |
|
最后更新时间:2007-05-10
这样的权限系统不通用,且过于简单
第一,不要基于structs,要基于JSP规范才能更通用 第二,不要把控制菜单放在主要位置,把菜单对应URL控制住即可,做一个过滤器即可完成这些工作。 第三、要把系统中的数据资源提取控制住。 第四、要提供丰富的开发接口给别人。比如工作流系统。 权限系统不仅仅是要控制菜单,更多的是企业组织机构模型、 应用模型的建立。 |
|
| 返回顶楼 | |
|
最后更新时间:2007-05-10
public MenuRepository getUserMenuRepository(long authSet)
{ Constant constant=Constant.getInstance(); //获取系统所有菜单 ServletContext app=ApplicationContext.getContext(); MenuRepository defaultRepository = (MenuRepository)app.getAttribute(MenuRepository.MENU_REPOSITORY_KEY); MenuRepository menuRepository=constant.getMenuRepository(); MenuRepository userMenuRepository=new MenuRepository(); userMenuRepository.setDisplayers(defaultRepository.getDisplayers()); Set menuSet=menuRepository.getMenuNames(); Iterator itor=menuSet.iterator(); MenuComponent menuComponent =null; //查找满足用户权限的菜单项 while(itor.hasNext()) { String menuName=(String)itor.next(); menuComponent = menuRepository.getMenu(menuName); long roles=Long.parseLong(menuComponent.getRoles()); if((roles&authSet)!=0) { userMenuRepository.addMenu(menuComponent); } } //TODO:下面生成用户所能看到的菜单 userMenuRepository=menuRepository; return userMenuRepository; } 就代码本身而言, userMenuRepository=menuRepository; 不久已经全部恢复了? |
|
| 返回顶楼 | |
|
最后更新时间:2007-05-21
怎样才能得到任意一个菜单节点在数据库中对应的id号呢?
我想能过节点的id号,在右键中实现删除,更新,添加这三个功能。 可就是不知如何得到节点的id号,请大家帮助兄弟一把。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-08-20
我在做由数据库动态产生菜单的时候总是提醒我这个错误:
javax.servlet.jsp.JspException: The displayer mapping for the specified MenuDisplayer does not exist 请哪位大侠帮我看看问题,不胜感谢 代码如下: struts-config.xml 中有: <plug-in className="net.sf.navigator.menu.MenuPlugIn"> <set-property property="menuConfig" value="/WEB-INF/menu-config.xml"/> </plug-in> meny-config.xml: <?xml version="1.0" encoding="UTF-8" ?> <MenuConfig> <Displayers> <Displayer name="ListMenu" type="net.sf.navigator.displayer.ListMenuDisplayer"/> </Displayers> </MenuConfig> Action 类里面已经写入了 MenuRepository repository = new MenuRepository(); . . . request.setAttribute("examplesRepository", repository); jsp页: <%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib uri="http://struts-menu.sf.net/tag" prefix="menu" %> <menu:useMenuDisplayer name="ListMenu" repository="examplesRepository"> <menu:displayMenu name="DatabaseMenu"/> </menu:useMenuDisplayer> |
|
| 返回顶楼 | |





