权限控制

阅读更多

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

 

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

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

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

 

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

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

Xml代码 复制代码 收藏代码
  1. xml version="1.0" encoding="UTF-8"?>
  2. "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
  3. <taglib>
  4. <tlib-version>1.0tlib-version>
  5. <jsp-version>1.2jsp-version>
  6. <short-name>htmlshort-name>
  7. <tag>
  8. <name>resourceUrlname>
  9. <tag-class>com.nms.taglib.ResourceUrltag-class>
  10. <body-content>JSPbody-content>
  11. <attribute>
  12. <name>keyname>
  13. <rtexprvalue>truertexprvalue>
  14. attribute>
  15. <attribute>
  16. <name>hrefname>
  17. <rtexprvalue>truertexprvalue>
  18. attribute>
  19. <attribute>
  20. <name>relname>
  21. <rtexprvalue>truertexprvalue>
  22. attribute>
  23. <attribute>
  24. <name>notename>
  25. <rtexprvalue>truertexprvalue>
  26. attribute>
  27. <attribute>
  28. <name>isModulename>
  29. <rtexprvalue>truertexprvalue>
  30. attribute>
  31. tag>
  32. taglib>



	1.0
	1.2
	html
	
		resourceUrl
		com.nms.taglib.ResourceUrl
		JSP
		
			key
			true
		
		
			href
			true
		
		
			rel
			true
		
		
			note
			true
		
		
			isModule
			true
		
	

在web.xml中配置一下:

Xml代码 复制代码 收藏代码
  1. xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  6. <jsp-config>
  7. <taglib>
  8. <taglib-uri>/tld/web-htmltaglib-uri>
  9. <taglib-location>
  10. /WEB-INF/tlds/web-html.tld
  11. taglib-location>
  12. taglib>
  13. jsp-config>
  14. <welcome-file-list>
  15. <welcome-file>index.jspwelcome-file>
  16. welcome-file-list>
  17. web-app>


	
	
		
			/tld/web-html
			
				/WEB-INF/tlds/web-html.tld
			
		
	
	
	
		index.jsp
	

看一下实现类:

