如何检测Axis2中使用哪个transportReceiver?

时间:2012-11-07 16:20:21

标签: axis2 tomcat7

我正在使用tomcat7和axis2来部署java Web服务。

在server.xml中,我配置了三个连接器(http,https,服务器和客户端证书,https只有服务器端证书):

<Connector port="8181" protocol="HTTP/1.1" />
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" scheme="https" clientAuth="true"  keystoreFile=... truststoreFile=... />
<Connector port="8444" protocol="HTTP/1.1" SSLEnabled="true" scheme="https" clientAuth="false" keystoreFile=...  />

在axis2.xml中,我配置了三个transportReceivers:

<transportReceiver name="http" class="org.apache.axis2.transport.http.AxisServletListener">
    <parameter name="port">8181</parameter>
    <parameter name="c1">none</parameter>
</transportReceiver>

<transportReceiver name="https" class="org.apache.axis2.transport.http.AxisServletListener">
    <parameter name="port">8443</parameter>
    <parameter name="c2">serverAndClient</parameter>
</transportReceiver>

<transportReceiver name="https" class="org.apache.axis2.transport.http.AxisServletListener">
    <parameter name="port">8444</parameter>
    <parameter name="c3">serverOnly</parameter>
</transportReceiver>

工作正常!我可以按预期在所有端口上访问我的所有Web服务。

不幸的是,我想仅在8443上允许“无密码服务登录”(因为客户端将拥有证书),并且在8444上允许“使用密码登录”。

在Java中我尝试过:

MessageContext msg = MessageContext.getCurrentMessageContext();
TransportInDescription tin = msg.getTransportIn();
String str = tin.getParameters().toString();

但我总是得到:

[Parameter : port=8444, Parameter : c3=serverOnly]

似乎一个传输接收器总是处理我的消息。有没有办法检测哪个传输接收器(或端口)真正用于当前调用?

BR, 亚切克

1 个答案:

答案 0 :(得分:1)

最后我找到了解决方案。

我错了,只有一个传输接收器处理所有消息。有两个(一个用于http,一个用于https)。遗憾的是,您无法定义第二个https传输,因为axis2包含哈希映射中的所有传输描述符,而name是一个键,因此“https”始终只有一个条目,您将获得8181或8444。

要解决此问题,您可以在消息到达时在MessageContext中创建自己的servlet并存储端口号。这很容易:

public class MyServlet extends AxisServlet
{   
    protected MessageContext createMessageContext( HttpServletRequest request, HttpServletResponse response, boolean invocationType ) throws IOException
    {
        MessageContext mc = super.createMessageContext( request, response, invocationType );
        URL url = new URL( request.getRequestURL().toString() );
        mc.setProperty( "myPort", url.getPort() );
        return mc;      
    }
}

当然,您必须将您的类名放在axis2 /.../ web.xml中并重新启动tomcat。 然后,您可以检查任何axis2调用内的端口号:

MessageContext mc = MessageContext.getCurrentMessageContext();
int port = ( Integer ) mc.getProperty( "myPort" );

现在我真的得到8181,8443或8444 :)。

BR,Jacek