`
xxp3369
  • 浏览: 151276 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

oa_11

阅读更多
初步实现授权管理的界面,重点在于:
1、理解DWR如何使用,理解DWR如何与spring集成
2、理解权限表格的初始化操作(initTable的原理)


引用
作为一个java open source library,DWR可以帮助开发人员完成应用AJAX技术的web程序。它可以让浏览器上的javascript方法调用运行在web服务器上java方法。

DWR主要由两部门组成。javascript与web服务器通信并更新web页;运行在web服务器的Servlet处理请求并把响应发回浏览器。

DWR采用新颖的方法实现了AJAX(本来也没有确切的定义),在java代码基础上动态的生成javascript代码。web开发者可以直接调用这些javascript代码,然而真正的代码是运行在web服务器上的java code。出与安全考虑,开发者必须配置哪些java class暴露给DWR.(dwr.xml)

这种从(java到javascript)调用机制给用户一种感觉,好象常规的RPC机制,或RMI or SOAP.但是它运行在web上,不需要任何浏览器插件。

DWR不认为浏览器和web服务器之间协议重要,把系统界面放在首位。最大挑战是java method call的同步特征与ajax异步特性之间的矛盾。在异步模型里,结果只有在方法结束后才有效。DWR解决了这个问题,把回调函数当成参数传给方法,处理完成后,自动调用回调方法。

这个图表显示了,通过javascript事件,DWR能改变select的内容,当然这些内容由java代码返回。 javascript函数Data.getOptions(populateList)由DWR动态生成,这个函数会调用java class Data类的方法。DWR处理如何远程调用,包括转换所有的参数和返回的结果(javascript\java)。java方法执行完后,执行回调方法populateList。在整个过程中我们就想在用本地的方法一样。

dwr.xml

引用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
<dwr>
  <allow>
    <create creator="spring" javascript="aclManager">
      <param name="beanName" value="aclManager"/>
    </create>
  </allow>
</dwr>


web.xml


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <!-- Standard Action Servlet Configuration (with debugging) -->
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>2</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>2</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>


  <!-- Standard Action Servlet Mapping -->
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

  <context-param>
  	<param-name>contextConfigLocation</param-name>
   	<param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value>
  </context-param>
  
  <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
 <filter>
    <filter-name>Spring character encoding filter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
    	<param-name>encoding</param-name>
    	<param-value>GBK</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Spring character encoding filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  </filter>
 <filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping> 
  
  <filter>
    <filter-name>pagerFilter</filter-name>
    <filter-class>com.bjsxt.oa.web.PagerFilter</filter-class>
  </filter>
 <filter-mapping>
    <filter-name>pagerFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>   
  
<servlet>
    <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
    <init-param>
      <param-name>debug</param-name>
      <param-value>true</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>dwr-invoker</servlet-name>
    <url-pattern>/dwr/*</url-pattern>
  </servlet-mapping>
  

</web-app>



index.jsp


<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<%@include file="/common/common.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<link href="style/oa.css" rel="stylesheet" type="text/css">
<script language="javascript" src="script/public.js"></script>
<script type="text/javascript" src="dwr/engine.js"></script>
<script type="text/javascript" src="dwr/util.js"></script>
<script type="text/javascript" src="dwr/interface/aclManager.js"></script>
<script type="text/javascript">
function addOrUpdatePermission(field){
	aclManager.addOrUpdatePermission(
		"${aclForm.principalType}",
		${aclForm.principalId},
		field.moduleId,
		field.permission,
		field.checked
	);
}

function initTable(){
	aclManager.searchAclRecord(
		"${aclForm.principalType}",
		${aclForm.principalId},
		function(data){
			for(var i=0; i<data.length; i++){
				var moduleId = data[i][0];
				var cState = data[i][1];
				var rState = data[i][2];
				var uState = data[i][3];
				var dState = data[i][4];
				$(moduleId+"_C").checked = cState == 0 ? false : true;
				$(moduleId+"_R").checked = rState == 0 ? false : true;
				$(moduleId+"_U").checked = uState == 0 ? false : true;
				$(moduleId+"_D").checked = dState == 0 ? false : true;
			}
		}
	);
}


</script>
<c:choose>
	<c:when test="${aclForm.principalType eq 'User'}">
		<c:set var="title" value="请给用户【${user.person.name}】授权"></c:set>
	</c:when>
	<c:otherwise>
		<c:set var="title" value="请给角色【${role.name}】授权"></c:set>
	</c:otherwise>
</c:choose>
<title>${title }</title>
</head>
<body onload="initTable()">
<center>
<TABLE class="tableEdit" border="0" cellspacing="1" cellpadding="0" style="width:580px;">
	<TBODY>
		<TR>
			<!-- 这里是添加、编辑界面的标题 -->
			<td align="center" class="tdEditTitle">${title}</TD>
		</TR>
		<TR>
			<td>
			<!-- 主输入域开始 -->
<table class="tableEdit" style="width:580px;" cellspacing="0" border="0" cellpadding="0">
	<tr>
		<td class="tdEditLabel" >顶级模块</td>			
		<td class="tdEditLabel" >二级模块</td>
		<td class="tdEditLabel" >权限</td>
		<c:if test="${aclForm.principalType eq 'User'}">
		<td class="tdEditLabel" >不继承</td>
		</c:if>
		<td class="tdEditLabel" >启用</td>
	</tr>
	<c:forEach items="${modules}" var="module">
	<tr>
		<td>${module.name}</td>
		<td></td>
		<td>
			<input type="checkbox" id="${module.id }_C" moduleId="${module.id }" permission="0" onclick="addOrUpdatePermission(this)">C
			<input type="checkbox" id="${module.id }_R" moduleId="${module.id }" permission="1" onclick="addOrUpdatePermission(this)">R
			<input type="checkbox" id="${module.id }_U" moduleId="${module.id }" permission="2" onclick="addOrUpdatePermission(this)">U
			<input type="checkbox" id="${module.id }_D" moduleId="${module.id }" permission="3" onclick="addOrUpdatePermission(this)">D
		</td>
		<c:if test="${aclForm.principalType eq 'User'}">
		<td>
			<input type="checkbox">
		</td>
		</c:if>
		<td>
			<input type="checkbox">
		</td>
	</tr>
	<c:forEach items="${module.children}" var="child">
	<tr>
		<td></td>
		<td>${child.name}</td>
		<td>
			<input type="checkbox" id="${child.id }_C" moduleId="${child.id }" permission="0" onclick="addOrUpdatePermission(this)">C
			<input type="checkbox" id="${child.id }_R" moduleId="${child.id }" permission="1" onclick="addOrUpdatePermission(this)">R
			<input type="checkbox" id="${child.id }_U" moduleId="${child.id }" permission="2" onclick="addOrUpdatePermission(this)">U
			<input type="checkbox" id="${child.id }_D" moduleId="${child.id }" permission="3" onclick="addOrUpdatePermission(this)">D
		</td>
		<c:if test="${aclForm.principalType eq 'User'}">
		<td>
			<input type="checkbox">
		</td>
		</c:if>
		<td>
			<input type="checkbox">
		</td>
	</tr>
	</c:forEach>
	</c:forEach>
</table>

			<!-- 主输入域结束 -->
			</td>
		</TR>
	</TBODY>
</TABLE>

<TABLE>
		<TR align="center">
			<TD colspan="3" bgcolor="#EFF3F7">
			<input type="button" class="MyButton"
				value="关闭窗口" onclick="window.close()">
			</TD>
		</TR>
</TABLE>
</center>
</body>
</html>




package com.bjsxt.oa.manager.impl;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.bjsxt.oa.manager.AclManager;
import com.bjsxt.oa.manager.Permission;
import com.bjsxt.oa.model.ACL;

public class AclManagerImpl extends AbstractManager implements AclManager {

	public void addOrUpdatePermission(String principalType, int principalId,
			int moduleId, int permission, boolean yes) {
		
		//查找ACL对象
		ACL acl = findACL(principalType, principalId, moduleId);
		
		if(acl != null){
			//根据permission和yes,更新aclState的值
			acl.setPermission(permission, yes);
			getHibernateTemplate().update(acl);
			return;
		}
		
		acl = new ACL();
		acl.setPrincipalType(principalType);
		acl.setPrincipalId(principalId);
		acl.setModuleId(moduleId);
		//根据permission和yes,更新aclState的值
		acl.setPermission(permission, yes);
		getHibernateTemplate().save(acl);		
	}

	public void addOrUpdateUserExtends(int userId, int moduleId, boolean yes) {
		ACL acl = findACL(ACL.TYPE_USER, userId, moduleId);
		if(acl != null){
			acl.setExtends(yes);
			getHibernateTemplate().update(acl);
			return;
		}
		acl = new ACL();
		acl.setPrincipalType(ACL.TYPE_USER);
		acl.setPrincipalId(userId);
		acl.setModuleId(moduleId);
		acl.setExtends(yes);
		getHibernateTemplate().save(acl);
	}

	public void delPermission(String principalType, int principalId,
			int moduleId) {
		ACL acl = findACL(principalType, principalId, moduleId);
		if(acl != null){
			getHibernateTemplate().delete(acl);
		}
	}

	public boolean hasPermission(int userId, int moduleId, int permission) {
		
		//根据用户标识和模块标识查找授权记录
		ACL acl = findACL(ACL.TYPE_USER,userId,moduleId);
		
		//有授权记录
		if(acl != null){
			int yesOrNo = acl.getPermission(permission);
			
			//如果是确定的授权
			if(yesOrNo != ACL.ACL_NEUTRAL){
				return yesOrNo == ACL.ACL_YES ? true : false;
			}
		}
		
		//继续查找用户的角色的授权记录
		
		String hql = "select r.id from UsersRoles ur join ur.role r join ur.user u " +
				"where u.id = ? order by ur.orderNo";
		List roleIds = getHibernateTemplate().find(hql, userId);
		for (Iterator iterator = roleIds.iterator(); iterator.hasNext();) {
			Integer rid = (Integer) iterator.next();
			acl = findACL(ACL.TYPE_ROLE, rid, moduleId);
			if(acl != null){
				return acl.getPermission(permission) == ACL.ACL_YES ? true : false;
			}
		}
		
		return false;
	}

	public List searchModules(int userId) {
		
		//查询用户拥有的角色,并按优先级从低到高排序
		String hql = "select r.id from UsersRoles ur join ur.role r join ur.user u " +
		"where u.id = ? order by ur.orderNo desc";
		List roleIds = getHibernateTemplate().find(hql, userId);
		
		Map temp = new HashMap();
		
		//依次查找角色的授权列表
		for (Iterator iterator = roleIds.iterator(); iterator.hasNext();) {
			Integer rid = (Integer) iterator.next();
			List acls = findRoleAcls(rid);
			for (Iterator iterator2 = acls.iterator(); iterator2.hasNext();) {
				ACL acl = (ACL) iterator2.next();
				temp.put(acl.getModuleId(), acl);
			}
		}
		
		//针对用户查找有效的用户授权列表
		List acls = findUserAcls(userId);
		for (Iterator iterator = acls.iterator(); iterator.hasNext();) {
			ACL acl = (ACL) iterator.next();
			temp.put(acl.getModuleId(), acl);
		}
		
		//去除掉那些没有读取权限的授权记录
		Set entries = temp.entrySet();
		for (Iterator iterator = entries.iterator(); iterator.hasNext();) {
			Map.Entry entry = (Map.Entry) iterator.next();
			ACL acl = (ACL)entry.getValue();
			if(acl.getPermission(Permission.READ) != ACL.ACL_YES){
				iterator.remove();
			}
		}
		
		if(temp.isEmpty()){
			return null;
		}
		
		String searchModules = "select m from Module m where m.id in (:ids) order by m.orderNo";
		return getSession().createQuery(searchModules)
				.setParameterList("ids", temp.keySet())
				.list();
	}
	
	public List searchAclRecord(String principalType, int principalId) {
		String sql = "select moduleId,aclState&1,aclState&2,aclState&4,aclState&8 from t_acl " +
				"where principalType = '"+principalType+"' " +
				"and principalId = "+principalId;

		return getSession().createSQLQuery(sql).list();
	}

	private ACL findACL(String principalType,int principalId,int moduleId){
		String hql = "select a from ACL a where a.principalType = ? and a.principalId = ? and a.moduleId = ?";
		ACL acl = (ACL)getSession().createQuery(hql)
			.setParameter(0, principalType)
			.setParameter(1, principalId)
			.setParameter(2, moduleId)
			.uniqueResult();
		return acl;
	}
	
	private List findRoleAcls(int roleId){
		return getHibernateTemplate().find(
				"select acl from ACL acl where acl.principalType = ? " +
				"and acl.principalId=?",
				new Object[]{ACL.TYPE_ROLE,roleId}
			);
	}
	
	private List findUserAcls(int userId){
		return getHibernateTemplate().find(
				"select acl from ACL acl where acl.principalType = ? " +
				"and acl.principalId=? and acl.aclTriState = ?",
				new Object[]{ACL.TYPE_USER,userId,ACL.ACL_TRI_STATE_UNEXTENDS}
			);
	}

}
分享到:
评论

相关推荐

    OA_Automotive_Ethernet_ECU_TestSpecification_Layer_3-7_v3.0

    OA_Automotive_Ethernet_ECU_TestSpecification_Layer_3-7_v3.0 本文档是OPEN Alliance Automotive Ethernet ECU Test Specification Layer 3-7的规范文档,版本号为v3.0。该规范文档是由OPEN Alliance TC8 Working...

    OA_OA源码_oa_

    "OA_OA源码_oa_"这个标题表明我们讨论的是一个关于OA系统的源代码,可能是为了学习、研究或者二次开发而提供的开放源码项目。 "界面好看的OA系统"描述暗示了这个OA系统在用户界面设计上注重用户体验,提供了美观、...

    oa.rar_java oa_oa_oa java_spring3_struts2 oa

    【标题】"oa.rar" 暗示这是一个关于OA(办公自动化)系统的压缩包,而“java oa_oa_oa java_spring3_struts2 oa”表明该系统是基于Java技术栈开发的,特别是采用了Spring3和Struts2框架。OA系统通常用于企业内部的...

    OA_Automotive_Ethernet_ECU_TestSpecification_Layer_1_v3.0.pdf

    此外,文档里提及的“Referenced TC11 Tests”和“RestictionLevel: OPENTechnicalMembersOnly”都指向了该文档属于OPEN Alliance的技术成员专有,普通公众无法获取该规范的最新版本。这种限制通常用于确保只有具备...

    oa.rar_OA jsp_java oa_oa_oa java_办公 Java

    在“oa.rar_OA jsp_java oa_oa_oa java_办公 Java”这个标题中,我们可以推断这是一个使用Java和JSP技术开发的OA系统,主要面向办公自动化需求。 JSP(Java Server Pages)是Java的一种动态网页技术,允许开发者将...

    OA.rar_ ASP OA_OA asp_asp oa_商业源码_花钱

    标题中的"OA.rar_ ASP OA_OA asp_asp oa_商业源码_花钱"表明这是一个基于ASP技术的OA(Office Automation,办公自动化)系统的源码压缩包,且该源码具有商业价值,可能需要购买获取。这个系统可能是用ASP(Active ...

    OA.rar_OA办公系统_PHP OA_oa_oa php_办公软件

    OA办公系统,全称为Office Automation System,是一种基于网络技术,以提高办公效率、实现无纸化办公为目标的软件系统。在“OA.rar_OA办公系统_PHP OA_oa_oa php_办公软件”的标题中,我们可以看出这个压缩包包含了...

    OA.rar_java oa_oa mysql_oa java_oa java mysql_办公OA

    "OA.rar_java oa_oa mysql_oa java_oa java mysql_办公OA" 这个标题揭示了我们讨论的主题是一个基于Java技术构建的办公自动化(OA)系统,它利用MySQL数据库进行数据存储。OA系统是现代企业信息化管理的重要工具,...

    OA.rar_asp oa_oa psd_oa 系统_办公OA_网络办公

    【OA.rar_asp oa_oa psd_oa 系统_办公OA_网络办公】这个压缩包文件包含的内容主要是关于ASP开发的办公自动化(OA)系统,以及相关的PSD设计文件,适合那些需要定制或修改OA系统界面的用户。下面将详细解释其中涉及的...

    oa.rar_OA文档_SSH JBMP_jbmp oa_oa_oa ssh

    标题中的"oa.rar_OA文档_SSH JBMP_jbmp oa_oa_oa ssh"表明这是一个与OA(Office Automation,办公自动化)系统相关的压缩文件,其中包含了使用SSH(Spring、Struts、Hibernate)框架和JBMP(Java Business ...

    OA.zip_java oa_oa_oa java_oa管理系统_oa系统

    本篇文章将围绕"OA.zip_java oa_oa_oa java_oa管理系统_oa系统"这一主题,深入探讨基于Java技术的OA系统的设计与实现。 1. **需求规格说明**:OA系统的需求规格说明是项目开发的起点,它详细列出了系统的功能需求、...

    OA.rar_C# OA_OA ASP.NET sql20_OA Explor_oa_oa 办公

    【OA.rar】是一个压缩包文件,其中包含了C#语言开发的OA(Office Automation,办公自动化)系统的源代码和相关资源。这个系统是基于ASP.NET框架构建的,这意味着它使用了微软的.NET Framework来运行和处理Web应用...

    oa.rar_java oa_oa_oa java

    在本压缩包中,"oa.rar_java oa_oa_oa java" 暗示了这是一个基于Java技术开发的OA系统。 Java作为一门多平台、面向对象的编程语言,因其跨平台性、安全性以及强大的网络功能,被广泛应用于企业级应用开发,尤其是OA...

    OA.rar_.net OA_net OA_oa_oa 系统_文档管理

    《.NET OA 系统与文档管理详解》 OA(Office Automation)系统是现代企业信息化建设中的重要组成部分,主要用于提升工作效率,实现办公自动化。本文将深入探讨基于C#.NET技术构建的OA系统及其核心功能——文档管理...

    (J2EE)oa.zip_j2ee oa_java oa_oa j2ee_oaj2ee下载

    【标题】"J2EE oa.zip_j2ee oa_java oa_oa j2ee_oaj2ee下载" 提供的是一个基于J2EE平台的办公自动化(OA)系统的压缩包资源。OA系统通常用于企业内部,以提升工作效率,实现文档管理、工作流程自动化、任务分配等...

    OA.rar_OA 源码_asp.net oa_c/s oa_oa c

    【OA.rar_OA 源码_asp.net oa_c/s oa_oa c】是一个关于C#编程语言开发的办公自动化(OA)系统的源代码压缩包。这个系统采用经典的客户端/服务器(C/S)架构,利用ASP.NET技术进行构建,旨在提供高效、便捷的办公流程...

    oa_09.rar_java oa_java oa mysql_oa mysql_oa mysql_办公OA

    在本项目中,我们关注的是一个基于Java技术的办公自动化(Office Automation,简称OA)系统。这个系统利用了Java编程语言、Tomcat应用服务器以及MySQL数据库来构建一个完整的OA解决方案。下面将详细介绍这三个核心...

    OA.zip_JSP OA_axjsp com_java oa_ssh mysql

    **OA办公自动化系统详解** OA.zip_JSP OA_axjsp com_java oa_ssh mysql 是一个基于SSH框架的OA(Office Automation)办公自动化系统的压缩包文件。这个系统利用了Java、JSP、AxJSP以及MySQL数据库技术,旨在实现...

    itcastOA.rar_ itcastoa_itcast oa _itcast-oa_itcast_oa_itcastoa

    《ITCast OA系统详解——基于SSH框架的高效办公自动化实现》 ITCast OA是一款基于SSH(Struts2、Spring、Hibernate)技术栈开发的企业级办公自动化系统,它在2011年由ITCast团队推出的新版本,相较于之前的版本,...

    OA.rar_java oa_oa_oa.r

    【标题】"OA.rar" 是一个压缩包文件,其中包含了与Java OA(Office Automation)系统相关的源代码或文档。"java_oa_oa_oa.r"可能是项目名称或文件夹结构的一部分,暗示了这个压缩包内容是关于使用Java语言开发的企业...

Global site tag (gtag.js) - Google Analytics