SSH权限管理控制到按钮

数据库设计

我的设计如下:

用户:fu_admin

角色:sys_role

权限:sys_purview

用户-角色:sys_user_role

角色-权限:sys_role_purview

标准的权限管理系统设计为以上5张表。


注:用户、用户-角色我就不做说明了,这两个是很简单的两块,用户的crud,以及为用户分配角色(多对多的关系)稍微琢磨一下就清楚了,下面都是针对为角色分配权限的实现



后台实现

展示层采用ztree树

roleList.jsp
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<%@ include file="../common/meta.jsp" %>
<%@ include file="/WEB-INF/include/tagtld.jsp"%>
<title>${title}-角色管理</title>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ include file="../common/cssback.jsp" %>
<style type="text/css">
.bg{
background-color:#808080;
} 
</style>
</head>
<body>
<c:set var="first" value="7"/>
<c:set var="second" value="3"/>
<div class="content">
    <div class=" rt_cont">
    	<div class="rt_cont_mat">
    	    <div class="rt_cont_title">角色管理</div>            
            <div class=" yhlb_title">角色管理</div>
	            <div class="yhlb">
				
				<!-- 编辑栏  -->
				<div id="tb">
					<ul>
						<li><domi:privilege url="/admin_op_purview/addRole.htm"><img src="../images/add.png"/><a href=#>



setPurview.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/include/tagtld.jsp"%>
<div class="fuchen">
	<div class=" fc_top"> 
    	<b class="fl fc_top_font">配置权限</b>
        <div class="fl"></div>
    </div>
    <input id="roleId" type="hidden" value="${roleId}"/>
    <form id="roleForm">
	  	<!-- 权限窗口 -->  
	    <div id="menuDiv" title="配置权限">  
	        <div id="tree" class="ztree"></div>  
	    </div>  
	    <div id="menuWindowfooter">   
	    	<a href=#>


Action 层

