是否可以在WildFly服务器的不同端口上部署单个Web应用程序的不同Web服务?

时间:2016-09-19 12:18:42

标签: web-services deployment configuration wildfly-8 ports

我的问题场景我有一个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实例上使用?

1 个答案:

答案 0 :(得分:2)

是的,它是可能的,它包括WildFly的配置,以侦听两个http端口和一些Java EE编程。

Wildfly配置

  1. 为替代端口创建套接字

    <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>
    
  2. 在备用端口上定义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>
    
  3. 检查JAX-RS中的端口

    为此,我使用了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());
            }
        }
     }