/**
* 遍历部门树,得到所有的部门列表,并修改了名称以表示层次。
*
* @param topList
* @return
*/
public static List getAllDepartments(List topList) {
List list = new ArrayList();
walkDepartmentTrees(topList, "┣", list);
return list;
}
/*
* 遍历部门树,把遍历出来的部门都放到指定的集合中
*/
private static void walkDepartmentTrees(Collection topList, String prefix, List list) {
for (Department top : topList) {
// 顶点
Department copy = new Department(); // 原对象是在Session中的对象,是持久化状态,所以要使用副本。
copy.setId(top.getId());
copy.setName(prefix + top.getName());
list.add(copy);
// 子树
walkDepartmentTrees(top.getChildren(), " " + prefix, list); // 使用的是全角的空格
}
}
6.登陆权限的实现:
思路:
1)创建监听器继承ServletContextListener接口,监听服务器容器的创建销毁
2)在init中获取所有的权限信息,放入application作用域
3)在页面进行权限的判断显示(主菜单)
public void contextInitialized(ServletContextEvent sce) {
ServletContext application=sce.getServletContext();
//得到service的对象实例
ApplicationContext ac=WebApplicationContextUtils.getWebApplicationContext(application);
PrivilegeService privilegeService=(PrivilegeService) ac.getBean("privilegeServiceImpl");
//准备所有顶级权限的集合(顶级菜单)
List topPrivilegeList=privilegeService.findTopList();
application.setAttribute("topPrivilegeList", topPrivilegeList);
System.out.println("------已准备好顶级权限的数据----------");
//准备所有权限的url集合(用于拦截器中权限的判断,防止用户手工输入地址)
List allPrivilegeUrls=privilegeService.getAllPrivilegeUrls();
application.setAttribute("allPrivilegeUrls",allPrivilegeUrls);
System.out.println("------已准备好所有权限的url数据");
}
<%-- 顶级菜单 --%>
☆
-
${name}
<%-- 二级菜单 display: none; --%>
-
public boolean hasPrivilegeByName(String privilegeName){
//超级管理员有所有的权限
if(isAdmin()){
return true;
}
//一般用户有权限才返回true
for(Role role:roles){
for(Privilege privilege:role.getPrivileges()){
if(privilege.getName().equals(privilegeName)){
return true;
}
}
}
return false;
}
public int doEndTag() throws JspException {
//获取当前用户
User user= (User) pageContext.getSession().getAttribute("user");
//获取当前url 如果有参数就要去掉后面的参数字符串
String privilegeUrl=action;
System.out.println(action+"----------------------------");
int pos=privilegeUrl.indexOf("?");
if(pos>-1){
privilegeUrl=privilegeUrl.substring(0,pos);
}
if(user.hasPrivilegeByUrl(privilegeUrl)){
//如果有权限则正常的生成与输出a标签
return super.doEndTag();
}else{
//没有权限不显示任何东西,继续执行页面中后面的代码
return EVAL_PAGE;
}
}
public class CheckPrivilegeInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation) throws Exception {
//获取当前用户
User user=(User) ActionContext.getContext().getSession().get("user");
//获取当前访问的url,并去掉当前应用 的前缀(也就是nameSpace+actionName)
String privilegeUrl=null;
String namespace=invocation.getProxy().getNamespace();
String actionName=invocation.getProxy().getActionName();
if(namespace.endsWith("/")){
privilegeUrl=namespace+actionName;
}else{
privilegeUrl=namespace+"/"+actionName;
}
//去掉开头的‘/’
if(privilegeUrl.startsWith("/")){
privilegeUrl=privilegeUrl.substring(1);
}
//如果未登陆用户
if(user==null){
if(privilegeUrl.startsWith("userAction_login")){
//如果是去登陆,则放行
return invocation.invoke();
}else{
//如果不是去登陆,就转到登陆界面
return "loginUI";
}
}else{
//如果已经登陆,则判断权限
if(user.hasPrivilegeByUrl(privilegeUrl)){
//如果有权限就放行
return invocation.invoke();
}else{
//如果没有就转到提示页面
return "noPrivilegeError";
}
}
}
}
--------------------------------------------------------------------------------------------------------
public boolean hasPrivilegeByUrl(String privilegeUrl) {
// 超级管理员有所有的权限
if (isAdmin()) {
return true;
}
// 如果以UI后缀结尾,就去掉UI后缀,以得到对应的权限(例如:addUI与add是同一个权限)
if (privilegeUrl.endsWith("UI")) {
privilegeUrl = privilegeUrl.substring(0, privilegeUrl.length() - 2);
}
//取出数据库中所有的权限url
List allPrivilegeUrls=(List) ActionContext.getContext().getApplication().get("allPrivilegeUrls");
if(!allPrivilegeUrls.contains(privilegeUrl)){
//设置不需要控制的功能,权限 如:userAction_loginUI/login/homeAction_index
return true;
}else{
//要控制的功能
// 其他用户要是有权限才返回true
for (Role role : roles) {
for (Privilege privilege : role.getPrivileges()) {
if (privilegeUrl.equals(privilege.getUrl())) {
return true;
}
}
}
}
return false;
}