urn:jboss:domain:remoting
Socket端口配置
ejb-security-realm
远程调用EJB总共以下几个步骤
第一步 写服务器端service
第二步 配置用户
第三步 配置端口
第四步 配置EJB
第五步 配置客户端
第六步 写客户端
第一步 写服务器端代码
远程EJB一定要写接口,学过EJB的都知道本地EJB是可以无接口的。
这里为了简便,我不用EAR或者jar的方式去部署,我用war来部署远程EJB。
接口
package ejbserver; public interface HelloService { String say(); }
实现类
package ejbserver; import javax.ejb.Remote; import javax.ejb.Stateless; @Remote(HelloService.class) @Stateless public class HelloServiceBean implements HelloService { @Override public String say() { return "Hello world!"; } }那么简单的服务器端代码就完成了。
第二步,配置用户
配置用户是必须的,是为了安全,如果远程EJB放在网上,谁都可以访问,那么商业数据就可以被任意修改和访问,造成的损失将不可预计!
首先使用JBOSS Wildfly的add-user程序添加用户。
我的电脑上该命令位于以下位置
D:\WebServer\wildfly-9.0.2.Final\bin\add-user.bat
添加完了用户之后,以下文件会插入一行数据
D:\WebServer\wildfly-9.0.2.Final\standalone\configuration\application-users.properties
ejb=5aeed860e2461b9cbda91264f3b600dd
仅仅这样就够了么?
NO!还需要配置standalone.xml中的安全域,
<management> …… <security-realms> …… <security-realm name="ejb-security-realm"> <server-identities> <secret value="dGVzdA=="/> </server-identities> </security-realm> </security-realms> …… </management>
第三步 配置端口
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}"> …… <outbound-socket-binding name="remote-ejb"> <remote-destination host="localhost" port="8080"/> </outbound-socket-binding> </socket-binding-group>
第四步 配置EJB
这步配置的作用就是将上面两个配置连接起来,作为EJB。等于是说让服务器的远程EJB服务使用这个端口和这个用户!
<subsystem xmlns="urn:jboss:domain:remoting:3.0"> <endpoint worker="default"/> <http-connector name="http-remoting-connector" connector-ref="default" security-realm="ApplicationRealm"/> <outbound-connections> <remote-outbound-connection name="remote-ejb-connection" outbound-socket-binding-ref="remote-ejb" username="ejb" 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>
第五步 配置客户端
在classpath的根目录下写下这个文件
/jboss-ejb-client.properties
在实际的应用中可以使用将这个文件放在生成的ejb-client中!
文件内容如下:
endpoint.name=client-endpoint remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false remote.connections=default remote.connection.default.host=localhost remote.connection.default.port=9080 remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false remote.connection.default.username=ejb remote.connection.default.password=test
第六步 写客户端代码
把上面写的服务器端接口代码拷贝一下。
然后调用
为了避免复杂的搭建环境,我这里直接用servlet来调用。
/** * Servlet implementation class HelloServlet */ @WebServlet("/hello.html") public class HelloServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Hashtable<String, String> jndiProperties = new Hashtable<>(); jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); try { Context context = new InitialContext(jndiProperties); HelloService ejb = (HelloService) context.lookup("ejb:/ejbserver/HelloServiceBean!ejbserver.HelloService"); response.getWriter().append(ejb.say()); } catch (Exception e) { } response.getWriter().append("Served at: ").append(request.getContextPath()); } }
最后运行: