陈奇网络工作室

从JbossEAP6.4迁移到EAP7.1

建站服务器

砰的一声

升级JavaEE

属国

groupIdorg.jboss.bom/groupId

JBoss-EAP-javaee 7/artifactId

version7.1.1.GA/version

typepom/type

范围导入/范围

/依赖关系

属国

groupIdorg.jboss.eap/groupId

人工标识wildfly-EJ B-客户-物料清单/人工标识

版本7 .1 .1 .ga-红帽-2/版本

typepom/type

范围导入/范围

/依赖关系

属国

groupIdorg.jboss.eap/groupId

artifact id wild fly-JMS-client-BOM/artifact id

版本7 .1 .1 .ga-红帽-2/版本

typepom/type

范围导入/范围

/依赖关系

升级属国

属国

groupIdorg.jboss.spec.javax.servlet/groupId

artifact id JBoss-servlet-API _ 3.1 _ spec/artifact id

范围提供/范围

/依赖关系

属国

groupIdorg.jboss.remoting/groupId

JBoss-remoting/artifactId

范围提供/范围

/依赖关系

属国

groupIdorg.jboss.spec.javax.ejb/groupId

JBoss-EJ b-API _ 3.2 _ spec/artifactId

范围提供/范围

/依赖关系

属国

groupIdorg.jboss.spec.javax.jms/groupId

artifact id JBoss-JMS-API _ 2.0 _ spec/artifact id

范围提供/范围

/依赖关系

.

设置默认编码

子系统xmlns=urn:JBoss:domain:under flow:4.0

.

servlet-container name=default default-encoding=UTF-8 use-listener-encoding=true

jsp-config/

websockets/

/servlet-容器

.

/子系统

配置ajp-监听器和实例身份证明(identification)

子系统xmlns=urn:JBoss:domain:under flow:4.0 instance-id=ASD app 1

缓冲区缓存名称=默认/

服务器名称=默认-服务器

ajp-监听器名称=ajp套接字绑定=ajp方案=http/

http侦听器名称=默认socket-binding=http redirect-socket=https enable-http 2=true/

https-listener name=https socket-binding=https security-realm=应用程序领域enabled-protocols=tlsv 1.2 enable-http 2=true/

.

/服务器

.

/子系统

JSF 1.2

EAP 7不支持JSF 1.2,可从EAP 6将JSF 1.2模块(包含javax.faces.api,com.sun.jsf-impl,org.jboss.as.jsf-injection)迁移过来,module.xml内容无需更改,建议修改一下组件版本jboss:模块:1.5

如部署使用的耳朵包,在JBoss-部署-结构。可扩展标记语言中增加如下配置:

JBoss-部署-结构

部署

不包括的项目:如接受服务项目是由投保以前已患有的疾病或伤害引致的

模块名称=javax.faces.api/

module name=com.sun.jsf-impl/

模块名称=组织。JBoss。作为。JSF注射液/

/排除

属国

模块名=javax。面孔。API slot=1.2 export=true/

模块名=com。星期日JSF-impl slot=1.2 export=true/

模块名=组织。JBoss。作为。JSF-注入槽=1.2导出=真/

/依赖关系

/部署

子部署名称=ejb.jar

不包括的项目:如接受服务项目是由投保以前已患有的疾病或伤害引致的

模块名称=javax.faces.api/

module name=com.sun.jsf-impl/

模块名称=组织。JBoss。作为。JSF注射液/

/排除

属国

模块名=javax.faces.api slot=1.2/

模块名=com。星期日JSF-impl槽=1.2/

模块名=组织。JBoss。作为。JSF-注入槽=1.2/

/依赖关系

/子部署

子部署名称=网页.战争

不包括的项目:如接受服务项目是由投保以前已患有的疾病或伤害引致的

模块名称=javax.faces.api/

module name=com.sun.jsf-impl/

模块名称=组织。JBoss。作为。JSF注射液/

/排除

属国

模块名=javax.faces.api slot=1.2/

