`
cuisuqiang
  • 浏览: 3938887 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
3feb66c0-2fb6-35ff-968a-5f5ec10ada43
Java研发技术指南
浏览量:3652928
社区版块
存档分类
最新评论

一款二级菜单和使用自定义标签实现简单权限控制

    博客分类:
  • J2EE
阅读更多

因为要搞一个简单的权限系统,所以最近我进行了一些设计和实现。经过研究,根据业务需求,决定使用一个二级菜单和自定义标签来实现权限的控制。

 

首先来解决这款二级菜单,当然实现自己也肯定能实现,但是别人做好了自己就用吧。

其他技术你可以访问我的博客:http://cuisuqiang.iteye.com/

这个控件叫 chromemenu,官方网站是http://www.dynamicdrive.com/ ,当然我的附件里面已经带了一个,你可以直接下载看一下。

 

使用很简单,就是几个层和超链接,正好我可以控制层和超链接的显示来实现权限控制。

我们来定义一个标签web-html.tld:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"  
	"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
	<tlib-version>1.0</tlib-version>
	<jsp-version>1.2</jsp-version>
	<short-name>html</short-name>
	<tag>
		<name>resourceUrl</name>
		<tag-class>com.nms.taglib.ResourceUrl</tag-class>
		<body-content>JSP</body-content>
		<attribute>
			<name>key</name>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>href</name>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>rel</name>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>note</name>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>isModule</name>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>
</taglib>

 

在web.xml中配置一下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<!-- 自定义标签 开始 -->
	<jsp-config>
		<taglib>
			<taglib-uri>/tld/web-html</taglib-uri>
			<taglib-location>
				/WEB-INF/tlds/web-html.tld
			</taglib-location>
		</taglib>
	</jsp-config>
	<!-- 自定义标签 结束 -->
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

 

看一下实现类:

package com.nms.taglib;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.BodyTagSupport;

/**
 * @说明 菜单生成
 * @author 崔素强
 */
@SuppressWarnings("serial")
public class ResourceUrl extends BodyTagSupport {
	@Override
	public int doStartTag() throws JspException {
		try {
			// 从开放的接口取得是否允许Key资源的输出
			boolean isCheck = true;
			if(isCheck){
				StringBuffer results = new StringBuffer("");
				if("true".equals(isModule)){
					results.append("<li>");
				}
				results.append("<a ");
				if (href != null) {
					results.append(" href=\"");
					results.append(href);
					results.append("\"");
				}
				if (rel != null) {
					results.append(" rel=\"");
					results.append(rel);
					results.append("\"");
				}
				results.append(">");
				results.append(note);
				results.append("</a>");
				if("true".equals(isModule)){
					results.append("</li>");
				}
				pageContext.getOut().write(results.toString());
			}
		} catch (IOException ex) {
			throw new JspTagException("错误");
		}
		return EVAL_BODY_INCLUDE;
	}

	@Override
	public int doEndTag() throws JspException {
		return EVAL_PAGE;
	}
	//权限验证标记
	protected String key;
	// 实际连接地址
	protected String href;
	// 对应的下拉板块
	protected String rel;
	// 是否是总标记
	protected String isModule;
	// 文字
	protected String note;
	
	public String getKey() {
		return key;
	}

	public void setKey(String key) {
		this.key = key;
	}

	public String getHref() {
		return href;
	}

	public void setHref(String href) {
		this.href = href;
	}

	public String getRel() {
		return rel;
	}

	public void setRel(String rel) {
		this.rel = rel;
	}

	public String getIsModule() {
		return isModule;
	}

	public void setIsModule(String isModule) {
		this.isModule = isModule;
	}

	public String getNote() {
		return note;
	}

	public void setNote(String note) {
		this.note = note;
	}
	
	
	/**
	 * doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将显示标签间的文字,后者表示不显示标签间的文字
	 * doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的返回值是EVAL_PAGE与SKIP_PAGE,前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页
	 * doAfterBody(),这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与SKIP_BODY,前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步
	 * EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用
	 * EVAL_PAGE:继续处理页面,doEndTag()函数可用
	 * SKIP_BODY:忽略对Body的处理,doStartTag()和doAfterBody()函数可用
	 * SKIP_PAGE:忽略对余下页面的处理,doEndTag()函数可用
	 * EVAL_BODY_BUFFERED:申请缓冲区,由setBodyContent()函数得到的BodyContent对象来处理tag的body,如果类实现了BodyTag,那么doStartTag()可用,否则非法
	 * EVAL_BODY_AGAIN:请求继续处理body,返回自doAfterBody(),这个返回值在你制作循环tag的时候是很有用的
	 * 预定的处理顺序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE
	 * 如果继承了TagSupport之后,如果没有改写任何的方法,标签处理的执行顺序是:doStartTag() ->不显示文字
	 * ->doEndTag()->执行接下来的网页 如果您改写了doStartTag(),则必须指定返回值,
	 * 如果指定了EVAL_BODY_INCLUDE,则执行顺序是:doStartTag()->显示文字->doAfterBodyTag()->doEndTag()->执行下面的网页
	 */
}

 

你要关注这行代码:

boolean isCheck = true;

 在使用时,你要根据 KEY 去判断是否显示某个菜单,具体实现就看你的了。

 

然后我们在JSP页面中进行使用:

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/tld/web-html" prefix="html"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">    
    <title>菜单示例</title>
	<link rel="stylesheet" type="text/css" href="chromestyle.css" />
	<script type="text/javascript" src="chrome.js"></script>
  </head>  
  <body>
<div class="chromestyle" id="chromemenu">
<ul>
<html:resourceUrl href="#" key="" note="Model001" isModule="true"></html:resourceUrl>
<html:resourceUrl href="#" key="" note="Model002" isModule="true"></html:resourceUrl>
<html:resourceUrl href="#" key="" note="Model003" isModule="true" rel="dropmenu1"></html:resourceUrl>
<html:resourceUrl href="#" key="" note="Model004" isModule="true" rel="dropmenu2"></html:resourceUrl>
<html:resourceUrl href="#" key="" note="Model005" isModule="true" rel="dropmenu3"></html:resourceUrl>
<html:resourceUrl href="#" key="" note="Model006" isModule="true" rel="dropmenu4"></html:resourceUrl>
</ul>
</div>
<!--1st drop down menu -->                                                   
<div id="dropmenu1" class="dropmenudiv">
<html:resourceUrl href="#" key="" note="a1"></html:resourceUrl>
<html:resourceUrl href="#" key="" note="a2"></html:resourceUrl>
<html:resourceUrl href="#" key="" note="a3"></html:resourceUrl>
</div>

<!--2nd drop down menu -->                                                
<div id="dropmenu2" class="dropmenudiv" style="width: 150px;">
<html:resourceUrl href="#" key="" note="b1"></html:resourceUrl>
<html:resourceUrl href="#" key="" note="b2"></html:resourceUrl>
</div>
<!--3rd drop down menu -->                                                   
<div id="dropmenu3" class="dropmenudiv" style="width: 150px;">
<html:resourceUrl href="#" key="" note="c1"></html:resourceUrl>
<html:resourceUrl href="#" key="" note="c2"></html:resourceUrl>
<html:resourceUrl href="#" key="" note="c3"></html:resourceUrl>
<html:resourceUrl href="#" key="" note="c4"></html:resourceUrl>
</div>
<!--4rd drop down menu -->                                                   
<div id="dropmenu4" class="dropmenudiv" style="width: 150px;">
<html:resourceUrl href="#" key="" note="d1"></html:resourceUrl>
<html:resourceUrl href="#" key="" note="d2"></html:resourceUrl>
<html:resourceUrl href="#" key="" note="d3"></html:resourceUrl>
<html:resourceUrl href="#" key="" note="d4"></html:resourceUrl>
<html:resourceUrl href="#" key="" note="d5"></html:resourceUrl>
<html:resourceUrl href="#" key="" note="d6"></html:resourceUrl>
<html:resourceUrl href="#" key="" note="d7"></html:resourceUrl>
</div>
<script type="text/javascript">
cssdropdown.startchrome("chromemenu");
</script>
  </body>
</html>

 

如果是一级菜单,那么要设置:

isModule="true"

 

运行你看到了所有的菜单,你可以自己控制显示那个菜单。

 

这个权限就是很简单,就是根据某个Key去判断能否访问那个资源。当然在实际中应该是你请求的连接,这样再定义一个Filter去过滤所有请求,就能实现不能通过地址栏直接访问该资源。

 

请您到ITEYE看我的原创:http://cuisuqiang.iteye.com

或支持我的个人博客,地址:http://www.javacui.com

 

2
1
分享到:
评论
2 楼 yangzi010 2012-06-29  
感谢分享啊,楼主辛苦
1 楼 cuisuqiang 2012-04-18  
在标签处理时可以通过请求对象获得一些信息来判断是否有权限访问:
private String userId;

@Override
public void setPageContext(PageContext pageContext) {
	this.userId = (String) pageContext.getSession().getAttribute("CurrentUserId");
	super.setPageContext(pageContext);
}

相关推荐

    【QCMS企业建站系统v5.0.2】开源版PHP轻量级系统+MVC架构+可以自定义模块+二次开发

    7. 万能自定义模块 此功能是本系统的一个亮点,系统自带一个文章模块, 除了这个模块外,用户可以通过建立模块和自定义字段,建立任何你所需要的模块, 比如下载, 商城, 视频等等.已实现了字段类型有:文本、下拉菜单、...

    【QCMS企业建站系统v5.0.2】开源版PHP轻量级系统+MVC架构+可以自定义模块+二次开发.zip

    7. 万能自定义模块 此功能是本系统的一个亮点,系统自带一个文章模块, 除了这个模块外,用户可以通过建立模块和自定义字段,建立任何你所需要的模块, 比如下载, 商城, 视频等等.已实现了字段类型有:文本、下拉菜单、...

    ASPNET用户权限管理系统

    (1)通用的用户权限系统,可以创建用户、角色、模块、角色模块、用户角色,构建成自定久系统功能菜单,当前系统支持二级层级菜单 (2)系统共用五张表,有用户表、模块表、角色表、权限表(角色模块表)、用户角色表 ...

    您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有访问权限。拒绝访问解决方法

    网络中很多机器使用 NTFS文件系统,它的ACL功能(访问控制列表)可以对用户的访问权限进行控制,用户要访问这些机器的共享资源,必须赋予相应的权限才行。如使用Guest账号访问该机器的CPCW共享文件夹,右键点击该...

    基于Java的万能后台管理模板javaweb.rar

    1. 权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限 角色(基础权限): 分角色组和角色,独立分配菜单权限和增删改查权限。 按钮权限: 给角色分配按钮权限。 2. 按钮管理:自定义按钮管理,维护按钮...

    MF00970-ASP.NET用户权限系统源码.zip

    ASP.NET用户权限系统源码 开发语言 : C# 数据库 : Access 开发工具 : VS2010 源码类型 : WebForm 注意:不带技术支持,有帮助文件,虚拟商品,发货不退,看好再...(4)通过系统可以自定义系统菜单,完成系统权限管理控制

    Rookey.Frame企业级极速开发框架.zip

    通过简单配置即可实现增、删、改、查、数据列表、导入、导出、单字段编辑、批量编辑、复制、回收站、草稿箱、附 属模块显示配置、列表搜索框和表单外键字段自动完成、列表视图自定义、表单自定义、表单附件、权限...

    一个可以直接运行的基于SpringMVC的web框架1.1.12

    # demoWeb 一个基于SpringMVC的web框架 1.0.5 ...Mybatis使用二级缓存,增加redis实现 增加reactJs 增加Mybatis插件pageHelper,Mapper 1.1.12 使用draft富文本编辑器 增加ant design 代码生成器功能增强

    python入门到高级全栈工程师培训 第3期 附课件代码

    05 js练习之二级联动 06 jquery以及jquery对象介绍 07 jquery选择器 08 jquery的查找筛选器 09 jquery练习之左侧菜单 第44章 01 jquery属性操作之html,text,val方法 02 jquery循环方法和attr,prop方法 03 jquery...

    最好的asp CMS系统科讯CMSV7.0全功能SQL商业版,KesionCMS V7.0最新商业全能版-免费下载

    同时也可以实现内容收费和访问权限控制。 超多种生成文件命名形式可供选择,您可以随心所欲的设置要生成的扩展名,一切更可能的根据您的喜好DIY。 经过开发人员的优化,生成速度非常快,操作便捷。生成文件名...

    vc++ 应用源码包_1

    SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本的使用。 VC++精仿QQ2008窗体及分类菜单 VC++卡通风格气泡提示源码 VC++实现任务管理器源码 任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器...

    vc++ 应用源码包_6

    SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本的使用。 VC++精仿QQ2008窗体及分类菜单 VC++卡通风格气泡提示源码 VC++实现任务管理器源码 任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器...

    vc++ 应用源码包_2

    SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本的使用。 VC++精仿QQ2008窗体及分类菜单 VC++卡通风格气泡提示源码 VC++实现任务管理器源码 任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器...

    vc++ 应用源码包_5

    SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本的使用。 VC++精仿QQ2008窗体及分类菜单 VC++卡通风格气泡提示源码 VC++实现任务管理器源码 任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器...

    vc++ 应用源码包_3

    SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本的使用。 VC++精仿QQ2008窗体及分类菜单 VC++卡通风格气泡提示源码 VC++实现任务管理器源码 任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器...

    asp.net知识库

    Coalesys PanelBar + R.a.d Treeview +Xml 构建的Asp.net 菜单和权限管理模块 突破屏蔽限制,自己的网站使劲弹新IE窗口 对页面SCROLLING的CSS不能生效原因 .Net 中IE使用WinForm控件的使用心得。 动态加载用户控件的...

    可以直接运行的基于SpringMVC的web框架示例,也可以直接当公司框架

    # demoWeb 一个基于SpringMVC的web框架 1.0.5 ...Mybatis使用二级缓存,增加redis实现 增加reactJs 增加Mybatis插件pageHelper,Mapper 1.1.12 使用draft富文本编辑器 增加ant design 代码生成器功能增强

Global site tag (gtag.js) - Google Analytics