Java代码 复制代码 收藏代码
  1. package com.nms.taglib;
  2. import java.io.IOException;
  3. import javax.servlet.jsp.JspException;
  4. import javax.servlet.jsp.JspTagException;
  5. import javax.servlet.jsp.tagext.BodyTagSupport;
  6. /**
  7. * @说明 菜单生成
  8. * @author 崔素强
  9. */
  10. @SuppressWarnings("serial")
  11. public class ResourceUrl extends BodyTagSupport {
  12. @Override
  13. public int doStartTag() throws JspException {
  14. try {
  15. // 从开放的接口取得是否允许Key资源的输出
  16. boolean isCheck = true;
  17. if(isCheck){
  18. StringBuffer results = new StringBuffer("");
  19. if("true".equals(isModule)){
  20. results.append("
  21. ");
  22. }
  23. results.append(");
  24. if (href != null) {
  25. results.append(" href=\"");
  26. results.append(href);
  27. results.append("\"");
  28. }
  29. if (rel != null) {
  30. results.append(" rel=\"");
  31. results.append(rel);
  32. results.append("\"");
  33. }
  34. results.append(">");
  35. results.append(note);
  36. results.append("");
  37. if("true".equals(isModule)){
  38. results.append("
  39. ");
  40. }
  41. pageContext.getOut().write(results.toString());
  42. }
  43. } catch (IOException ex) {
  44. throw new JspTagException("错误");
  45. }
  46. return EVAL_BODY_INCLUDE;
  47. }
  48. @Override
  49. public int doEndTag() throws JspException {
  50. return EVAL_PAGE;
  51. }
  52. //权限验证标记
  53. protected String key;
  54. // 实际连接地址
  55. protected String href;
  56. // 对应的下拉板块
  57. protected String rel;
  58. // 是否是总标记
  59. protected String isModule;
  60. // 文字
  61. protected String note;
  62. public String getKey() {
  63. return key;
  64. }
  65. public void setKey(String key) {
  66. this.key = key;
  67. }
  68. public String getHref() {
  69. return href;
  70. }
  71. public void setHref(String href) {
  72. this.href = href;
  73. }
  74. public String getRel() {
  75. return rel;
  76. }
  77. public void setRel(String rel) {
  78. this.rel = rel;
  79. }
  80. public String getIsModule() {
  81. return isModule;
  82. }
  83. public void setIsModule(String isModule) {
  84. this.isModule = isModule;
  85. }
  86. public String getNote() {
  87. return note;
  88. }
  89. public void setNote(String note) {
  90. this.note = note;
  91. }
  92. /**
  93. * doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将显示标签间的文字,后者表示不显示标签间的文字
  94. * doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的返回值是EVAL_PAGE与SKIP_PAGE,前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页
  95. * doAfterBody(),这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与SKIP_BODY,前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步
  96. * EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用
  97. * EVAL_PAGE:继续处理页面,doEndTag()函数可用
  98. * SKIP_BODY:忽略对Body的处理,doStartTag()和doAfterBody()函数可用
  99. * SKIP_PAGE:忽略对余下页面的处理,doEndTag()函数可用
  100. * EVAL_BODY_BUFFERED:申请缓冲区,由setBodyContent()函数得到的BodyContent对象来处理tag的body,如果类实现了BodyTag,那么doStartTag()可用,否则非法
  101. * EVAL_BODY_AGAIN:请求继续处理body,返回自doAfterBody(),这个返回值在你制作循环tag的时候是很有用的
  102. * 预定的处理顺序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE
  103. * 如果继承了TagSupport之后,如果没有改写任何的方法,标签处理的执行顺序是:doStartTag() ->不显示文字
  104. * ->doEndTag()->执行接下来的网页 如果您改写了doStartTag(),则必须指定返回值,
  105. * 如果指定了EVAL_BODY_INCLUDE,则执行顺序是:doStartTag()->显示文字->doAfterBodyTag()->doEndTag()->执行下面的网页
  106. */
  107. }
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("
  • "); } results.append(""); results.append(note); results.append(""); if("true".equals(isModule)){ results.append("
  • "); } 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()->执行下面的网页 */ }

    你要关注这行代码:

    Java代码 复制代码 收藏代码
    1. boolean isCheck = true;
    boolean isCheck = true;

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

     

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

    Java代码 复制代码 收藏代码
    1. <%@ page language="java" pageEncoding="UTF-8"%>
    2. <%@ taglib uri="/tld/web-html" prefix="html"%>
    3. <%
    4. String path = request.getContextPath();
    5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    6. %>
    7. "-//W3C//DTD HTML 4.01 Transitional//EN">
    8. "<%=basePath%>">
    9. 菜单示例
    10. "stylesheet" type="text/css" href="chromestyle.css" />
    11. class="chromestyle" id="chromemenu">
      • "#" key="" note="Model001" isModule="true">
      • "#" key="" note="Model002" isModule="true">
      • "#" key="" note="Model003" isModule="true" rel="dropmenu1">
      • "#" key="" note="Model004" isModule="true" rel="dropmenu2">
      • "#" key="" note="Model005" isModule="true" rel="dropmenu3">
      • "#" key="" note="Model006" isModule="true" rel="dropmenu4">
  • "dropmenu1" class="dropmenudiv">
  • "#" key="" note="a1">
  • "#" key="" note="a2">
  • "#" key="" note="a3">
  • "dropmenu2" class="dropmenudiv" style="width: 150px;">
  • "#" key="" note="b1">
  • "#" key="" note="b2">
  • "dropmenu3" class="dropmenudiv" style="width: 150px;">
  • "#" key="" note="c1">
  • "#" key="" note="c2">
  • "#" key="" note="c3">
  • "#" key="" note="c4">
  • "dropmenu4" class="dropmenudiv" style="width: 150px;">
  • "#" key="" note="d1">
  • "#" key="" note="d2">
  • "#" key="" note="d3">
  • "#" key="" note="d4">
  • "#" key="" note="d5">
  • "#" key="" note="d6">
  • "#" key="" note="d7">
  • <%@ 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+"/";
    %>
    
    
      
            
        菜单示例
    	
    	
        
      
    

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

    Java代码 复制代码 收藏代码
    1. isModule="true"
    isModule="true"

     

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

    权限控制_第1张图片

     

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

    本文出处:http://cuisuqiang.iteye.com/如果你喜欢请到ITeye与我交流。

    你可能感兴趣的:(二级菜单,自定义标签,权限,google,访问控制)