模块名=com。星期日JSF-impl槽=1.2/

模块名=组织。JBoss。作为。JSF-注入槽=1.2/

/依赖关系

/子部署

/JBoss-部署-结构

Richfaces 3.3

因EAP 7的小型应用程序版本是3.1,文件上传组件不能使用,需要使用获取零件方法重写多请求实现。

包org。阿贾克斯4 JSF。请求;

导入org。阿贾克斯4 JSF。例外。fileuploadexception

导入org。阿贾克斯4 JSF。web应用程序。基本XML筛选器;

导入org。阿帕奇。公地。伐木。日志;

导入org。阿帕奇。公地。伐木。原木工厂;

导入org。丰富的面孔。组件。文件上传常量;

导入org。丰富的面孔。模型。上传项目;

导入javax。面孔。语境。外部环境;

导入javax。面孔。语境。面向上下文;

导入javax。servlet。http。http servlet请求;

导入javax。servlet。http。http servlet请求包装器;

导入javax。servlet。http。部分;

导入Java。io。*;

导入Java。RMI。服务器。uid

导入Java。util。ArrayList

导入Java。util。收藏;

导入Java。util。列表;

导入Java。util。地图;

导入Java。util。并发。并发hashmap

/**

*支持多部分请求的请求包装器,用于文件上传。

*

* @作者谢恩布里扎克

*/

