我的问题场景我有一个JEE7 Web应用程序WAR,它在两个截然不同的应用程序路径上提供RestEasy JAX-RS Web服务(适用于不同类型的客户端)。我正在使用WildFly-8.2.0.Final进行部署。一切都很好。
问题:我想在WildFly服10888,而Web应用程序部署在端口80上(或者可能是8080)。我不想要TYPE_A_WEB_SERVICES& TYPE_B_WEB_SERVICES也可用于Web应用程序的端口80(或者可能是8080)。这个配置是否可以在单个WildFly实例上使用?答案 0 :(得分:2)
是的,它是可能的,它包括WildFly的配置,以侦听两个http端口和一些Java EE编程。
为替代端口创建套接字
<socket-binding-group ...>
...
<socket-binding name="http" port="${jboss.http.port:8080}"/>
<!-- add this one -->
<socket-binding name="http-alternative" port="${jboss.http.port:8888}"/>
...
</socket-binding-group>
在备用端口上定义http-listener
<subsystem xmlns="urn:jboss:domain:undertow:1.2">
...
<server name="default-server">
<http-listener name="default" socket-binding="http"/>
<!-- add this one -->
<http-listener name="http-alt" socket-binding="http-alternative"/>
...
</server>
</subsystem>
为此,我使用了Java EE @Interceptors。我在一个应用程序App中定义了2个端点(Endpoint1,Endpoint2)。 PortDetectionInterceptor拦截端点方法的每次调用,检查端点是否从预定义的端口调用。
App.java
package net.stankay.test;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/rest")
public class App extends Application {}
Endpoint1.java
package net.stankay.test;
import javax.interceptor.Interceptors;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@Interceptors(PortDetectionInterceptor.class)
@Path("/endpoint1")
public class Endpoint1 {
@GET
public String hi() {
return "hi";
}
}
Endpoint2.java
package net.stankay.test;
import javax.interceptor.Interceptors;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@Interceptors(PortDetectionInterceptor.class)
@Path("/endpoint2")
public class Endpoint2 {
@GET
public String hello() {
return "hello";
}
}
PortDetectionInterceptor.java
package net.stankay.test;
import javax.inject.Inject;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
import javax.servlet.http.HttpServletRequest;
public class PortDetectionInterceptor {
@Inject
private HttpServletRequest httpRequest;
@AroundInvoke
public Object detectPort(InvocationContext ctx) throws Exception {
try {
String restEndpoint = ctx.getTarget().getClass().getName();
int restPort = httpRequest.getLocalPort();
if (restEndpoint.contains("Endpoint1") && restPort != 8080) {
throw new RuntimeException("Please access Endpoint1 only via port 8080");
}
if (restEndpoint.contains("Endpoint2") && restPort != 8888) {
throw new RuntimeException("Please access Endpoint2 only via port 8888");
}
return ctx.proceed();
} catch (Exception e) {
return String.format("{ \"error\" : \"%s\" }", e.getMessage());
}
}
}