AdminOpPurviewAction.java

  /**
	 * 设置权限页面
	 */
	@Action("setPurview")
	public String setPurview() {
		try {
			this.getActionContext().put("roleId", roleId);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return SUCCESS;
	}

	/**
	 * 权限树
	 * 
	 * @return
	 */
	@Action("treedata")
	public String treedata() {
		try {
			String jsonStr = sysRolePurviewService.findPurviewList(roleId);
			if (jsonStr == null) {
				jsonStr = "";
			}
			write(jsonStr);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

  /**
	 * 保存角色的菜单权限
	 */
	@Action("saveRolePurview")
	public String saveRolePurview() {
		try {
			sysRolePurviewService.saveRolePurview(roleId, purviewArray);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

service 层实现类

public String findPurviewList(Long roleId) {
		return sysRolePurviewDao.findPurviewList(roleId);
	}


	public void saveRolePurview(Long roleId, String purviewArray) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("roleId", roleId);
		List<SysRolePurview> list = sysRolePurviewDao.findList(map);
		if (list != null && list.size() > 0) {
			for (SysRolePurview sysRolePurview : list) {
				sysRolePurviewDao.delete(sysRolePurview.getId());// 先删除此角色的所有权限
			}
		}

		if (purviewArray != null && purviewArray != "") {
			String[] pArray = purviewArray.split(",");
			for (int i = 0; i < pArray.length; i++) {
				SysRolePurview rolePurview = new SysRolePurview();
				rolePurview.setSysPurview(sysPurviewDao.get(Long.parseLong(pArray[i])));
				rolePurview.setSysRole(sysRoleDao.get(roleId));
				sysRolePurviewDao.save(rolePurview);// 再给此角色配置选中的权限
			}
		}
	}

dao层实现类

@Repository
public class SysRolePurviewDaoImpl extends BaseDaoImpl<SysRolePurview, Long> implements SysRolePurviewDao {
	@Override  
    public List<SysRolePurview> findList(Map<String, Object> map) {  
		String hql=" from SysRolePurview where 1=1 ";
		List<Object> params=new ArrayList<Object>();
		if(map.containsKey("roleId")){
			params.add(map.get("roleId"));
			hql=hql+" and sysRole.id=? ";
		}
		if(map.containsKey("purviewId")){
			params.add(map.get("purviewId"));
			hql=hql+" and sysPurview.id=? ";
		}
		if(this.findAllByHQL(hql, params).size()>0){
			return this.findAllByHQL(hql, params);
		}else{
			return null;
		}
    }  
	
	@Override  
    public String findPurviewList(Long roleId) {  
		String sql="select id, name, parentid as pId from sys_purview where parentid is not null";
		List<Map<String, Object>> list = this.getJdbcTemplate().queryForList(sql);
		Map<String, Object> map=new HashMap<String, Object>();
		map.put("roleId", roleId);
		List<SysRolePurview> rolePv = this.findList(map);//根据角色id查询所拥有的权限
		JSONArray jsonArr = new JSONArray();
		for(Map<String, Object> purview : list){
			JSONObject obj = new JSONObject();
			obj.put("id", purview.get("id").toString());
			obj.put("name", purview.get("name").toString());
			obj.put("pId", purview.get("pId")!=null?purview.get("pId").toString():"");
			//如果在中间表有权限对应,则选中
			if(rolePv != null && rolePv.size()>0){
				for (SysRolePurview rolePurview : rolePv) {  
					String rpid = rolePurview.getSysPurview().getId().toString();
					String pid = purview.get("id").toString();
	            	//如果角色权限表的权限id跟权限表的id对应上,就选中
	                if (rpid.equals(pid)) {  
	                	obj.put("checked", true);  
	                } 
	            }  
			}
			jsonArr.add(obj);
		}
		return jsonArr.toString();
    }
	
}

这里吧权限表的实体列出来,其他的实体同理把双向多对一,一对多配置好


package com.hongwei.futures.model;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.OrderBy;

@Entity
@Table(name = "sys_purview")
public class SysPurview implements java.io.Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 6386109543256527737L;
	private Long id;
	private String name;
	private Long parentId;
	private String url;
	private Integer type;
	private String iconicName;
	private Integer sort;
	private Integer category;
	private String remark;
	private String target;
	private FuAdmin createAdmin;
	private Date createTime;
	private FuAdmin updateAdmin;
	private Date updateTime;
	private Set<SysRolePurview> sysRolePurviews = new HashSet<SysRolePurview>(0);
	private Set<SysPurview> children = new HashSet<SysPurview>();//这里是用来存当前权限菜单下的子菜单
	
	
	public SysPurview() {
		super();
	}

	public SysPurview(Long id, String name, Long parentId, String url,
			Integer type, String iconicName, Integer sort, Integer category,
			String remark, String target, FuAdmin createAdmin, Date createTime,
			FuAdmin updateAdmin, Date updateTime, Set<SysPurview> children,Set<SysRolePurview> sysRolePurviews) {
		super();
		this.id = id;
		this.name = name;
		this.parentId = parentId;
		this.url = url;
		this.type = type;
		this.iconicName = iconicName;
		this.sort = sort;
		this.category = category;
		this.remark = remark;
		this.target = target;
		this.createAdmin = createAdmin;
		this.createTime = createTime;
		this.updateAdmin = updateAdmin;
		this.updateTime = updateTime;
		this.sysRolePurviews = sysRolePurviews;
		this.children = children;
	}

	@Id
	@GeneratedValue
	@Column(name = "id", unique = true, nullable = false)
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}

	@Column(name = "name")
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Column(name = "parentid")
	public Long getParentId() {
		return parentId;
	}

	public void setParentId(Long parentId) {
		this.parentId = parentId;
	}

	@Column(name = "url")
	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	@Column(name = "type")
	public Integer getType() {
		return type;
	}

	public void setType(Integer type) {
		this.type = type;
	}

	@Column(name = "iconicname")
	public String getIconicName() {
		return iconicName;
	}

	public void setIconicName(String iconicName) {
		this.iconicName = iconicName;
	}

	@Column(name = "sort")
	public Integer getSort() {
		return sort;
	}

	public void setSort(Integer sort) {
		this.sort = sort;
	}

	@Column(name = "category")
	public Integer getCategory() {
		return category;
	}

	public void setCategory(Integer category) {
		this.category = category;
	}

	@Column(name = "remark")
	public String getRemark() {
		return remark;
	}

	public void setRemark(String remark) {
		this.remark = remark;
	}

	@Column(name = "target")
	public String getTarget() {
		return target;
	}

	public void setTarget(String target) {
		this.target = target;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "createadmin")
	public FuAdmin getCreateAdmin() {
		return createAdmin;
	}
	public void setCreateAdmin(FuAdmin createAdmin) {
		this.createAdmin = createAdmin;
	}

	@Column(name = "createtime")
	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "updateadmin")
	public FuAdmin getUpdateAdmin() {
		return updateAdmin;
	}
	public void setUpdateAdmin(FuAdmin updateAdmin) {
		this.updateAdmin = updateAdmin;
	}

	@Column(name = "updatetime")
	public Date getUpdateTime() {
		return updateTime;
	}

	public void setUpdateTime(Date updateTime) {
		this.updateTime = updateTime;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "sysRole")
	public Set<SysRolePurview> getSysRolePurviews() {
		return sysRolePurviews;
	}

	public void setSysRolePurviews(Set<SysRolePurview> sysRolePurviews) {
		this.sysRolePurviews = sysRolePurviews;
	}
	
	@OneToMany(fetch=FetchType.EAGER, mappedBy="parentId")
	@OrderBy(clause = "id ASC")
	public Set<SysPurview> getChildren() {
		return children;
	}

	public void setChildren(Set<SysPurview> children) {
		this.children = children;
	}
	
}


在WEB-INF目录下建立文件夹tld 建立自定义标签文件domi.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>sapTag</short-name>
	<uri>http://www.hongwei.com</uri>

	<tag>
		<name>privilege</name>
		<tag-class>com.hongwei.futures.web.tag.PrivilegeTag</tag-class>
		<body-content>JSP</body-content>
		<attribute>
			<name>url</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
			<description>url</description>
		</attribute>
	</tag>
	<tag>
		<name>menu</name>
		<tag-class>com.hongwei.futures.web.tag.MenuTag</tag-class>
		<body-content>JSP</body-content>
		<attribute>
			<name>name</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
			<description>name</description>
		</attribute>
	</tag>
</taglib>

自定义标签类(两个,一个用来在后台主页循环菜单,一个用来判断按钮权限)

package com.hongwei.futures.web.tag;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.servlet.jsp.tagext.TagSupport;

import com.hongwei.futures.model.FuAdmin;
import com.hongwei.futures.model.SysPurview;
import com.hongwei.futures.util.StrutsUtil;

public class PrivilegeTag extends TagSupport {

	private String url;

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	@Override
	public int doStartTag() {
		boolean result = false;
		FuAdmin admin = (FuAdmin) StrutsUtil.getHttpSession().getAttribute("admin");
		List<SysPurview> priviList = (List<SysPurview>) StrutsUtil.getHttpSession().getAttribute("priviList");
		if (null != admin) {
			if (admin.getType() == 1) {
				result = true;
			} else {
				int pos = url.indexOf("?");
				if (pos > -1) {
					url = url.substring(0, pos);
				}
				Collection<String> privilegeUrls = new ArrayList<String>();
				for (SysPurview p : priviList) {
					privilegeUrls.add(p.getUrl());
				}
				if (!privilegeUrls.contains(url)) {

				} else {
					for (String pUrl : privilegeUrls) {
						if (url.equals(pUrl)) {
							result = true;
						}
					}
				}
			}
		}
		return result ? EVAL_BODY_INCLUDE : SKIP_BODY;
	}
}

package com.hongwei.futures.web.tag;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.servlet.jsp.tagext.TagSupport;

import com.hongwei.futures.model.FuAdmin;
import com.hongwei.futures.model.SysPurview;
import com.hongwei.futures.util.StrutsUtil;


public class MenuTag extends TagSupport{
	
	private String name;
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public int doStartTag(){
		boolean result = false;  
		FuAdmin admin = (FuAdmin) StrutsUtil.getHttpSession().getAttribute("admin");
		if(admin.getType()==1){
			result = true;
		}else{
			Collection<String> privilegeNames = new ArrayList<String>();
			List<SysPurview> priviList = (List<SysPurview>) StrutsUtil.getHttpSession().getAttribute("priviList");
			if(priviList != null && priviList.size()!=0){
				for(SysPurview p:priviList){
					privilegeNames.add(p.getName());
				}
				if (!privilegeNames.contains(name)) {
					
				} else {
					for(String pName:privilegeNames){
						if(name.equals(pName)){
							result = true;
						}
					}
				}
			}
		}
        return result ? EVAL_BODY_INCLUDE : SKIP_BODY;  
	}
}

后台主页

indexHome.jsp


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<%@ include file="../common/meta.jsp" %>
<%@ include file="/WEB-INF/include/tagtld.jsp"%>
<title>${title}-后台管理</title>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@include file="../common/cssback.jsp" %>
<style>
	.newgiude_icont{margin: 15px 10px 0 !important;}
	.lf_nav_title{font-size:17px;}
	.lf_nav_small{ border-left: 5px solid #efefef;border-bottom: 1px solid #fff;box-shadow: 1px 1px #fff;-moz-box-shadow:1px 1px #fff; -webkit-box-shadow:1px 1px #fff;display: block;height: 50px;text-indent: 22px;line-height:50px;}
	.newg_icont{display: block;width:19px;height:11px;background: url("../images_hhr/helpUp.png") no-repeat center;float: right;margin: 5px 53px;cursor: pointer;}
	.lf_smallNav{display:none;}
	.lf_nav{height:auto !important;}
	.frame{float:right;width:100%;height:100%;}
	.lf_nav ul li{border-bottom: 1px solid #fff;box-shadow: 1px 1px #fff;-moz-box-shadow:1px 1px #fff; -webkit-box-shadow:1px 1px #fff;}
	</style>
</head>
<body>
<c:if test="${empty admin}">
<c:redirect url="${ctx}/admin_login/adminLogin.htm"></c:redirect>
</c:if>
<div class="top">
<div class=" top_title fl">后台管理</div>
    <div class="fr grzx"><span class="geren">您好,${admin.account}  [${roleName}]</span>    <a href=#>

拦截器

package com.hongwei.futures.web.interceptor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.apache.struts2.ServletActionContext;
import org.springframework.beans.factory.annotation.Autowired;

import com.hongwei.futures.model.FuAdmin;
import com.hongwei.futures.model.SysPurview;
import com.hongwei.futures.model.SysRole;
import com.hongwei.futures.service.FuAdminService;
import com.hongwei.futures.service.SysRolePurviewService;
import com.hongwei.futures.service.SysRoleService;
import com.hongwei.futures.util.WebUtil;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class PurviewInterceptor extends AbstractInterceptor {

	private static final long serialVersionUID = -5615631164011209571L;

	@Autowired
	public FuAdminService fuAdminService;
	@Autowired
	private SysRoleService sysRoleService;
	@Autowired
	private SysRolePurviewService sysRolePurviewService;

	@SuppressWarnings("unchecked")
	public String intercept(ActionInvocation ai) throws Exception {
		String namespace = ai.getProxy().getNamespace();
		String actionName = ai.getProxy().getActionName();
		String privUrl = namespace + "/" + actionName;

		FuAdmin fuAdmin = null;
		if (WebUtil.getCookieByName(ServletActionContext.getRequest(), "admin_token") != null) {// 自动登录
			String token = WebUtil.getCookieByName(ServletActionContext.getRequest(), "admin_token");
			fuAdmin = fuAdminService.findLoginByToken(token);
			if (null == fuAdmin) {// 跳转登录页面
				if (privUrl.startsWith("/admin_login/adminLogin")) { // 登录的URL
					return ai.invoke();
				} else if (privUrl.startsWith("/admin_login/adminForward")) {
					return ai.invoke();
				} else {
					return WebUtil.returnCode(ai, "reAdminLogin");
				}
			} else {
				ai.getInvocationContext().getValueStack().setValue("admin", fuAdmin);
				ai.getInvocationContext().getValueStack().setValue("adminId", fuAdmin.getId());
				if (privUrl.startsWith("/admin_login/adminForward")) {
					return ai.invoke();
				}
				if (privUrl.startsWith("/admin_login/indexHome")) {
					return ai.invoke();
				}
				if (privUrl.startsWith("/admin_login/logoutAjax")) {
					return ai.invoke();
				}
				privUrl = privUrl + ".htm";
				boolean result = false;
				List<SysPurview> priviList = (List<SysPurview>) ActionContext.getContext().getSession().get("priviList");
				if (null == priviList) { // sesson过期
					// 重新存储用户对应的角色权限 和用户对象
					List<SysRole> roleList = sysRoleService.findRoleListByRoleId(fuAdmin.getId());
					for (SysRole role : roleList) {
						priviList = sysRolePurviewService.findPurviewListByRoleId(role.getId());
					}
					ActionContext.getContext().getSession().put("priviList", priviList);
					ActionContext.getContext().getSession().put("admin", fuAdmin);
					// return WebUtil.returnCode(ai, "nopermission");// 没有权限的页面
				}
				if (fuAdmin.getType() == 1) { // 超管
					result = true;
				} else {
					int pos = privUrl.indexOf("?");
					if (pos > -1) {
						privUrl = privUrl.substring(0, pos);
					}
					Collection<String> privilegeUrls = new ArrayList<String>();

					for (SysPurview p : priviList) {
						privilegeUrls.add(p.getUrl());
					}
					if (!privilegeUrls.contains(privUrl)) {

					} else {
						for (String pUrl : privilegeUrls) {
							if (privUrl.equals(pUrl)) {
								result = true;
							}
						}
					}
				}
				if (result == true) {
					return ai.invoke();
				} else {
					return WebUtil.returnCode(ai, "nopermission");// 没有权限的页面
				}
			}
		} else {
			return WebUtil.returnCode(ai, "reAdminLogin");
		}
	}

}

拦截器配置文件struts.xml

<package name="admin" extends="control-center">
		<interceptors>		
			<interceptor name="checkPurviewInterceptor" class="com.hongwei.futures.web.interceptor.PurviewInterceptor"></interceptor>
			
			<interceptor-stack name="defaultStack">
				<interceptor-ref name="checkPurviewInterceptor"></interceptor-ref>
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
</package>

监听器,用来加载后台所有权限菜单(顶级菜单,子菜单两个集合)

package com.hongwei.futures.web.listener;

import java.util.Collection;
import java.util.List;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.hongwei.futures.model.SysPurview;
import com.hongwei.futures.service.SysPurviewService;

public class InitListener implements ServletContextListener{
	
	
	// 装载权限列表的URL数据
	public void contextInitialized(ServletContextEvent sc) {
		ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(sc.getServletContext());
		SysPurviewService sysPurviewService = (SysPurviewService) ac.getBean("sysPurviewServiceImpl");
		
		List<SysPurview> purviewList = sysPurviewService.findTopPrivilege();
		sc.getServletContext().setAttribute("topPrivilegeList", purviewList);
		System.out.println("------------> 已准备数据topPrivilegeList <------------");
		
		// 准备数据:allPrivilegeUrls
		Collection<String> allPrivilegeUrls = sysPurviewService.getAllPrivilegeUrls();
		sc.getServletContext().setAttribute("allPrivilegeUrls", allPrivilegeUrls);
		System.out.println("------------> 已准备数据allPrivilegeUrls <------------");
	}

	public void contextDestroyed(ServletContextEvent arg0) {
		
	}
}

监听配置web.xml

       <listener>
		<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
	</listener>
	
	<listener>
		<listener-class>com.hongwei.futures.web.listener.InitListener</listener-class>
	</listener>

以上就是该权限管理中权限树(为角色分配权限)的大体实现,下面是效果图





本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

docker容器扫盲 - 2016-07-23 18:07:08

Centos 6.5 安装和使用docker 基于本人一贯的习惯,关于“某某某是什么”这样的问题,请百度吧,会有更专业的人士,会比我说的更详细更深,这里我只给出本人亲历的安装和使用过程。 1.安装 先检查服务器环境,docker要求操作系统CentOS6以上,kernel 版本必须2.6.32-431或更高,即=CentOS 6.5,运行docker时实际提示3.8.0及以上,必须64bit,32bit不支持docker。 [root @201 ~] # uname -r 2.6 .32 - 642.1
 原文地址: https://yq.aliyun.com/articles/57901?spm=5176.100239.blogcont57826.25.oaM83B 摘要:   在阿里巴巴在线在线技术峰会上的第三天,来自阿里云高级技术专家李金波为大家题为《企业大数据平台仓库架构建设思路》。本次分享中,李金波主要从总体思路、模型设计、数加架构、数据治理四个方面介绍了如何利用大数据平台的特性,构建更贴合大数据应用的数据仓库。 本文根据阿里云高级技术专家李金波在首届阿里巴巴在线峰会的《企业大数据平台仓库架

linux教程——1.启动过程 - 2016-07-23 17:07:29

Linux  系统启动过程 linux启动时我们会看到许多启动信息。 Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导。 运行init。 系统初始化。 建立终端 。 用户登录系统。 内核引导 当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。 操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。 运行init init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都
用一种分布式处理方法 挖掘分布式系统检测到的事件联系   点击下载演示文档 abstract: 现在,对监控、分析和控制大规模分布式系统的需求越来越高涨。监控下的事件往往呈现出相关联的关系,这对资源分配、工作调度还有故障预测有很大帮助。为了发现在检测到的事件中的联系,很多已有的方法是把被检测事件放到数据库中并对其进行数据挖掘。但是我们认为这些方法并不适合大规模分布式系统,因为监控事件的数据量增长得非常快以至于很难用一台计算机的力量来进行事件之间联系的发现。在本文中,我们提出了一种分布式的方法有效地检测事件

OSGI中Declarative Services的运用 - 2016-07-23 14:07:48

OSGI中Declarative Services的运用 前言 Declarative Services,即所谓的声明式服务,我在前文中曾经提及到注册式服务与声明式服务,但是在前文中并没有提及怎么使用声明式服务,只是简单的说了下概念和相对于blueprint来说有哪些优缺点,总而言之,可谓是一笔带过,这几日想起这个,还是决定需要仔细的讲一下声明式服务。 简介 Declarative Services,这是在OSGi 4以后的规范中出现的,在这里引用一段其他人说的话,Declarative Services
        我们都希望,配置文件是从一个服务引出,然后客户端监听服务端变化,实时重启自身加载最新配置,这样,我们就不用维护每个独立的客户端配置,更新也变得非常简单,而flume,显然意识到了这一个巨大的实惠,他是支持配置文件交由zookeeper维护的,这样我们在修改配置时,flume会自动重新加载。 1,zookeeper 添加节点         我们利用博客《 使用zkweb维护zookeeper数据 》中介绍的软件,编辑某一个随意路径,用于盛放我们的配置,路径如下: 2,flume 配置zk端
Spring MVC + mybatis实现的注册登录 前期准备:            如下图所示,准备好所需要的包, 新建工程,导入所需要的包,在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 http://ww
工欲善其事,必先利其器。对于程序员来说,Eclipse便是其中的一个“器”。本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍。Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分了你的神。而掌握了Eclipse的一些实用技巧,则可以大大提高开发效率。 1、丢掉鼠标吧之Eclipse快捷键篇 1.1文件切换的三种方式 1.1.1  Ctrl + E,在右边显示出当前打开的所有文件 1.1.2 Ctrl + Pg Up ,Ctrl + Pg Dn ,逐个文件跳跃 按下Ctrl + Pg
前言 想必HDFS集群的起停操作对于HDFS的使用者来说绝对不是一件陌生的事情.一般情况下我们重启集群服务是出于这2点原因:1).集群新增配置项,需要重启集群服务才能生效.2).对集群相关jar包程序进行了更新,需要重启服务来运行最新的jar包.于是我们重启了集群,一般的我们看它是否启动成功,一定会关注它的输出日志.比如说在HDFS中,我们会比较关注NameNode的启动日志.当然这的确是一个有效的办法,但是我们是否有其他更方便快捷的方法呢?比如说我不想登到NameNode所在节点上去看日志.最后的答案是
1、前言 进入 云计算 的时代,各大云提供商AWS, 阿里云 纷纷推出针对 Docker 的服务,现在Docker是十分火爆,那么Docker到底是什麽,让我们来体验一下。 2、Docker是什麽 Docker是一个开源的应用容器引擎,可以把应用以及依赖包放到一个可移植的容器中,然后发布到任何流行的  Linux  系统上,通过这种方式实现虚拟化。 提到虚拟化,大家应该十分熟悉了,有 VMware ,Xen, KVM 等等很多。那么,Docker和VM有什么不同呢,我们用官网的一张图来说明一下。 可以看出