公共类多请求扩展HttpServletRequestWrapper {

私有静态最终日志记录器=日志工厂。获取日志(多部分请求。类);

私有静态最终int BUFFER _ SIZE=2048

私有布尔创建临时文件

私有部分文件部件

private ByteArrayOutputStream bOut=null;

私有文件输出流fOut=null

私有文件tempFile=null

私有字符串用户界面设计(User Interface Design的缩写)

私有整数content length=0;

private int bytes read=0;

private int read=0;

私有字节[]缓冲区;

私有输入流输入;

//由于portlets的原因,在请求到达相位监听器之前,我们不应该允许停止

私有布尔canStop=false

私有映射字符串,对象百分比映射=空.

private MapString,整数requestSizeMap=null .

private MapString,String requestKeysMap=null .

私有字符串请求键=空

私有MultipartRequestRegistry请求注册表;

布尔初始化=假;

private boolean应停止=false

私有布尔值已取消;

公共多部分请求(http servlet请求请求,boolean createTempFiles,int maxRequestSize,String uid) {

超级(请求);

这个。createTempFiles=createTempFiles;

this.uid=uid

这个。contentlength=整数。解析int(请求。get头(Content-Length));

}

公共空的取消(){

this.canceled=true

删除文件();

}

私有void deleteFile() {

尝试{

如果(fOut!=null) {

fout。close();

if (tempFile!=null) {

临时文件。delete();

}

}

} catch(异常e) {

抛出新的FileUploadException(无法删除临时文件);

}

}

私有void fillBuffer()引发IOException {

read=输入. read(缓冲);

如果(读取0) {

bytesRead=读取

}

fillrprogressinfo();

}

私有void readData()引发IOException {

而(读取0) {

appendData(buffer,0,read);

填充缓冲区();

}

}

私有void初始化()引发IOException {

如果(已初始化){

返回;

}

初始化=真;

缓冲区=新字节[BUFFER _ SIZE];

getfile部分();

input=getfile inputstream();

setupProgressData();

填充缓冲区();

}

私有void getFilePart() {

尝试{

filePart=null

集合部分parts=get parts();

对于(零件零件:零件){

if (part.getName().endsWith(:file)) {

filePart=零件

if (createTempFiles) {

创建tempfile();

}

打破;

}

}

} catch(异常e) {

logger.error(e.getMessage(),e);

}

}

public void createTempFile() {

尝试{

tempFile=File.createTempFile(新UID().toString().替换(:-),上传);

fOut=新文件输出流(tempFile);

} catch (IOException ex) {

抛出新的FileUploadException(无法创建临时文件);

}

}

private void appendData(byte[]data,int start,int length)引发IOException {

如果(fOut!=null) {

fOut.write(数据、起始、长度);

fout。flush();

}否则{

if (bOut==null) {

bOut=new ByteArrayOutputStream();

}

布特. write(数据,开始,长度);

}

}

public void parseRequest() {

canStop=true

setupProgressData();

尝试{

initialize();

read data();

} catch (IOException e) {

这个。cancel();

如果(!this.shouldStop) {

抛出新的FileUploadException(解析多部分请求时出现超正析象管(Image Orthicon)错误,e);

}

}

}

公共静态多部分请求查找请求(FacesContext上下文,String uploadId) {

MapString,对象会话映射=上下文。getexternalcontext().getSessionMap();

MapString,String requestKeys=(MapString,String)会话映射。获取(文件上传常量.请求_密钥_ BEAN _名称);

if (requestKeys!=null) {

字符串请求密钥=请求密钥。get(上传id);

if (requestKey!=null) {

多部分请求注册表。getinstance(上下文);

if (requestRegistry!=null) {

多部分请求request=请求注册表。get请求(请求键);

如果(请求!=null) {

退货请求;

}

}

}

}

返回空

}

@ SuppressWarnings(未选中)

私有void setupProgressData() {

if(percent map==null | | requestSizeMap==null | | requestseymap==null){

FacesContext FacesContext=FacesContext。getcurrentinstance();

if (facesContext!=null) {

外部上下文外部上下文=facescontext。get external context();

if (externalContext!=null) {

MapString,对象会话映射=外部上下文。getsession map();

if (sessionMap!=null) {

字符串上传id=get upload id();

同步(会话映射){

if (percentMap==null) {

percentMap=(MapString,Object)会话映射。获取(文件上传常量.百分比_ BEAN _ NAME);

if (percentMap==null) {

percent map=新的并发hashmap字符串,Object();

会话映射。上传(文件上传常量.百分比_BEAN_NAME,百分比映射);

}

}

if (requestSizeMap==null) {

requestSizeMap=(MapString,Integer)会话映射。获取(文件上传常量.请求大小豆名称);

if (requestSizeMap==null) {

requestSizeMap=new concurrent hashmap string,Integer();

会话映射。上传(文件上传常量.请求大小BEAN名称,请求大小映射);

}

}

if (requestKeysMap==null) {

requestKeysMap=(MapString,String)会话映射。获取(文件上传常量.请求_密钥_ BEAN _名称);

if (requestKeysMap==null) {

request keys map=new concurrent hashmap String,String();

会话映射。上传(文件上传常量.REQUEST_KEYS_BEAN_NAME,请求键映射);

}

}

}

percentMap.put(uploadId,double。(0)的值);

requestSizeMap.put(uploadId,getSize());

请求注册表=multipartrequestregistry。getinstance(facesContext);

请求密钥=请求注册表。注册请求(此);

requestKeysMap.put(uploadId,请求键);

}

}

}

}

}

私有void fillerprepsinfo(){

setupProgressData();

if (percentMap!=null) {

双倍百分比=(100.0 *这个。读取的字节数/this。content length);

percentMap.put(uid,percent);

}

}

公共整数getSize() {

返回内容长度

}

public byte[] getFileBytes(字符串名称){

if (filePart==null) {

返回空

}

如果(fOut!=null) {

尝试{

fout。close();

} catch (IOException ex) {

}

fOut=null

}

如果(布特!=null) {

返回布特。tobytearray();

}

if (tempFile!=null tempFile.exists()) {

尝试{

file inputStream inputStream=新文件inputStream(tempFile);

ByteArrayOutputStream输出流=new ByteArrayOutputStream();

字节[]缓冲区=新字节[BUFFER _ SIZE];

int read=inputstream。读(buf);

而(阅读!=-1) {

outputStream.write(buf,0,read);

读取=输入流。读(buf);

}

outputStream.flush().

输入流。close();

临时文件。delete();

返回输出流。tobytearray();

} catch (IOException ex) {

}

}

返回空

}

公共输入流getfile输入流()引发IOException {

return filePart==null?空:文件部分。getinputstream();

}

公共字符串getFileContentType() {

返回文件部分!=null?文件部分。获取内容类型():null

}

公共对象getFile() {

if (filePart==null) {

返回空

}

if (tempFile!=null) {

如果(fOut!=null) {

尝试{

fout。close();

} catch (IOException ex) {

}

fOut=null

}

返回临时文件;

}

如果(布特!=null) {

返回布特。tobytearray();

}

返回空

}

公共字符串getFileName() {

返回文件部分!=null?文件部分。getsubmittedfilename():null;

}

public int getFileSize() {

返回文件部分!=null?(int)文件部分。getsize():-1;

}

public ListUploadItem getUploadItems(){

ListUploadItem上传项目=new ArrayList();

if (filePart!=null) {

上传项目。add(新上传项(getFileName()、getFileSize()、getFileContentType()、getFile());

}

返回上传的项目;

}

public boolean isFormUpload() {

return _ rich faces _ form _ upload等于(uid);

}

@覆盖

公共字符串getHeader(字符串名称){

如果(!Accept.equals(name)) {

返回超级棒。获取标题(名称);

}否则{

返回BaseXMLFilter .文本_ HTML

}

}

公共无效站点(){

if (canStop) {

shouldStop=true

}

}

public boolean isStopped() {

返回这应该停止了

}

公共布尔isDone() {

回归!(这个。应该停止(这个。取消| |这个。内容长度!=null this。内容长度。int value()!=这个。读取的字节数));

}

@覆盖

公共字符串getContentType() {

返回application/x-www-form-urlencoded;

}

受保护的字符串getUploadId() {

返回用户界面设计(User Interface Design的缩写)

}

public void clearRequestData() {

字符串上传id=get upload id();

if (percentMap!=null) {

百分比图。删除(上传id);

}

if (requestSizeMap!=null) {

requestsizemap。删除(上传id);

}

if (requestKeysMap!=null) {

requestkeysmap。删除(上传id);

}

if (requestRegistry!=null) {

请求注册。移除请求(请求密钥);

}

}

}

另外,Richfaces 3.3.4。最终文件上传组件页面显示有中文乱码问题,需要修改FileUploadRendererBase的初始标签方法,删除value=转储编写器。tostring();这一行。

休眠3.5

强烈建议升级到冬眠5,如确实不能升级,需创建一个3.5模块,放入依赖包,模块配置如下:

?可扩展标记语言版本=1.0编码=UTF-8?

模块xmlns=urn:JBoss:module:1.5 name=org。休眠槽=3.5

性能

属性名=jboss.api值=不支持/

/属性

资源

资源根路径=hibernate-core-3。5 .六强决赛。罐子/

资源-根路径=hibernate-entitymanager-3。5 .六强决赛。罐子/

资源-根路径=hibernate-annotations-3。5 .六强决赛。罐子/

资源-根路径=hibernate-commons-annotations-3。2 .0 .最终。罐子/

资源根路径=hibernate-validator-3。1 .0 .嘎。罐子/

资源根路径=cglib-2.2.jar/

/资源

属国

模块名=javax.api/

模块名=javax.annotation.api/

模块名称=javax.enterprise.api/

模块名=javax.persistence.api/

模块名=javax.transaction.api/

模块名=javax.validation.api/

模块名称=javax.xml.bind.api/

模块名称=org.antlr/

模块名称=组织。阿帕奇。公地。收藏/

模块名称=org.dom4j/

模块名称=组织。javassist export=true/

模块名称=org.jboss.as.jpa.spi/

模块名称=org.jboss.jandex/

模块名称=org . JBoss . log ing/

模块名称=org.jboss.vfs/

模块名称=org.slf4j/

/依赖关系

/模块

JBoss-部署-结构。可扩展标记语言中排除org.hibernate,引入3.5

JBoss-部署-结构

部署

不包括的项目:如接受服务项目是由投保以前已患有的疾病或伤害引致的

模块名=org.hibernate/

/排除

属国

模块名称=组织。休眠槽=3.5导出=真/

模块名称=组织。antlr export=true/

模块名称=组织。javassist export=true/

/依赖关系

/部署

子部署名称=ejb.jar

不包括的项目:如接受服务项目是由投保以前已患有的疾病或伤害引致的

模块名=org.hibernate/

/排除

属国

模块名=org.hibernate slot=3.5/

模块名=org.javassist/

/依赖关系

/子部署

/JBoss-部署-结构

修改persistence.xml

?可扩展标记语言版本=1.0编码=UTF-8?

持久性xmlns=http://Java。星期日com/XML/ns/persistence xmlns:xsi=http://www。w3。org/2001/XML架构实例

xsi:模式位置=http://Java。星期日http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd持久化版本=2.0

持久性单元名称=计划

providerorg.hibernate.ejb.HibernatePersistence/provider

Java:JBoss/数据源/预定数据源/JTA数据源

班级./类别

性能

属性名=JBoss。作为。JPA。供应商模块值=组织。休眠:3.5/

属性名=hibernate。交易。manager _ lookup _ class值=org。冬眠。交易。jbosstransactionmanagerlookup/

.

/属性

/持久性单元

/持久性

HornetQ

EAP 7使用了ActiveMQ Artemis取代了HornetQ,原消息驱动B

ean不需更改,需更改配置和客户端调用代码。

jms-destinations

EAP 6中jms-destinations配置如下:

<hornetq-server> ... <jms-destinations> <jms-queue name=testQueue> <entry name=queue/test/> <entry name=java:jboss/exported/jms/queue/test/> </jms-queue> </jms-destinations> ... </hornetq-server>

更改为:

<subsystem xmlns=urn:jboss:domain:messaging-activemq:2.0> <server name=default> ... <jms-queue name=testQueue entries=queue/test java:jboss/exported/jms/queue/test/> ... </server> </subsystem>

security

如不启用security,增加如下配置:

<subsystem xmlns=urn:jboss:domain:messaging-activemq:2.0> <server name=default> <security enabled=false/> ... </server> </subsystem>

Dependency

<dependency> <groupId>org.apache.activemq</groupId> <artifactId>artemis-jms-client</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.jboss.spec.javax.jms</groupId> <artifactId>jboss-jms-api_2.0_spec</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.jboss.spec.javax.json</groupId> <artifactId>jboss-json-api_1.0_spec</artifactId> <scope>provided</scope> </dependency>

org.apache.activemq.artemis module取代org.hornetq

客户端代码

EAP 7,默认connector从remote改为http-remoting,使用undertow default http-listener、http端口,这也是推荐的方式:

<subsystem xmlns=urn:jboss:domain:messaging-activemq:2.0> <server name=default> ... <http-connector name=http-connector socket-binding=http endpoint=http-acceptor/> <http-acceptor name=http-acceptor http-listener=default/> ... </server> </subsystem>

<subsystem xmlns=urn:jboss:domain:undertow:4.0> ... <server name=default-server> <ajp-listener name=ajp socket-binding=ajp/> <http-listener name=default socket-binding=http redirect-socket=https enable-http2=true/> ... </server> ... </subsystem>

客户端代码要做以下修改:remote connection port从4447改为8080,PROVIDER_URL从remote://localhost:4447改为http-remoting://localhost:8080。INITIAL_CONTEXT_FACTORY从org.jboss.naming.remote.client.InitialContextFactory改为org.wildfly.naming.client.WildFlyInitialContextFactory。

EAP 6:

java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory java.naming.provider.url=remote://localhost:4447

EAP 7:

java.naming.factory.initial=org.wildfly.naming.client.WildFlyInitialContextFactory java.naming.provider.url=http-remoting://localhost:8080

EJB

Connector

EAP 7,默认connector从remote改为http-remoting,使用undertow default http-listener、http端口。

EAP 6:

<subsystem xmlns=urn:jboss:domain:remoting:1.2> <connector name=remoting-connector socket-binding=remoting security-realm=ApplicationRealm/> </subsystem>

EAP 7:

<subsystem xmlns=urn:jboss:domain:remoting:4.0> <endpoint/> <http-connector name=http-remoting-connector connector-ref=default security-realm=ApplicationRealm/> </subsystem>

Dependency

<dependency> <groupId>org.jboss</groupId> <artifactId>jboss-ejb-client</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.jboss.remoting</groupId> <artifactId>jboss-remoting</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.wildfly</groupId> <artifactId>wildfly-naming-client</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.jboss.spec.javax.ejb</groupId> <artifactId>jboss-ejb-api_3.2_spec</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.jboss.spec.javax.transaction</groupId> <artifactId>jboss-transaction-api_1.2_spec</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.jboss.marshalling</groupId> <artifactId>jboss-marshalling-river</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.jboss.xnio</groupId> <artifactId>xnio-api</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.jboss.xnio</groupId> <artifactId>xnio-nio</artifactId> <scope>provided</scope> </dependency>

jboss-ejb-client.properties

EAP 6:

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false remote.connections=default remote.connection.default.protocol=remote remote.connection.default.host=localhost remote.connection.default.port=4447 remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false remote.connection.default.username=quickuser remote.connection.default.password=quick-123

EAP 7:

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false remote.connections=default remote.connection.default.protocol=http-remoting remote.connection.default.host=localhost remote.connection.default.port=8080 remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false remote.connection.default.username=quickuser remote.connection.default.password=quick-123

客户端代码

EAP 6:

java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory java.naming.provider.url=remote://localhost:4447

EAP 7:

java.naming.factory.initial=org.wildfly.naming.client.WildFlyInitialContextFactory java.naming.provider.url=http-remoting://localhost:8080

Standalone Client

EAP 7.1引入新的配置文件wildfly-config.xml,统一了所有客户端的配置,在standalone client中推荐使用这种方式。wildfly-config.xml放在classpath或META-INF目录下,也可用-Dwildfly.config.url指定路径(优先级:wildfly.config.url > classpath > META-INF)。

wildfly-config.xml:

<?xml version=1.0 encoding=UTF-8?> <configuration> <authentication-client xmlns=urn:elytron:1.0.1> <authentication-rules> <rule use-configuration=ejb/> </authentication-rules> <authentication-configurations> <configuration name=ejb> <sasl-mechanism-selector selector=DIGEST-MD5/> <set-user-name name=quickuser/> <credentials> <clear-password password=quick-123/> </credentials> <providers> <use-service-loader/> </providers> <set-mechanism-realm name=ApplicationRealm/> </configuration> </authentication-configurations> </authentication-client> </configuration>

使用wildfly-config.xml时的Java代码:

Properties properties = new Properties(); properties.put(Context.INITIAL_CONTEXT_FACTORY, WildFlyInitialContextFactory.class.getName()); properties.put(Context.PROVIDER_URL, http-remoting://localhost:8080); Context context = new InitialContext(properties); Object theRemote = context.lookup(jndiName); ...

代码很简单,多个PROVIDER_URL时用逗号分隔。注意运行之前要添加ApplicationRealm用户:

add-user.sh -a -u quickuser -p quick-123

Server-to-Server

利用remote-outbound-connection,在standalone.xml中增加如下配置:

增加security-realm,密码需经Base64编码

<management> <security-realms> <security-realm name=ejb-security-realm> <server-identities> <secret value=cXVpY2stMTIz/> </server-identities> </security-realm> ... </security-realms> ... </management>

配置remote-outbound-connection

<subsystem xmlns=urn:jboss:domain:remoting:4.0> <endpoint/> <http-connector name=http-remoting-connector connector-ref=default security-realm=ApplicationRealm/> <outbound-connections> <remote-outbound-connection name=remote-ejb-connection1 outbound-socket-binding-ref=remote-ejb1 username=quickuser security-realm=ejb-security-realm protocol=http-remoting> <properties> <property name=SASL_POLICY_NOANONYMOUS value=false/> <property name=SSL_ENABLED value=false/> </properties> </remote-outbound-connection> </outbound-connections> </subsystem>

配置Socket

<socket-binding-group name=standard-sockets default-interface=public port-offset=${jboss.socket.binding.port-offset:0}> ... <outbound-socket-binding name=remote-ejb1> <remote-destination host=127.0.0.1 port=8080/> </outbound-socket-binding> </socket-binding-group>

在war的WEB-INF或ear的META-INF中新建文件jboss-ejb-client.xml:

<jboss-ejb-client xmlns=urn:jboss:ejb-client:1.2> <client-context> <ejb-receivers> <remoting-ejb-receiver outbound-connection-ref=remote-ejb-connection1 connect-timeout=10000/> </ejb-receivers> </client-context> </jboss-ejb-client>

Java代码

Properties props = new Properties(); props.put(Context.URL_PKG_PREFIXES, org.jboss.ejb.client.naming); Context context = new javax.naming.InitialContext(props); Object theRemote = context.lookup(jndiName);

Seam 2.2.2.Final

seam 2.2可以运行在Jboss EAP 7,同在EAP 6中一样,需修改org.jboss.seam.transaction.Transaction:

protected javax.transaction.UserTransaction getUserTransaction() throws NamingException { InitialContext context = Naming.getInitialContext(); try { return (javax.transaction.UserTransaction) context.lookup(java:comp/UserTransaction); } catch (NamingException ne) { try { //Embedded JBoss has no java:comp/UserTransaction javax.transaction.UserTransaction ut = (javax.transaction.UserTransaction) context.lookup(UserTransaction); ut.getStatus(); //for glassfish, which can return an unusable UT return ut; } catch (NamingException nnfe2) { // Try the other JBoss location in JBoss AS7 return (javax.transaction.UserTransaction) context.lookup(java:jboss/UserTransaction); } catch (Exception e) { throw ne; } } }

如使用了seam-resteasy,需排除jaxrs子系统,使用EAP 6中的resteasy版本即可。

<jboss-deployment-structure> <deployment> <exclude-subsystems> <subsystem name=jaxrs/> </exclude-subsystems> ... </deployment> </jboss-deployment-structure>

PicketLink

配置Subsystem

EAP 7默认是不支持picketlink的,需要配置picketlink subsystem。

增加extension

<extensions> ... <extension module=org.wildfly.extension.picketlink/> ... </extensions>

配置subsystem

<profile> ... <subsystem xmlns=urn:jboss:domain:picketlink-federation:2.0/> ... </profile>

配置security-domain

将EAP 6中相应配置迁移过来即可。

<security-domain name=sp cache-type=default> <authentication> <login-module code=org.picketlink.identity.federation.bindings.jboss.auth.SAML2LoginModule flag=required/> </authentication> </security-domain> <security-domain name=idp cache-type=default> <authentication> <login-module code=UsersRoles flag=required> <module-option name=usersProperties value=users.properties/> <module-option name=rolesProperties value=roles.properties/> </login-module> </authentication> </security-domain>

配置jboss-deployment-structure

<jboss-deployment-structure> <deployment> <dependencies> ... <module name=org.picketlink services=import/> </dependencies> </deployment> </jboss-deployment-structure>

注意:必须要添加services="import"。

配置Federation

EAP 7,valve不再使用:

<?xml version=1.0 encoding=UTF-8?> <jboss-web> <security-domain>sp</security-domain> <valve> <class-name>org.picketlink.identity.federation.bindings.tomcat.sp.ServiceProviderAuthenticator</class-name> <param> <param-name>characterEncoding</param-name> <param-value>UTF-8</param-value> </param> </valve> </jboss-web>

<jboss-web> <security-domain>idp</security-domain> <context-root>idp-sig</context-root> <valve> <class-name>org.picketlink.identity.federation.bindings.tomcat.idp.IDPWebBrowserSSOValve</class-name> </valve> </jboss-web>

删除valve,参数需迁移到web.xml中:

<context-param> <param-name>org.picketlink.federation.saml.CHARACTER_ENCODING</param-name> <param-value>UTF-8</param-value> </context-param>

web.xml中必须配置login-config

<web-app> ... <login-config> <auth-method>FORM</auth-method> </login-config> </web-app>

注意:idp、sp都要配置auth-method

picketlink.xml sample:

<PicketLink xmlns=urn:picketlink:identity-federation:config:2.1> <PicketLinkSP xmlns=urn:picketlink:identity-federation:config:2.1 BindingType=POST SupportsSignatures=true ErrorPage=/sso/error.seam LogOutPage=/sso/logout.seam> <IdentityURL>http://localhost:8080/idp-sig/</IdentityURL> <ServiceURL>https://localhost:8443/sso/</ServiceURL> <KeyProvider ClassName=org.picketlink.identity.federation.core.impl.KeyStoreKeyManager> <Auth Key=KeyStoreURL Value=/test.jks/> <Auth Key=KeyStorePass Value=store123/> <Auth Key=SigningKeyPass Value=test123/> <Auth Key=SigningKeyAlias Value=servercert/> <ValidatingAlias Key=localhost Value=servercert/> </KeyProvider> </PicketLinkSP> <Handlers xmlns=urn:picketlink:identity-federation:handler:config:2.1> <Handler class=org.picketlink.identity.federation.web.handlers.saml2.SAML2LogOutHandler/> <Handler class=org.picketlink.identity.federation.web.handlers.saml2.SAML2AuthenticationHandler> <Option Key=NAMEID_FORMAT Value=urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress/> <Option Key=CLOCK_SKEW_MILIS Value=120000/> </Handler> <Handler class=org.picketlink.identity.federation.web.handlers.saml2.RolesGenerationHandler/> <Handler class=org.picketlink.identity.federation.web.handlers.saml2.SAML2SignatureGenerationHandler/> <Handler class=org.picketlink.identity.federation.web.handlers.saml2.SAML2SignatureValidationHandler/> </Handlers> </PicketLink>

注意:

如果升级到EAP 7.1.2后使用picketlink可能会报如下错误:

Error during the logout.: java.lang.NullPointerException

at org.picketlink.identity.federation.bindings.wildfly.sp.SPFormAuthenticationMechanism.lambda$authenticate$0(SPFormAuthenticationMechanism.java:275)

建议7.1.3发布后再升级。

Undertow Servlet Container有一属性proactive-authentication,默认为true,会拦截所有含有SAMLResponse参数的请求。当项目中使用了其他custom portal时,将其设为"false";

<servlet-container name=default default-encoding=UTF-8 use-listener-encoding=true proactive-authentication=false> <jsp-config/> <websockets/> </servlet-container>

Patching EAP

使用CLI应用、回滚、清除Patch

Applying a Patch

patch apply /path/to/downloaded-patch.zip --override-all shutdown --restart=true

Rolling Backe a Patch

先使用patch history查询出patch id,然后调用rollback命令:

patch history patch rollback --patch-id=PATCH_ID --reset-configuration=TRUE shutdown --restart=true

Clearing Patch History

多次打Patch后会占用磁盘空间,可进行清理,但当前应用的Patch是不能删除的。

/core-service=patching:ageout-history

参考文档

Jboss EAP 7.1 Migration Guide

Using the JBoss Server Migration Tool

Configuration Guide

Configuring Messaging

Developing EJB Applications

How to Configure Identity Management

How to Configure Server Security

How To Set Up SSO with SAML v2

Patching and Upgrading Guide

更多关于云服务器,域名注册,虚拟主机的问题,请访问西部数码官网:www.chenqinet.cn

相关推荐

后台-系统设置-扩展变量-手机广告位-内容页底部广告位3