CSS怎么我的世界联机平台啊,一般是什么平台

Primeton DI是一个高性能、易管控的数据集成平台,通过Primeton DI可以完成对各种类型数据的访问、...
最后回复于 日 22:37
最后回复于 日 15:14
最后回复于 日 01:53
最后回复于 日 01:53
最后回复于 日 15:30
最后回复于 日 00:43
最后回复于 日 00:44
最后回复于 日 21:28
最后回复于 日 01:53
最后回复于 日 01:53
最后回复于 日 11:14
最后回复于 日 01:53
最后回复于 日 01:53
最后回复于 日 01:53
最后回复于 日 01:53
发表于 日 15:04
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代 理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载…
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代 理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
从HaProxy官方网站下载最稳定的发布版本(1.4.25)源码包;使用源码包的好处是可以在不同的Linux环境上进行编译安装。
haproxy-1.4.25.tar.gz
HaProxy支持大多数的Linux OS, 我选择开源的操作系统Ubuntu Server 14.04(64Bites),当然选择SUSE或RadHat也没有问题。如果没有Linux环境,可以安装虚拟软件(如VMWare)创建虚拟机并安装操作系统,由于Ubuntu比较小巧,占用资源较少,比较适合在本机虚拟化环境中运行。当然,现在的PC配置较高一般的Linux OS可以安装几台都不成问题。
查看源码包下面的README文件,可以知道HAProxy所支持的OS:
& - linux22&&&& for Linux 2.2
& - linux24&&&& for Linux 2.4 and above (default)
& - linux24e&&& for Linux 2.4 with support for a working epoll (& 0.21)
& - linux26&&&& for Linux 2.6 and above
& - linux2628&& for Linux 2.6.28 and above (enables splice and tproxy)
& - solaris&&&& for Solaris 8 or 10 (others untested)
& - freebsd&&&& for FreeBSD 5 to 8.0 (others untested)
& - osx&&&&&&&& for Mac OS/X
& - openbsd&&&& for OpenBSD 3.1 to 5.2 (others untested)
& - aix52&&&&& &for AIX 5.2
& - cygwin&&&&& for Cygwin
& - generic&&&& for any other OS.
& - custom&&&&& to manually adjust every setting
(1)&&& 解压安装包
如果你的本地环境是Linux,那就直接解压安装包;或者使用的是虚拟机,则把安装包上传至虚拟机(可以使用Xftp软件或Linux scp命令);如果虚拟机可以连接Internet,也可以在虚拟机里直接下载HaProxy源码安装包;把准备好的源码安装包解压缩;
(2)&&& 源码包目录结构
&&&&&&&&&&&&
CHANGELOG : 版本变更信息,记录新增更能、BUG修改等信息
doc : 文档
example : 配置示例
tests : 测试用例(配置文件)
include : 依赖类库
ebtree : 类库
src : 源代码(c)
(3)&&& 编译源码
与一般编译安装源码程序不同,HaProxy安装不需要执行configure操作,在其安装包根目录下可以发现不存在configure脚本;执行make命令编译源码;
make TARGET=linux26 PREFIX=/opt/programs/haproxy-1.4.25
PREFIX指定安装程序的根目录,如果不指定则安装到系统默认目录下,编译结束根目录下多了一个可执行的文件:haproxy,就是核心程序,执行该命令可以启动HaProxy进程(当然要先准备好配置文件)。
(4)&&& 安装
执行make install安装编译产物。
查看安装结果:
HAProxy源码安装包中带有配置示例和技术文档,可以参考学习。以下举例配置最常用的两种代理HTTP和TCP。
Apache-tomcat
192.168.226.128:8080
Apache-tomcat
192.168.226.129:8080
&& maxconn 256
&& mode http
&& timeout connect 5000ms
&& timeout client 50000ms
&& timeout server 50000ms
listen http-in
&& bind *:80
&& server server1 192.168.226.128:8080 maxconn 32
&& server server2 192.168.226.129:8080 maxconn 32
先做一个简单的配置并测试。新建haproxy配置文件${haproxy.home}/conf/haproxy.cfg,输入上述配置内容后保存(配置文件可以任意命名,只要启动时指定配置文件路径即可&[-f ${cfgFilePath}])。执行${haproxy.home}/sbin/haproxy –f ${haproxy.home}/conf/haproxy.cfg启动haproxy进程。如果不知道命令参数,可以输入-h查看帮助信息。
执行${haproxy.home}/sbin/haproxy -f ${haproxy.home}/conf/haproxy.cfg启动haproxy进程;
编写一个JSP文件放入tomcat自带的example应用中(每个server里都放置一份),查看每次访问的server信息(可以在每个tomcat启动参数中加入不同的值-D${key}=${value},方便测试),JSP文件内容如下:
&%@pageimport="java.util.Properties"%&
&%@pageimport="java.net.InetAddress"%&
&%@pagelanguage="java"contentType="text/ charset=UTF-8"
pageEncoding="UTF-8"%&
InetAddress address = InetAddress.getLocalHost();
String hostAddress = address.getHostAddress();
String hostName = address.getHostName();
Properties props = System.getProperties();
&!DOCTYPEhtmlPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"&
&metahttp-equiv="Content-Type"content="text/ charset=UTF-8"&
&title&Test HAProxy HTTP mode&/title&
&&&&spanstyle="color:&blue;"&ZhongWen.Li ()&/span&
&&&&tablewidth="100%"border="0.1"&
&&&&&&&thead&
&&&&&&&&&tr&
&&&&&&&&&&&&thcolspan="2"align="center"&Server information&/th&
&&&&&&&&&/tr&
&&&&&&&/thead&
&&&&&&&tbody&
&&&&&&&&&tr&
&&&&&&&&&&&&td&SERVER ADDRESS&/td&
&&&&&&&&&&&&td&&%=hostAddress&%&&/td&
&&&&&&&&&/tr&
&&&&&&&&&tr&
&&&&&&&&&&&&td&SERVER NAME&/td&
&&&&&&&&&&&&tdstyle="color:&red;"&&%=hostName&%&&/td&
&&&&&&&&&/tr&
&&&&&&&&&tr&
&&&&&&&&&&&&td&Session ID&/td&
&&&&&&&&&&&&td&&%=session.getId()&%&&/td&
&&&&&&&&&/tr&
&&&&&&&&&tr&
&&&&&&&&&&&&tdcolspan="2"align="center"&System information&/td&
&&&&&&&&&/tr&
&&&&&&&&&%for&(Object key : props.keySet()) {&%&
&&&&&&&&&tr&
&&&&&&&&&&&&td&&%=key&%&&/td&
&&&&&&&&&&&&td&&%=props.get(key)&%&&/td&
&&&&&&&&&/tr&
&&&&&&&&&%&}&%&
&&&&&&&/tbody&
&&&&/table&
直接访问应用容器1
直接访问应用容器2
通过HaProxy访问,不断刷新页面,由于请求比较少,配置的第一台server响应的几率比较高(HaProxy把大部分请求分发到第一台Server上);如果每个Server的处理能力不一样(例如硬件环境不同)可以配置每个Server的最大请求数,优先级(权重)等并结合分发策略来合理利用每个Server的处理能力。更多高级配置可以参考官方文档(安装包根目录下doc/configuration.txt以及示例配置examples)
关闭其中一台Server,并通过HAProxy地址不断请求,你会发现有时请求正常响应,有时会出现503 Service Unavailable错误。这是因为使用上述的配置,HaProxy不知道后面的Server状态,只是安装现有的请求分发策略去处理请求,如果发到正常运行的Server上则响应正常,否则出现503错误。解决这个问题很简单,只要给这些Server配置一个健康检查页面即可和健康检查时间间隔,建议配置一个小的静态页面(如果健康检查太频繁、响应页面太大会消耗网络流量);这样HaProxy发现后端Server服务不可用时,则不会把请求转发给他。(通常可以使用HaProxy+ Keepalived来做应用的高可用方案)
应用集群会遇到一个问题:如何保持各个Server的回话(session)一致。这一点,HaProxy无能为力,只能通过其他手段来实现。可以通过扩展应用容器的session实现,集中存储session信息(例如存储在Memcached上),Jetty、Tomcat有很多开源的共享session实现。
VMWare RabbitMQ
192.168.226.128:5672
VMWare RabbitMQ
192.168.226.129:5672
&& maxconn 256
&& mode tcp
&& timeout connect 5000ms
&& timeout client 50000ms
&& timeout server 50000ms
listen rabbitmq
&& bind *:8001
&& server server1 192.168.226.128:5672 maxconn 32
&& server server2 192.168.226.129:5672 maxconn 32&&&&
使用rabbitmq-java客户端API编写测试代码。
package org.amqp.dev.
import com.rabbitmq.client.C
import com.rabbitmq.client.C
import com.rabbitmq.client.ConnectionF
import com.rabbitmq.client.QueueingC
public class MessageConsumer {
&&& private final static String QUEUE_NAME = "hello_world";
&&& private static String SERVER_HOST_1 = "192.168.226.128";
&&& private static String SERVER_HOST_2 = "192.168.226.129";
&&& private static int SERVER_1_PORT = 5672;
&&& private static int SERVER_2_PORT = 5672;
&&& private static String HAPROXY_HOST = "192.168.226.128";
&&& private static int HAPROXY_PORT = 8001;
&&& public static void main(String[] args) throws Exception {
&&&&&& //&新建连接工厂
&&&&&& ConnectionFactory factory = new ConnectionFactory();
&&&&&& factory.setHost(SERVER_HOST_1);
//&&&& factory.setHost(SERVER_HOST_2);
//&&&& factory.setHost(HAPROXY_HOST);
&&&&&& factory.setVirtualHost("/");
&&&&&& factory.setPort(SERVER_1_PORT);
//&&&& factory.setPort(SERVER_2_PORT);
//&&&& factory.setPort(HAPROXY_PORT);
&&&&&& factory.setUsername("guest");
&&&&&& factory.setPassword("guest");
&&&&&& //&新建连接
&&&&&& Connection connection = factory.newConnection();
&&&&&& //&建立通道
&&&&&& Channel channel = connection.createChannel();
&&&&&& //&重复声明队列,如果存在该队列且声明的参数与现在队列的参数一致则不会出错否则异常
&&&&&& channel.queueDeclare(QUEUE_NAME, false, false, false, null);
&&&&&& System.out.println("Waiting for messages.");
&&&&&& //&新建消息接收器
&&&&&& QueueingConsumer consumer = new QueueingConsumer(channel);
&&& &&& channel.basicConsume(QUEUE_NAME, true, consumer);
&&& &&& boolean flag =
&&& &&& while (flag) {
&&& &&&&& QueueingConsumer.Delivery delivery = consumer.nextDelivery(/*可以传入一个超时时间,否则死等*/);
&&& &&&&& String message = new String(delivery.getBody());
&&& &&&&& System.out.println("Received '" + message + "'");
&&& &&&&& // TODO biz
&&& &&& channel.close();
&&& &&& connection.close();
在Eclipse中使用Debug方式运行MessageConsumer:
从Debug视图中可以看到长连接的线程
从rabbitmq_management可以看到客户端连接;192.168.226.1:56423是rabbitmq java客户端在我的本地开启的一个端口;下面我们在更改连接方式,通过HaProxy连接rabbitmq。
编写HaProxy配置文件${haproxy.home}/conf/rabbitmq.cfg,输入上述配置后保存;执行${haproxy.home}/sbin/haproxy –f ${haproxy.home}/conf/rabbitmq.cfg&启动HaProxy进程;修改MessageConsumer代码,使用HaProxy的主机和端口:
在Eclipse中使用Debug方式运行MessageConsumer:
从Debug视图看到的连接线程显示的是HaProxy服务端口;
从rabbitmq_management可以看到客户端连接;但显示的客户端地址不是我本地的,而是HaProxy的地址。
可以编写测试类创建很多Connection,会发现和之前测试HTTP模式一样,他会连接到不同的Server上;这样我们就可以使用HaProxy来做负载。(rabbitmq可以搭建集群环境)
可以通过配置listen监控HaProxy后端服务状态:
listen admin
&& bind 0.0.0.0:11111
&& mode http
&& stats refresh 5s#刷新时间间隔
&& stats uri /admin#&访问地址
&& stats auth admin:admin#&登陆账户密码
需要为Server配置健康检查才能显示状态。
上述示例使用的是listen模块配置,也可以使用frontend(端口,引用的backend等)+ backend(后端服务)模块配置;
&&& global
&&&&&&& daemon
&&&&&&& maxconn 256
&&& defaults
&&&&&&& mode http
&&&&&&& timeout connect 5000ms
&&&&&&& timeout client 50000ms
&&&&&&& timeout server 50000ms
&&& frontend http-in
&&&&&&& bind *:80
&&&&&&& default_backend&servers
&&& backend&servers
&&&&&&& server server1 127.0.0.1:8001 maxconn 32
server server1 127.0.0.1:8002 maxconn 32
每个配置文件可以配置多个listen,但不能配置一样的端口;虽然可以配置多组,但不建议这么做,可以编写多个配置文件,分别为这些配置文件启动HaProxy进程完成,各个HaProxy独立运行,需要更新集群URL列表时(应用伸缩,应用迁移等)可以停止而不会影响其他应用。在使用HaProxy+keepalived做高可用方案时,可以主备先后停机更新配置做到服务不中断。
本文讲述了HaProxy的入门,利用简单的配置测试HaProxy的负载功能,更多高级的配置需要结合应用场景来配置测试。可以通过学习HaProxy的文档和示例掌握更多的配置技巧。
发表于 日 15:36
Monkey介绍及使用简介
1、 随着移动互联的普及,移动平台的测试也成为了一个热门,引用爱情公寓中黄大师的一句话:行走江湖,技多不压身。所以最近利用业余时间学习…
Monkey介绍及使用简介
1、 随着移动互联的普及,移动平台的测试也成为了一个热门,引用爱情公寓中黄大师的一句话:行走江湖,技多不压身。所以最近利用业余时间学习了android的自动化测试,市面上android自动化工具还是很多,各有各的特点,我还是决定先从android自带的工具开始学习,以后有机会会再带来其他工具的分享,首先,我先介绍下android自带的一个自动化测试方式,也可以称为稳定性测试或者压力测试的工具------monkey。
2、 第一步还是搭建android的开发环境,这里就不做介绍了,网上还是很多的,下面简单介绍monkey的使用,官网为(/tools/help/monkey.html),以下为官网的简单翻译:
Monkey是一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流,实现对正在开发的应用程序进行压力测试。Monkey包括许多选项,它们大致分为四大类:
· 基本配置选项,如设置尝试的事件数量。
· 运行约束选项,如设置只对单独的一个包进行测试。
· 事件类型和频率。
· 调试选项。
在Monkey运行的时候,它生成事件,并把它们发给系统。同时,Monkey还对测试中的系统进行监测,对下列三种情况进行特殊处理:
· 如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止。
· 如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错。
· 如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错。
按照选定的不同级别的反馈信息,在Monkey中还可以看到其执行过程报告和生成的事件。
基本使用方法:
$ adb shell monkey [options]
如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送1000个伪随机事件:
$ adb shell monkey -p your.package.name -v number
$ monkey -p(package的意思) &指定文件名 -v(测试的次数和频率) number(次数)
Monkey命令参数说明:
PS:以上只是简单介绍下这个工具,以及基本的用法,后续如果在学习中有进一步的了解还会分享给大家,本人也是初学,以后的分享中难免有错误,感兴趣的同学可以交流指出,共同进步。
发表于 日 13:20
EOS7.0版本的Coframe使用WIN7桌面风格解决方案如下:
1.拿到coframe发布的版本3.1.0
2.取出dist\ecds…
EOS7.0版本的Coframe使用WIN7桌面风格解决方案如下:
1.拿到coframe发布的版本3.1.0
2.取出dist\ecds目录下的coframe-eos7.ecd。将该ecd中除了ponents.coframe.skins.win7.jar外的其余文件都删除(防止替换用户其他构建包代码,只需要这一个jar)
3.在governor中部署删除文件后的ecd
4.初始化数据库脚本:win7风格有四张表:COMP_WIN7_AUTO_START、COMP_WIN7_CONFIG、COMP_WIN7_CUSTOM_PICTURES、COMP_WIN7_ICONS,从初始化脚本中找出对应的数据库的相关建表语句(只有建表语句,没有初始化数据)。执行该建表语句,创建这四张表
5.代码修改:在应用服务器下找到coframe\tools\skins\common.jsp文件,替换为 如下内容:
String skin="skin1";
String contextPath=request.getContextPath();
&link id="css_skin" rel="stylesheet" type="text/css"
href="&%=contextPath%&/coframe/tools/skins/&%=skin %&/css/style.css"/&
&link id="css_icon" rel="stylesheet" type="text/css"
href="&%=contextPath%&/coframe/tools/icons/icon.css"/&
&script type="text/javascript" src="&%=contextPath%&/common/nui/nui.js"&&/script&
$(function(){
nui.context='&%=contextPath %&'
var data={};
nui.DataTree.prototype.dataField='data';//兼容改造
6.win7风格首页地址:http://localhost:8080/default/skins/win7/index.jsp
7.修改登录后跳转页面为上述win7风格首页地址:修改应用下的web.xml文件(tomcat在webapps\default\WEB-INF目录下),
& & & 将其中的
&welcome-file-list&
&welcome-file& coframe/auth/index.jsp &/welcome-file&
&welcome-file&index.jsp&/welcome-file&
&/welcome-file-list&
& & & 替换为 & & &&
&welcome-file-list&
&welcome-file& skins/win7/index.jsp &/welcome-file&
&welcome-file&index.jsp&/welcome-file&
&/welcome-file-list&
& & & 即可在登录完成后跳转到win7风格首页
发表于 日 10:41
为了保证采用 EOS&BPS 产品的开发过程中各个小组和成员的程序结构和开发框架的
一致性以及增强代码的可维护性,在遵循 EOS&BPS 框架规则的基础上,建立基础业务框框
机系统的开发规范,…
本文针对EOS开发总结了开发规范和最佳实践,供EOS开发人员参考!
全文PDF下载地址:
以下为节选:
1.1. 编写目的&
为了保证采用 EOS&BPS 产品的开发过程中各个小组和成员的程序结构和开发框架的
一致性以及增强代码的可维护性,在遵循 EOS&BPS 框架规则的基础上,建立基础业务框框
机系统的开发规范,作为本项目相关的其他人员开展工作的基础和依据,并作为项目质量评
估的重要标准。&
1.2. 定义&
1) &EOS:上海普元公司提供的面向 SOA 的中间件平台,作为项目应用软件的技术平台&
2) &BPS:上海普元公司提供的面向 SOA 的流程平台,作为项目应用软件的流程平台&
3) &EOS Platform6.6:上海普元公司提供的面向 SOA的中间件集成平台,无缝集成了EOS
和 BPS两个产品。&
4) &构件:本规范所提到的构件及构件包的概念,均指EOS 中的构件与构件包&
5) &ABFRAME:基础业务框架&
2. 环境说明&
2.1. 开发工具&
使用EOS Platform6.6 Studio作为J2EE 应用的开发工具;&
2.2. 开发环境&
? &支持的操作系统: &&
Windows 2003/XP、Windows 7.0&
? &支持的 J2EE 服务器&
Tomcat 5.5.20&
? &支持的数据库&
Oracle 9i/10g&
DB2 UDB_V8.2/9.5&
Sqlserver 2000&
Sybase 12.5
Informix 9.4&
MySQL 5.0.22&
? &支持的浏览器&
Firefox 2/3&
? &支持的 JDK 版本&
SUN JDK1.5.0_22&
发表于 日 14:59
本文主要对EOS与IDATA页面集成进行阐述,为使用EOS和IDATA的集成提供参考。
2. 安装软件
本文主要对EOS与IDATA页面集成进行阐述,为使用EOS和IDATA的集成提供参考。
2. 安装软件
3. 集成步骤:
3.1 配置修改:
由于IDATA目前是单独的应用和EOS应用是分离的,所以在进行应用资源访问时需要对IDATA的信息进行配置:
配置文件目录:
XXX\Primeton\Platform\apache-tomcat-5.5.20\webapps\default\common\idata\idata.json
配置内容:
"user":"admin",//集成用户
"password":"manager",//集成用户密码
"server":"http://127.0.0.1:18080/primeton",//IDATA应用地址
"modules":{//下面是一些集成入口,防止以后IDATA那边有变动,目前不需要修改这些
"index":"/vision/index.jsp",
"login":"/vision/login.jsp",
"resource":"/vision/openresource.jsp",
"portal":"/vision/portal.jsp",
"module":"/vision/openmodule.jsp"
3.2.1 集成首页:
IDATA的WEB端可以进行一些简单报表的开发管理等:
l &在页面中引入IDATA集成公共的JSP,后面所有集成都需要引入该JSP,代码如下
&%@include file="/common/idata/IDataCommon.jsp" %&
引入了该JSP之后可以拿到IdataUtil这个JS对象:
该对象目前包括以下方法:
getIndexUrl()
获取IDATA首页地址
toJSONString(str)
str:待序列化的对象数组,如:
{name:"销售时间",value:"1996",displayValue:""}
{name:"销售月份",value:"8",displayValue:""}
对参数进行JSON序列化
getResourceUrl(resourceId,viewParams)
resourceId:需要打开的资源ID;&
viewParams显示参数(详见附录1)
获取资源URL
getModuleUrl(id,viewParams)
Id:模块ID(详见附录2)&
viewParams显示参数(详见附录1)
获取模块资源URL
getPortalUrl(viewParams)
viewParams(*&@pageid&对应的显示的页面标 I2c949e121d27be5d011d03&
&&&&& &*&@noBanner&是否隐藏页面头部 默认为不隐藏&
&&&&& &*&@showPath&是否显示当前位置 默认为true&
&&&&& &*&@hideTab&是否隐藏TAB 默认false)
获取DashBoardURL
l &通过IdataUtil.getIndexUrl()获取首页地址,展示方式可以自己定义
3.2.2 集成指定资源
实例JSP内容如下:
&%@page pageEncoding="UTF-8"%&
&%@include file="/common/common.jsp"%&
&%@include file="/common/skins/skin0/component.jsp" %&
&%@include file="/common/idata/IDataCommon.jsp" %&
- Author(s): Administrator
- Description:
&script type="text/javascript"&
function dosubmit(){
var viewParams=[
{name:"noBanner",value:*true*}
{name:"showPath",value:*false*}
{name:"hideTab",value:*true*}
var queryParams=[
{name:"销售时间",value:"1996",displayValue:""}
{name:"销售月份",value:"10",displayValue:""}
jQuery('#paramsInfo').val(IdataUtil.toJSONString(queryParams));
var form=document.getElementById('popform');
form.action=IdataUtil.getResourceUrl('I2c949e121d27be5d011d03',viewParams);
form.submit();
&body onload="dosubmit();"&
&form id="popform"
method="post"&
&input id="paramsInfo" type="hidden" name="paramsInfo"/&
l &新建JSP后,引入IDATA公共JSP &%@include file="/common/idata/IDataCommon.jsp" %&
l &如果有查询参数queryParams则要建立一个表单用来提交查询参数,查询参数paramsInfo(该名称是固定的)
查询参数在提交之前要做序列化转换
jQuery('#paramsInfo').val(IdataUtil.toJSONString(queryParams));
修改form的提交Action&
form.action=IdataUtil.getResourceUrl('I2c949e121d27be5d011d03',viewParams);
这里传递两个参数:
资源ID,可以从IDATA中获取(在IDATA中的菜单树中找到对应的资源,点击右键"属性节点ID"取得)
显示参数,详见附录1
l &若没有查询参数直接通过API获取URL。
IdataUtil.getResourceUrl('I2c949e121d27be5d011d03',viewParams)
3.2.3 集成模块
l &在JSP中导入:&%@include file="/common/idata/IDataCommon.jsp" %&
l &调用IdataUtil.getModuleUrl('commonset')获取URL;
getModuleUrl(id,viewParams)
Id:模块ID(详见附录2)&
viewParams显示参数(详见附录2)
获取模块资源URL
3.2.4 集成portal
Idata中可以自定义自己的portal页面,可以将portal页面集成到系统中:
l &在JSP中导入:
&%@include file="/common/idata/IDataCommon.jsp" %&
l &示例代码
var viewParams=[
{name:"pageid",value:'I2c949e121d27be5d011d03'}
{name:"noBanner",value:*true*}
{name:"showPath",value:*false*}
{name:"hideTab",value:*true*}
IdataUtil. getPortalUrl ('commonset');
getPortalUrl(viewParams)
viewParams(*&@pageid&对应的显示的页面标识I2c949e121d27be5d011d03&
&&&&& &*&@noBanner&是否隐藏页面头部 默认为不隐藏&
&&&&& &*&@showPath&是否显示当前位置 默认为true&
&&&&& &*&@hideTab&是否隐藏TAB 默认false)
获取DashBoardURL
发表于 日 15:15
EOS Platform 7.2中要对产品中的一些特性或者组件进行选择性安装,比如EJB特性,BPS,CAP,SSO组件等。
EOS Platform 7.2中要对产品中的一些特性或者组件进行选择性安装,比如EJB特性,BPS,CAP,SSO组件等。
EJB特性可选。EJB特性如果不选,在JEE应用服务器上,不用初始化JMS,和加载EJB。
Governor可选
Workspace可选
利用现有的安装包模块选件框架,分为安装选择,安装执行。
Governor和workspace可选,原来已经支持,不在此赘述,不过对于CAP、BPS是否安装的时候,需要考虑。
在安装包的resources\option_comps目录下,通过配置module_info.xml,在安装选择界面上就会出现。
&module id="ejb" nameKey="EJB" descKey="OPTION.EJB_SUITE" displaySeq="2" required="false" selected="false"&
&component id="ejb" nameKey="EJB" descKey="OPTION.EJB_DEFAULT_DESC" size="0" filesPath="" required="false" selected="false"/&
&module id="cap" nameKey="CAP" descKey="OPTION.CAP_SUITE" displaySeq="4" required="false" selected="false"&
&component id="cap" nameKey="CAP" descKey="OPTION.CAP_DEFAULT_DESC" size="60" filesPath="" required="false" selected="false"/&
安装执行主要通过使用deploy.xml来进行配置。
CAP有SCE和Governor两部分组成,根据前面的选择,生成一个全局变量,比如IS_DEPLOY_CAP,这样就可以在deploy.xml中对SCE进行判断后再部署安装。
由于原来已经能够进行CAP安装,只不过没有把它当作选件来区分而已。
Server部分,修改resources\base_comps\eos\server\deploy.xml如下:
&equals arg1="${IS_DEPLOY_CAP}" arg2="true"/&
&unzip src="${INSTALL_ROOT}/resources/option_comps/cap/sce/sce.war" dest="${TEMP_DIR}/${DEFAULT_APP_NAME}" /&
Governor部分,修改resources\base_comps\eos\governor\deploy.xml:
&equals arg1="${IS_DEPLOY_CAP}" arg2="true"/&
&echo message="......unzip ${INSTALL_ROOT}/resources/option_comps/cap/governor/governor.war to ${TEMP_DIR}/governor"/&
&unzip src="${INSTALL_ROOT}/resources/option_comps/cap/governor/governor.war" dest="${TEMP_DIR}/governor"/&
数据库初始化部分,在resources\option_comps\cap\deploy.xml中:
&equals arg1="${DB_IS_INIT}" arg2="true"/&
&echo message="...... init db for cap"/&
&action name="Init CAP Database" classname="com.primeton.installer.platform.action.InitDB" desc="" scale="10"&
&parameter name="COMPONENT_NAMES" value="coframe,cap"/&
跟CAP类同根。
EJB特性只在Server中含有,修改resources\base_comps\eos\server\deploy.xml
&equals arg1="${IS_DEPLOY_EJB}" arg2="true"/&
&unzip src="${TEMP_DIR}/${DEFAULT_APP_NAME}.ear/eos-server-access-ejb.jar" dest="${TEMP_DIR}/${DEFAULT_APP_NAME}.ear/eos-server-access-ejb"/&
&echo message ="......update ${DEFAULT_APP_NAME}.ear/eos-server-access-ejb/META-INF/jboss.xml"/&
&action name="update jboss.xml" classname="com.primeton.install.ext.action.UpdateJbossEJBConfig"&
&parameter name="JBOSS_EJB_JAR_XML_PATH" value="${TEMP_DIR}/${DEFAULT_APP_NAME}.ear/eos-server-access-ejb/META-INF/jboss.xml"/&
&delete dir="${TEMP_DIR}/${DEFAULT_APP_NAME}.ear/eos-server-access-ejb.jar"/&
&zip basedir="${TEMP_DIR}/${DEFAULT_APP_NAME}.ear/eos-server-access-ejb" destfile="${TEMP_DIR}/${DEFAULT_APP_NAME}.ear/eos-server-access-ejb.jar"/&
&delete dir="${TEMP_DIR}/${DEFAULT_APP_NAME}.ear/eos-server-access-ejb"/&
&equals arg1="${IS_DEPLOY_EJB}" arg2="true"/&
&echo message ="......config jms"/&
&action name="config jms" classname="com.primeton.install.ext.action.CreateJBossJmsQueue"&
&parameter name="JBOSS_HOME" value="${AS_JBOSS_HOME}"/&
&parameter name="SERVER_NAME" value="default"/&
&parameter name="QUEUE_NAME" value="${DEFAULT_APP_NAME}/EOS_INVOKE_QUEUE,${DEFAULT_APP_NAME}/EOS_RESULT_QUEUE"/&
&parameter name="QUEUE_JNDI" value="${DEFAULT_APP_NAME}/EOS_INVOKE_QUEUE,${DEFAULT_APP_NAME}/EOS_RESULT_QUEUE"/&
Application.xml配置
&equals arg1="${IS_DEPLOY_EJB}" arg2="false"/&
&move file="${TEMP_DIR}/${DEFAULT_APP_NAME}.ear/eos-server-access-ejb.jar"
tofile="${TEMP_DIR}/${DEFAULT_APP_NAME}.ear/${DEFAULT_APP_NAME}.war/WEB-INF/lib/eos-server-access-ejb-7.0.2.0.jar"/&
&action name="remove ejb module" classname="com.primeton.installer.platform.action.RemoveXMLNodeValue"&
&parameter name="FILE_PATH" value="${TEMP_DIR}/${DEFAULT_APP_NAME}.ear/META-INF/application.xml"/&
&parameter name="XPATH" value="//module[@id='DefaultEjbModule']"/&
根据以上配置,修改相应的deploy.xml和module_info.xml
原型验证结果
选择界面如图:
物理安装结果:
EJB、BPS、CAP、SSO不再存在
EJB特性、BPS、CAP等是可以选择性安装的。
发表于 日 15:35
发布企业App前,需要先申请企业发布证书,参见“iOS申请企业发布证书”章节。
1、打开XCode,修改你的 bundle identifier 为你的企业的app…
发布企业App前,需要先申请企业发布证书,参见“iOS申请企业发布证书”章节。
1、打开XCode,修改你的 bundle identifier 为你的企业的app id :
2、修改Edit scheme
3、修改bulid setting 的code sign:为企业的 mobileprifile
4、Product &archive 归档构建你的app
5、选择 distrbution
6、选择 "Save for Enterprise or AD-Hoc Deployment"
7、选择App对应的企业证书
8、这个要选择"Save for Enterprise Distribution" 做一些设置
Application URL 是你的ipa 将来要放到那里,也就是你的ipa包下载连接
Title :提示安装时候 alertview 的tittle &
Subtitle :提示安装时候 alertview 的subtitle
Large Image URL :这个是的ipa 包在下载时你的app 在桌面的icon@2x的(114Pix)
Small Image URL :这个是的ipa 包在下载时你的app 在桌面的icon(57Pix)
9、然后在桌面就有了2个文件,一个是 ipa 包,一个 plist 。将这两个文件以及57px和114px的图标放到可下载的路径下。
通常我们通过HTTP下载,所以可以简单放到Tomcat或者Apache服务器上。
10、前面的发布已经ok了,接下来就是要下载了
拿起你的手机在safari浏览器中输入.plist文件的下载路径,如:
itms-services:///?action=download-manifest&url=http://42.121.56.140:8080/unionpay140/unionpayer.plist
url=后面的部分就是你在第8步生成的那个 plist 发布的连接地址。
注意:由于iOS7.1要求下载时必须走https协议,所以plist文件必须放在支持https的网络环境下。为了简单起见,我们找的是Dropbox提供的免费https服务。
所以,我们的plist下载地址通常为
itms-services://?action=download-manifest&url=/s/8znloa7thnxo7un/unionpayer140.plist
发表于 日 15:38
websphere提供了哑安装能力,可以通过哑安装方式安装websphere,websphere升级程序,websphere补丁。
一、哑安装websphere
websphere提供了哑安装能力,可以通过哑安装方式安装websphere,websphere升级程序,websphere补丁。
一、哑安装websphere
1、修改websphere安装包WAS目录下responsefile.base.txt文件,里面记录了websphere的安装配置,主要参数:
#接受License
-OPT silentInstallLicenseAcceptance="true"
#是否允许非root用户安装
-OPT allowNonRootSilentInstall="true"
#取消对系统的检测
-OPT disableOSPrereqChecking="true"
-OPT installType="installNew"
#不安装示例
-OPT feature="noFeature"
#配置安装路径
-OPT installLocation="/opt/IBM/WebSphere/AppServer" &
#如果是在AIX下进行安装,则为
#-OPT installLocation="/usr/IBM/WebSphere/AppServer"
#不生成概要,因为安装websphere后需要安装补丁后再建立概要
-OPT profileType="none"
2、哑安装方式:
在命令行下通过参数方式哑安装,命令格式为:
install.exe -options ${responsefile.base.txt文件路径} -silent
二、哑安装websphere补丁安装程序
websphere补丁安装程序配置与websphere哑安装方式类似。
1、修改websphere补丁程序安装包下responsefile.updiinstaller.txt文件,里面记录了websphere补丁安装程序的安装配置,主要参数:
#接受License
-OPT silentInstallLicenseAcceptance="true"
#是否允许非root用户安装
-OPT allowNonRootSilentInstall="true"
#取消对系统的检测
-OPT disableOSPrereqChecking="true"
#配置安装路径
-OPT installLocation="/opt/IBM/WebSphere/update" &
#如果是在AIX下进行安装,则为
#-OPT installLocation="/usr/IBM/WebSphere/update "
2、哑安装方式:
在命令行下通过参数方式哑安装,命令格式为:
install.exe -options ${responsefile.updiinstaller.txt文件路径} -silent
三、哑安装补丁升级websphere
websphere和websphere补丁安装软件全部安装完毕后,通过哑安装方式对websphere升级打补丁。
1、修改websphere补丁安装程序下responsefiles目录中的install.txt文件,里面记录了websphere发布补丁的安装配置,主要参数:
#取消对系统的检测
-OPT disableOSPrereqChecking="true"
#配置补丁文件路径,可以是单个文件/多个多文件(逗号分隔)/目录
-W maintenance.package=="/home/test/was/fixs" &
#配置要升级的websphere软件安装路径
-W product.location=="/opt/IBM/WebSphere/AppServer"
-W update.type="install"
2、哑安装方式:
在命令行下通过参数方式哑安装,命令格式为:
update.exe -options ${install.txt文件路径} -silent
发表于 日 15:42
1.1 fragment概念
& & & fragment是一种特殊的插件,它需要一个host插件。我们通常将frag…
1.1 fragment概念
& & & fragment是一种特殊的插件,它需要一个host插件。我们通常将fragment看做是寄生插件,需要一个寄主(host project)。在运行时(runtime),fragment工程会被合并(merge)到host工程中,并被当做一个project。因为这种寄生关系,fragment可以访问host插件的所有类和资源。这里要说明的是fragment并不是一个完整的plugin, 而是host plugin功能的扩展。对于一个fragment来说, 它都有一个对应的host plugin, 如果host plugin不安装运行, 那fragment就算装了也不会起作用。
1.2 BPS Platfrom项目中fragment的使用
& & & 这次在BPS Platform 项目中我们主要任务是针对之前发布的版本进行字样的替换,但是此次修改并不能涉及修改源代码。所以我们采取的策略是针对需要修改的项目建立fragment来进行字样的修改。根据所需要修改的国际化资源文件找到它所在的项目,建立一个属于它的fragment项目,如果需要修改的字段在plugin_zh_CN.properties中,那就把plugin_zh_CN.properties复制到在fragment项目中(路径须保持一致),然后将host项目中的plugin_zh_CN.properties改为plugin_zh.properties,把fragment项目中的plugin_zh_CN.properties中需要修改的字段对其做修改,不需要修改的字段全部删除。然后在中文环境下安装,eclipse插件体系会根据系统语言环境会默认先读取plugin_zh_CN.properties文件,其中的内容为我们所修改的字段,接着再读取 &plugin_zh.properties文件,其中的内容为原先的所有字段,如果在plugin_zh_CN.properties已经读取的字段,则不再读取,直至资源文件读取完毕,这样就通过fragment插件完成了对资源文件字段的修改。
1.3 使用示例
& & & &以下为更改“生成EOS项目自动构建文件”为“生成BPS项目自动构建文件”的示例。
(1)找到host项目中的国际化资源文件,文件位置在com.primeton.eos.studio.assembly.ui项目中,如图1.1 host项目国际化资源文件所示。
& & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & 图1.1 host项目国际化资源文件
(2)新建一个针对host项目的fragment插件项目,Host Plug-in的Plug-in ID选择host项目的id,如图1.2 新建fragment插件项目所示。
& & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & 图1.2 新建fragment插件项目
(3)复制host项目中的plugin_zh_CN.properties至fragment插件项目中,并将host项目中的plugin_zh_CN.properties重命名为plugin_zh.properties,然后修改fragment中的plugin_zh_CN.properties中需要修改的字段,并将不需要修改的字段删除,只保留需要的字段即可。至此fragment项目建立完毕,如图1.3 fragment中的plugin_zh_CN.properties文件内容所示。
& & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & & & & & & 图1.3 fragment中的plugin_zh_CN.properties文件内容
(4)新建com.primeton.eos.studio.feature4bps和com.primeton.eos.studio.updatesite4bps项目,项目中的配置文件从com.primeton.eos.studio.feature和com.primeton.eos.studio.updatesite直接复制。
com.primeton.eos.studio.feature4bps项目负责新增插件的定义,我们需要把我们制作的fragment增加进来,如图1.4 com.primeton.eos.studio.feature4bps配置所示。
& & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & & & & & & &图1.4 com.primeton.eos.studio.feature4bps配置
& & & & com.primeton.eos.studio.updatesite4bps项目负责将我们定义的新插件打包,我们需要在category.xml和site.xml中添加进来。如图1.5 category.xml和图1.6 site.xml所示。
& & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & 图1.5 category.xml
& & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &图1.6 site.xml
& & &添加完成后并保存,至此此次对相关字样的修改结束
发表于 日 15:46
本文档中使用Jboss7.2.0-Final,运行模式为单服务器模式,数据库为oracle10g,数据库驱动为Ojdbc14,在win7上运行。手工部署请参考《BPS 6.5 手工部署指南(…
本文档中使用Jboss7.2.0-Final,运行模式为单服务器模式,数据库为oracle10g,数据库驱动为Ojdbc14,在win7上运行。手工部署请参考《BPS 6.5 手工部署指南(JBoss7)》。
一、将数据库驱动放到$JBOSS_HOME/standalone/lib文件夹下,驱动没有被加载,查阅Jboss7的配置文档后发现,jdbc驱动需要以模块方式添加,或者同应用一样部署。部署方式只需要jar符合jdbc4规范即可轻松部署。
1. &直接部署方式部署Jdbc驱动和添加数据源
数据库具体部署方式如下:
1) &检查驱动jar中是否包含META-INF/services/java.sql.Driver文件,文件中需包含这个jar中的驱动类的完整名称。如果没有的话可以手动添加这个文件。
2) &符合jdbc4规范的jar直接拷贝到$JBOSS_HOME/standalone/deployments目录下,即完成部署。
添加数据源:
1) &启动jboss服务器,登录http://ip:9990/,(需要先添加管理员账户,运行add-user.bat按照提示进行添加),在profile-& Subsystems-&Connector-&Datasources中添加,配置如下图:
JNDI Name要符合规范,以java:/datasources开头。
*注:*添加完成后,需要重启服务器。
2. & & & & 模块方式部署jdbc,修改配置文件增加数据源
Jboss7采用了轻量级的内核,用户要用到的应用服务器的功能都是通过扩展提供的,每个扩展被打包成$JBOSS_HOME/modules目录下的一个模块。扩展需要在domain.xml(域模式)或者standalone.xml(单服务器模式)中加入xml元素来指明这个模块名。用添加模块方式来增加jdbc驱动和数据源的方法如下:
1) & & & & 在$JBOSS_HOME/modules目录下新建目录结构com/oracle/jdbc14/main(可自定义,要与模块名相同),将数据库驱动拷贝到main目录下,并新建module.xml文件,文件内容如下:
&?xml version="1.0" encoding="UTF-8"?&
&module xmlns="urn:jboss:module:1.0"color:red"&com.oracle.jdbc14"&
&resources&
&resource-root path="ojdbc14-10.2.0.2.0.jar"/&
&/resources&
&dependencies&
&/dependencies&
其中模块名要与自定义的目录结构对应,resource-root path 为jar包名称。
2) & & & & 修改$JBOSS_HOME/standalone/configuration/standalone.xml,注册数据库驱动并添加数据源。在profile/subsystem/datasources中添加如下内容
&server xmlns="urn:jboss:domain:1.4"&
&subsystem xmlns="urn:jboss:domain:datasources:1.1"&
&datasources&
&datasource jta="false" jndi-name="java:/datasources/DefaultDataSource" pool-name="DefaultDataSource" use-ccm="false"&
&connection-url&jdbc:oracle:thin:@192.168.42.132:1521:orcl &/connection-url&
&driver-class&oracle.jdbc.driver.OracleDriver&/driver-class&
&driver&oracle14&/driver&
&min-pool-size&5&/min-pool-size&
&max-pool-size&10&/max-pool-size&
&prefill&true&/prefill&
&use-strict-min&false&/use-strict-min&
&flush-strategy&FailingConnectionOnly&/flush-strategy&
&security&
&user-name&bps654jboss&/user-name&
&password&qwerty&/password&
&/security&
&validation&
&validate-on-match&false&/validate-on-match&
&background-validation&false&/background-validation&
&/validation&
&statement&
&share-prepared-statements&false &/share-prepared-statements&
&/statement&
&/datasource&
&driver module="com.oracle.jdbc14"&
&xa-datasource-class&oracle.jdbc.driver.OracleDriver &/xa-datasource-class&
&/drivers&
&/datasources&
&/subsystem&
&/profile&
其中driver的module值要与1)中添加的模块名相同。
二、*部署应用时的特殊配置,*jboss7部署应用时,要在deployments目录下新建“应用名.dodeploy”文件,应用才会被加载。文件的内容随意。如果扩展名再改成“undeploy”,重启时应用就不会被加载。
三、*部署好应用之后启动报“找不到数据源”,*查看代码发现没有对jboss7进行支持,jboss7之前的版本用的“org.jboss.version”类,而jboss7用的“org.jboss.as.version.Version”,没有找到这个类的情况下就被判断为是tomcat服务器,返回的数据源前缀与添加的数据源不匹配导致找不到数据源。
解决方法:在eos-system.jar中增加了一个JBoss7Aware的jboss7的自省类,修改了jar中的配置文件META-INF\services\ com.eos.internal.system.IServerTypeAware中的类顺序,用于匹配jboss7。JNDI数据源名称的前缀指定为java:/datasource。
四、jar{*}冲突,*jboss7中提供了xalan-2.7.1.jbossorg-1.jar和serializer-2.7.1.jbossorg-1.jar,与应用中的xalan-2.5.0.jar冲突,删掉应用中的xalan-2.5.0.jar,替换成jboss中的xalan-2.7.1.jbossorg-1.jar和serializer-2.7.1.jbossorg-1.jar,并修改default.ear和workspace.ear中的META-INF\jboss-app.xml中的java2ParentDelegation=false,之后问题解决。
五、启动时报tld{*}文件解析错误,*查看报错的文件内容后,发现时jsp大小写的问题,将应用下WEB-INF\tlds和WEB-INF\private文件下下的所有tld文件中的&bodycontent&jsp&/bodycontent&中的jsp大写后,问题解决。
六、在governor{*}中初始化数据库时报找不到驱动,*将数据库的驱动放到governor\WEB-INF\lib中后问题解决。
七、用ibm的jdk1.6时,governor中添加default{*}应用时报错“非法应用环境,可能是应用名称错误,JMX{}用户名和密码不匹配”,错误信息如下:*
java.io.IOException: Failed to retrieve RMIServer stub: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:
java.net.ConnectException: Connection refused]
& & & & 经调试发现是jboss7与ibm jdk1.6一起用时出现的bug,在jboss的初始化上下文的类InitialContext中的lookup方法中,sun的jdk的NamingManager.getURLContext方法返回的是null,而ibm的jdk的返回的是空,jboss7判断的是是否为null,不为null的话就返回了错误的jndi。
& & & 解决方法:修改了jboss的InitialContext类,
八、还没解决的问题:
正常启动之后,后台在某些时候会出现sql错误,“SET TRANSACTION 必须是事务处理的第一个语句”。用其它的数据库没有出现这个错误,应该是我的数据库的问题。
发表于 日 15:55
Certificate
证书是用来给应用程序签名的,只有经过签名的应用程序才能保证他的来源是可信任的,并且代码是完整的, 未经修改的。
申请一个Cer…
Certificate
证书是用来给应用程序签名的,只有经过签名的应用程序才能保证他的来源是可信任的,并且代码是完整的, 未经修改的。
申请一个Certificate之前,需要先申请一个Certificate Signing Request (CSR) 文件,而这个过程中实际上是生成了一对公钥和私钥,保存在你Mac的Keychain中。代码签名正是使用这种基于非对称秘钥的加密方式,用私钥进行签名,用公钥进行验证。
App ID用于标识一个或者一组App,App ID应该是和Xcode中的Bundle ID是一致的或者匹配的。
分Explicit App ID和Wildcard App ID
每创建一个App ID,我们都可以设置该App ID所使用的APP Services
Devices中包含了该账户中所有可用于开发和测试的设备。 每台设备使用UDID来唯一标识。
Provisioning Profile
一个Provisioning Profile文件包含了上述的所有内容:证书、App ID、设备。
在一台设备上运行应用程序的过程如下:
参考资料:
/cywin888/p/3263027.html
发表于 日 15:58
JDK默认提供了jarsigner,可以对jar中的所有资源进行签名,从而进行防伪验证,使用jarsigner可以对一个jar进行签名和验证,当然,使用jarsigner需要配合JDK提供的…
JDK默认提供了jarsigner,可以对jar中的所有资源进行签名,从而进行防伪验证,使用jarsigner可以对一个jar进行签名和验证,当然,使用jarsigner需要配合JDK提供的keytool工具(用于生成密钥库文件keystore)。
下面介绍一下jar签名的技术,以及如何使用java编码来验证jar的签名。
一、使用java的keytool工具生成keystore文件
建立d:\temp\jarsign目录,用于存放证书和签名的jar。
1、生成密钥库和带有别名的证书
d:\temp\jarsing& keytool -genkey -keystore myKeyStore.ks -storepass myStor3pass -keypass myK3ypass -alias myCert -validity 3650
您的名字与姓氏是什么?
[Unknown]: Chen
您的组织单位名称是什么?
[Unknown]: Primeton
您的组织名称是什么?
[Unknown]: Primeton Software
您所在的城市或区域名称是什么?
[Unknown]: Shanghai
您所在的州或省份名称是什么?
[Unknown]: Shanghai
该单位的两字母国家代码是什么
[Unknown]: CN
CN=Chen, OU=Primeton, O=Primeton Software, L=Shanghai, ST="Shanghai ", C=CN 正确吗?
该命令生成一个keystore.ks密钥库文件,用来存储证书,密钥库的密码为myStor3pass, 密钥库有一个别名(证书名)为myCert的条目,访问该条目的密码是myK3ypass,证书有效期为3650天,即10年。
执行这个命令后,在d:\temp\jarsign目录下回生成一个myKeyStore.ks文件。
2、查看密钥库的证书
keytool -list -v -alias myCert -keystore myKeyStore.ks -storepass myStor3pass
显示如下:
别名名称: myCert
创建日期:
项类型: PrivateKeyEntry
认证链长度: 1
所有者:CN=Chen, OU=Primeton, O=Primeton, L=Shanghai, ST=Shanghai, C=CN
签发人:CN=Chen, OU=Primeton, O=Primeton, L=Shanghai, ST=Shanghai, C=CN
序列号:5330edbe
有效期: Tue Mar 25 10:45:18 CST 2014 至Fri Mar 22 10:45:18 CST 2024
MD5:4A:EE:72:1C:B1:C7:8F:D2:1C:72:22:4B:56:27:6E:9E
SHA1:04:04:74:1B:95:86:1E:EF:5C:68:72:0F:B2:3F:AE:38:A7:DD:FA:E7
签名算法名称:SHA1withDSA
二、使用jarsinger给jar进行签名
将eos-spring.jar复制到d:\temp\jarsign目录,下面对这个jar进行签名。
jarsigner -keystore myKeyStore.ks -storepass myStor3pass -keypass myK3ypass -signedjar eos-spring-signed.jar eos-spring.jar myCert
其中myCert指定了证书的名称。这个命令将eos-spring.jar生成签名后转成eos-spring-signed.jar。
最后在目录d:\temp\jarsign中生成被签名的jar:eos-spring-signed.jar。
用winzip打开eos-spring-signed.jar,会发现META-INF多出了MYCERT.SF(签名信息),MYCERT.DSA(证书)两个文件。
打开MYCERT.SF,可以看到类的签名信息:
Signature-Version: 1.0
SHA1-Digest-Manifest-Main-Attributes: g4p48Bz3wWapAPe5N4b66Rgbuz4=
Created-By: 1.6.0_33 (Sun Microsystems Inc.)
SHA1-Digest-Manifest: xcpYkxm/6I9ccBJJjgDugmZ4zSc=
Name: com/primeton/spring/exception/ParserConfigReferenceException.class
SHA1-Digest: d/Dqiz/HMUHON33WTqi7ke6qqF8=
Name: com/primeton/spring/BeanNameAutoProxy.class
SHA1-Digest: 6jXnMMg0VfJqWF68qcNb9DMCUC4=
Name: com/primeton/spring/context/ApplicationContextFactory.class
SHA1-Digest: 1VrXayKi3cCV6GkNDHr7ailuPwE=
Name: com/primeton/spring/parser/SpringConfigFileParser.class
SHA1-Digest: 0d86rQUw7NZju5TioWr+bczmkl4=
Name: com/primeton/spring/xsd/spring-tx.xsd
SHA1-Digest: 3Khsip21gqZliHThXz5+yFKf5BQ=
Name: com/eos/spring/TraceLogger.class
SHA1-Digest: +EN1d9tXQhjfmF/3NiTZPYm5RHQ=
注:命令行不指定密钥库口令和证书的口令也可以,如
jarsigner -verbose -keystore myKeyStore.ks -signedjar eos-spring-signed.jar eos-spring.jar myCert
这样,系统会让你分别输入密钥库口令短语和myCert的密钥口令,输入正确后,会生成签名的jar。
三、使用jarsinger验证签名的jar
下面命令用来验证签名的jar是否没被篡改。
jarsigner -verify eos-spring-signed.jar
返回结果:
jar 已验证。
说明jar验证成功。
也可以打印验证的详细信息。
jarsigner -verify -verbose eos-spring-signed.jar
返回结果为:
8308 Tue Mar 25 11:00:50 CST 2014 META-INF/MANIFEST.MF
5470 Tue Mar 25 11:00:52 CST 2014 META-INF/MYCERT.SF
1033 Tue Mar 25 11:00:52 CST 2014 META-INF/MYCERT.DSA
sm 75 Fri Apr 13 14:21:22 CST 2012 META-INF/modelloader.conf
sm 69 Fri Apr 13 14:21:22 CST 2012 META-INF/services/com.eos.spring.BeanFactory
sm 96 Fri Apr 13 14:21:22 CST 2012 META-INF/spring.handlers
sm 987 Fri Apr 13 14:21:22 CST 2012 META-INF/spring.schemas
sm 922 Fri Apr 13 14:21:22 CST 2012 com/eos/spring/BeanFactory$1.class
sm 1360 Fri Apr 13 14:21:18 CST 2012 com/eos/spring/BeanFactory$2.class
sm 3128 Fri Apr 13 14:21:22 CST 2012 com/eos/spring/BeanFactory.class
s = 已验证签名
m = 在清单中列出条目
k = 在密钥库中至少找到了一个证书
i = 在身份作用域内至少找到了一个证书
jar 已验证。
如果我们修改jar中一个文件,如com/primeton/spring/xsd/spring-util.xsd, 再次验证,会出现这个错误:
jarsigner: java.lang.SecurityException: SHA1 digest error for com/primeton/spring/xsd/spring-util.xsd
注意: 遗憾的是,直接使用jarsigner验证jar签名有一定的缺憾,jarsigner只能验证被修改过的jar内部class或其他文件,对于删除的class或文件是不报错的,对于增加的类或资源文件只报警告错误,如"此 jar 包含尚未进行完整性检查的未签名条目"。
四、使用java编程来验证jar的签名
为了弥补上面的缺陷,不能验证jar中被删除和新增的资源,使用java编写一个验证jar签名的程序,可以解决这些问题,该程序只验证签过名的jar,且jar中不能新增、删除、修改文件,否则程序验证不通过,对未签名的jar也验证不过。代码如下:
package demo.security.
import java.io.BufferedInputS
import java.io.BufferedR
import java.io.F
import java.io.IOE
import java.io.InputS
import java.io.InputStreamR
import java.util.E
import java.util.HashS
import java.util.M
import java.util.S
import java.util.jar.A
import java.util.jar.JarE
import java.util.jar.JarF
import java.util.jar.M
/** 签名的jar的验证器 */
public class JarSignatureVerifier {
private String cause=
public static void main(String[] args) throws IOException {
JarSignatureVerifier verifier=new JarSignatureVerifier();
boolean verified=verifier.verify(new File(args[0]));
if(verified)
System.out.println(args[0]+" is verified OK.");
String cause=verifier.getCause();
System.out.println(args[0]+" is not verified.");
System.out.println("The reason is "+cause);
public String getCause() {
if(cause==null)
return "";
public boolean verify(File jarFile) throws IOException {
JarFile jar=new JarFile(jarFile);
//find all signed resources from MANIFEST.mf
InputStream is = jar.getInputStream(jar.getEntry("META-INF/MANIFEST.MF"));
Manifest man = new Manifest(is);
is.close();
Set&String& signed = new HashSet&String&();
for(Map.Entry&String, Attributes& entry: man.getEntries().entrySet()) {
for(Object attrkey: entry.getValue().keySet()) {
if (attrkey instanceof Attributes.Name &&
((Attributes.Name)attrkey).toString().indexOf("-Digest") != -1)
signed.add(entry.getKey());
if(signed.size()==0) {
cause="jar has not been signed.";
//find all entries in jar
// contains all entries in the Manifest that are not signed.
// Ususally, the following will be excluded:
// * MANIFEST.MF itself
// * *.SF files containing the signature of MANIFEST.MF
// * *.DSA files containing public keys of the signer
Set&String& entries = new HashSet&String&();
for(Enumeration&JarEntry& entry = jar.entries(); entry.hasMoreElements(); ) {
JarEntry je = entry.nextElement();
if (!je.isDirectory()
&& !je.getName().equals("META-INF/MANIFEST.MF")
&& !(je.getName().startsWith("META-INF/") && je.getName().endsWith(".SF"))
&& !(je.getName().startsWith("META-INF/") && je.getName().endsWith(".DSA"))
entries.add(je.getName());
Set&String& unsigned = new HashSet&String&(entries);
unsigned.removeAll(signed);
// contains all the entries with a signature that are not present in the JAR
Set&String& missing = new HashSet&String&(signed);
missing.removeAll(entries);
if(unsigned.size()&0) {
cause="Some resources has not been signed.\n"+
if(missing.size()&0) {
cause="Some resources is missing from jar.\n"+
String cmd="jarsigner -verify "+jarFile.getAbsolutePath();
Process proc=Runtime.getRuntime().exec(cmd);
String cmdResult = new ProcessOutputReader().read(proc);
int exitVal = proc.exitValue();
if(exitVal==0)
int pos=cmdResult.indexOf("java.lang.SecurityException:");
if(pos==-1)
cause=cmdR
cause = cmdResult.substring(
pos+"java.lang.SecurityException:".length()+1);
class ProcessOutputReader {
private int lineCnt=0;
返回输出到控制台的行数
public int getOutputLineCnt() {
return lineC
读出控制台的输出
@param proc
public String read(final Process proc){
final StringBuffer sb = new StringBuffer();
final String lineSep=System.getProperty("os.name").toLowerCase()
.startsWith("windows")?"\n\r":"\n";
Thread outputThread=new Thread(){
public void run(){
String line = "";
BufferedReader reader=
InputStream is=proc.getInputStream();
InputStreamReader bis=
bis = new InputStreamReader(new BufferedInputStream(is),
System.getProperty("file.encoding"));
reader=new BufferedReader(bis);
while((line=reader.readLine())!=null){
sb.append(line);
sb.append(lineSep);
lineCnt++;
}catch(IOException e){
}finally {
reader.close();
} catch (IOException e) {
bis.close();
} catch (IOException e) {
is.close();
} catch (IOException e) {
Thread errorputThread=new Thread(){
public void run(){
String line = "";
BufferedReader reader=
InputStream is=proc.getErrorStream();
InputStreamReader bis=
bis = new InputStreamReader(new BufferedInputStream(is),
System.getProperty("file.encoding"));
reader=new BufferedReader(bis);
while((line=reader.readLine())!=null){
sb.append(line);
sb.append(lineSep);
}catch(IOException e){
}finally {
reader.close();
} catch (IOException e) {
bis.close();
} catch (IOException e) {
is.close();
} catch (IOException e) {
outputThread.start();
errorputThread.start();
try{ //等待进程执行结束
proc.waitFor();
}catch(InterruptedException e){
try { //在进程结束后,确保proc的输出流都被读入到sb中
outputThread.join();
errorputThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
return new String(sb);
运行java程序来验证jar的签名(运行之前,要指定PATH路径指向JDK的bin目录):
java demo.security.jarsign d:\temp\jarsign\eos-spring-signed.jar
1)如果验证通过,则显示:
D:\temp\jarsign\eos-spring-signed.jar is verified OK.
2)如果jar中有新增的资源没有经过签名,则显示:
D:\temp\jarsign\eos-spring-signed.jar is not verified.
The reason is Some resources has not been signed.
[com/spring-util.xsd]
3)如果jar中有部分类或资源被删除,则显示:
D:\temp\jarsign\eos-spring-signed.jar is not verified.
The reason is Some resources is missing from jar.
[com/primeton/spring/loader/SpringConfigFileCache.class, com/primeton/spring/interceptor/BeanMonitorMessage.class]
4)如果jar中有类或资源被篡改,则显示:
D:\temp\jarsign\eos-spring-signed.jar is not verified.
The reason is SHA1 digest error for com/primeton/spring/parser/SpringConfigFileParser.class
5)如果jar没有被签名,则显示:
D:\temp\jarsign\eos-spring.jar is not verified.
The reason is jar has not been signed.
发表于 日 16:02
主要概念:
服务器端需要向Apple申请一个用于推送的证书,用于标识是谁(哪个企业)在做推送任务
设备需要向APNS申请一个Token,用于标识该设备…
主要概念:
服务器端需要向Apple申请一个用于推送的证书,用于标识是谁(哪个企业)在做推送任务
设备需要向APNS申请一个Token,用于标识该设备。客户端要将该Token发送给服务器端,表示订阅
服务器向所有已订阅的客户端推送消息。要将报文和Token发送给APNS,APNS再推送到设备
iOS 的推送,可以不严谨的理解为:
苹果服务器朝手机后台挂的一个 IM 服务程序发送的消息。
然后,系统根据该 IM 消息识别告诉哪个 Apps 具体发生了什么事。
然后,系统分别通知这些 Apps 。
导出证书的主要步骤:
生成钥匙串请求 --&配置下载开发证书--& &配置App ID ,配置、下载SSL证书--&Provisioning证书
常见问题:
1. 服务器发送推送消息,没有报错,但客户端收不到,可能是ios客户端没有允许推送。需要在"设置--通知"中设置
2. 模拟器上正常运行,真机上报如下错误: & &
& &这是由于使用的是Distribution证书,而调试真机要用Develop证书
3.如果推送时报time out,可能是服务器设置了防火墙,或者访问外网设置了代理。
& & 推送服务器的地址如下:
& & 测试地址gateway.sandbox.:2195
& & 发布地址 gateway.:2195
参考资料:
一步步做消息推送
http://blog.csdn.net/showhilllee/article/details/8631734
发表于 日 16:08
首先登陆,点Member Center登录(用$299账号)
a.点击Certi…
首先登陆,点Member Center登录(用$299账号)
a.点击Certificates, Identifiers & Profiles
b.进入Certificates
c.选择证书类型 Production,选择添加
d.点击+后,选择Production-& In-House and Ad Hoc
e.之后继续continue,会看到需要上传证书界面
f.打开mac的钥匙串访问
g.选择钥匙串的证书助理
h.点击继续后存储证书,一般选择桌面(依据个人喜好)
i.在e的界面选择choose File将刚刚存储的证书上传。
j.下载证书,双击安装
k.生成证书对应的provision File
l.continue-选择App ID
PS:此处App ID选择自己原来建的。如果没有,到Identifiers-&App IDs中新建一个
m.点击继续-&然后选择刚刚新建的发布证书
n.选择继续,填写Profile Name
o.点击生成后会在provision profiles 里看到你锁生成的profiles,选择type为distribution的那个下载下来,同样双击安装即可
发表于 日 16:37
手工部署BPS(集群)
手工部署包支持的WebSphere版本有WebSphere6.1.0.17和 WebSphere7.0.0.0。
手工部署BPS(集群)
手工部署包支持的WebSphere版本有WebSphere6.1.0.17和 WebSphere7.0.0.0。
示例中的部署环境为WebSphere 8.0.0.0、AIX6.1(ip=192.168.2.176)操作系统,步骤如下:
1. & & & 获取部署文件
从BPS_6.7_Deploy_Package.zip中获取WebSphere对应版本的bps.war,governor.war,workspace.war。
包括BPS Process Server(BPS流程引擎),BPS Rule Engine(BPS规则引擎)。
workspace.war
包括BPS Process Composer(BPS业务流程定制),BPS Rule Composer(BPS业务规则定制),BPS Admin & Monitor(BPS流程管理监控台)。
governor.war
包括BPS Governor(BPS引擎治理工具)。它是集成BPS提供的系统管理工具,系统管理员可以通过它对BPS流程引擎进行配置和管理。
2. & & & 创建概要文件
实例中会创建3个概要文件:一个Deployment manager(ClusterDmgr)和两个Application Server(ClusterAppSrvS1,ClusterAppSrvS2)用来搭建websphere集群环境。另外会创建一个管理的Profile:ManagerAppSrv,用于安装governor和workspace。
规划集群结构如下。
概要文件名称
概要文件类型
ClusterDmgr
Deployment manager
192.168.2.176
ClusterAppSrvS1
Application server
192.168.2.176
ClusterAppSrvS2
Application server
192.168.2.176
ManagerAppSrv
Application server
192.168.2.176
请用户提前准备好概要文件(Application server),创建概要文件详细步骤这里不再介绍。
3. & & & 启动Dmgr和AppSrv成员节点
1) &启动ClusterDmgr
#cd &/opt/WebSphereBPS/AppServer/profiles/ClusterAppSrvMgr/bin/
#./startManager.sh
2) &启动ClusterAppSrvS1成员节点
#cd &/opt/WebSphereBPS/AppServer/profiles/ ClusterAppSrvS1/bin/
#./startServer.sh &server1 &
3) & & 启动ClusterAppSrvS2成员节点
#cd &/opt/WebSphereBPS/AppServer/profiles/ ClusterAppSrvS2/bin/
#./startServer.sh &server1 &
4. & & & 添加集群成员
进入Dmgr_Cluster控制台,访问URL:http://IP:DmgrPort/admin,登陆后进行以下菜单进行操作:
1) &添加节点
依次选择:System administration-&Nodes,点击&Add Node&,选中“Managed node”,点击&next&,主机:ClusterAppSrvS1所在主机IP,JMX连接器端口:ClusterAppSrvS1的SOAPPort,由于创建概要文件时没有设置用户名密码,因此这里用户名和密码不需要填写,其它设置默认即可。点击&OK&完成节点添加。如上方法,创建受管节点ClusterAppSrvS2。
添加完成后如图4-1所示:
图4-1 添加受管节点
注意:添加节点时,被管所在的物理机和主管所在的物理机的系统时间差要在5分钟之内,否则会造成添加节点失败。
2) &创建集群并添加成员
依次选择:Servers-&Clusters-&WebSphere application server
点击&New…&,创建集群。集群名称:bpsCluster(必须和后面governor中创建的服务器组名一致),如图4-2:
图4-2 创建name为bpsCluster的集群
& & 点击&Next&,添加集群成员s2。成员名:s1(和governor中服务器名一致),选择节点192Node03(每个成员对应一个节点),其他设置默认即可,如图4-3:
图4-3 为bpsCluster集群添加一个节点成员s1
点击&Next&,添加集群成员s2。成员名:s2,选择节点192Node04,点击&Add Member&,如图4-4:
图4-4 为bpsCluster集群添加节点成员s2
点击&Next&,查看添加的节点信息是否正确,如图4-5。并点击&Finish&,完成集群成员添加。
图4-5 bpsCluster集群成员信息查看
完成添加后,集群添加完毕,如图4-6:
图4-6 bpsCluster集群
查看集群拓扑,如图4-7:
图4-7 集群bpsCluster拓扑
3) &删除集群成员对应的server1
依次选择:Servers-&Server Types-&WebSphere application servers,如图4-8
图4-8 应用服务器列表
删除2个名为server1的服务器,保存。删除后如图4-9
图4-9 集群服务器
4) &查看被管的http端口
依次点击Environment-&Virtual hosts-&default_host-&Host Aliases,查看是否有s1, s2的WC_defaulthost端口,如果没有则需要手动添加。如图4-10:
图4-10 主机别名
注意:被管服务器的http端口不是profile中的http端口,而是以WebSphere集群中服务器(如本例中的s1,s2)的WC_defaulthost端口作为http端口。如果列表中没有则要手工添加,然后重启服务器使其生效。WC_defaulthost端口的查看方法:Server-&Server Types-&WebSphere application servers,选择s2(或s1),在“Communications”中点击“Ports”,如图4-11:
图4-11 查看端口
5. & & & 创建外置目录
为每个受管服务器创建外置目录,建议以apps_config为文件夹名,外置配置目录用来存放应用启动配置和运行期的配置。如ClusterAppSrvS1的外置目录为:/opt/IBM/WebSphere/AppServer/profiles/ClusterAppSrvS1/s1/apps_config,ClusterAppSrvS2的外置目录为/opt/IBM/WebSphere/AppServer/profiles/ClusterAppSrvS2/s2/apps_config。
在每个受管服务器的外置目录下创建以部署到该集群的应用名为名称的子目录,如本例中要部署的应用名称为default,需要在apps_config目录下创建default目录,然后在default目录下创建startup.conf文件(例如ClusterAppSrvS1:$
Unknown macro: {profile_home}
/s1/apps_config/bps/startup.conf),配置应用的绑定IP和管理端口,格式如下:
LocalIP=192.168.2.176
AdminPort=6200
用户应保证LocalIP值为受管服务器所在机器的一个真实IP,AdminPort值不被其他已部署应用占用。
通过管理控制台给每个集群成员服务器配置JVM的外置目录参数EXTERNAL_CONFIG_DIR,值为外置目录文件夹路径。依次选择:Servers-&Server Types-&WebSphere application servers-&s1,点击Java and Process Management-&Process definition-&Java Virtual Machine-&Custom properties、点击&New&,设置s1的外置目录,如图5-1。
图5-1 为s1设置外置目录
如上述方法,设置s2的外置目录。

我要回帖

更多关于 饥荒联机平台 的文章

 

随机推荐