3

Tomcat7 と axis2 を使用して Java Web サービスをデプロイしています。

server.xml で、3 つのコネクタを構成しました (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 で、次の 3 つの transportReceiver を構成しました。

<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]

1 つのトランスポート受信者が常に私のメッセージを処理しているようです。現在の呼び出しに実際に使用されているトランスポートレシーバー (またはポート) を検出する方法はありますか?

BR、ジャセク

4

1 に答える 1

2

最後に解決策を見つけました。

1 つのトランスポート レシーバーだけがすべてのメッセージを処理するというのは誤りでした。2 つ (http 用と https 用) があります。残念ながら、2 番目の https トランスポートを定義することはできません。これは、axis2 がすべてのトランスポート記述子をハッシュ マップに保持し、name がキーであるため、"https" のエントリは常に 1 つだけであり、8181 または 8444 が返されるためです。

これを解決するには、独自のサーブレットを作成し、メッセージが到着したときにポート番号を 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、ジャセク

于 2012-11-12T19:18:59.363 に答える