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

标签 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, 亚采克

最佳答案

终于找到了解决办法。

我错了,只有一个传输接收器处理所有消息。有两个(一个用于 http,一个用于 https)。不幸的是,您无法定义第二个 https 传输,因为 axis2 将所有传输描述符保存在 HashMap 中,并且名称是一个键,因此“https”始终只有一个条目,您将获得 8181 或 8444。

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

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,亚采克

关于axis2 - 如何检测 Axis2 中使用了哪个 transportReceiver?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13273802/

相关文章:

java - 创建 Web 服务客户端时出错

Axis 2 : four ways to create clients

spring - Spring无法使用Tomcat提供的JNDI DataSource?

java - 不支持的SignatureMethodException : HMAC-SHA1 exception in tomcat with jerseyoauth

java - netbeans 中的 axis2 支持

maven - Axis2 与 Maven 的最佳实践

servlets - 无法获得 RequestDispatcher

java - Webapp 在本地 tomcat7 上运行,但不在 linux tomcat7 上运行

java - Axis2:禁用 MustUnderstand header 检查

eclipse - 无法在 ubuntu 12.04 上将 tomcat7 服务器安装到 eclipse 中