2

クライアント側

基本的なPOSTまたはGETメソッドを使用してリモートサーバーに接続するJavaアプリケーションがあります。

URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setAllowUserInteraction(false);
conn.setRequestProperty("Content-type", "text/xml; charset=" + ENCODING);

conn.connect();
conn.getOutputStream().write(data.getBytes(ENCODING));
conn.getOutputStream().close();

(このコードを変更することはできません。変更できるのは、メソッドを呼び出すときにサーバーに送信されるものだけですurlStrdata

[編集]:クライアントは、Javaクライアントまたはその他のクライアント(c ++、objective-c、..)にすることができます。ここでのポイントは、自分の投稿の本文とURLにのみアクセスできるということです。

サーバ側

サーバー側では、Spring Security(SecurityContextとセッションの永続性)を実装したいと思います。

WebApp春のセキュリティは、に関する情報を保持するためのブラウザのCookieに基づいていることを理解していsession idます。しかし、私の場合、ブラウザはありません。

  • のストレージをシミュレートJSESSIONIDしてサーバーに送り返す必要がありますか?電話をかける必要があるので、これが可能かどうかはわかりませんconn.addRequestProperty(key, value)が、不可能です。

  • 他に方法はありますか?

ありがとうございました。

[編集]

@zagyiが指摘しているように、URLを使用してセッショントークンをSpringに渡すことはできますが、それでも方法がわかりません。

4

2 に答える 2

2

URLでjsessionidを渡すには、次のようにURLの最後にjsessionidを追加するだけです。

http://localhost:8080/example/auth/login;jsessionid=A06F00609BBA8A4C2B005FB25F90C4C9

これは、Cookieを受け入れないようにブラウザーを構成した場合に機能していることがわかります。この場合、サーバーはURLにセッションIDを自動的に含めます(デフォルトのTomcat構成を想定)。このトピックは、この質問でも説明されています。

于 2013-03-03T18:12:59.913 に答える
1

そのためのクライアント側の解決策があるかもしれません。

対話できるアクションポイントは次のとおりです。

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

HttpURLConnectionを処理する独自の(ラップされた)を提供しJSESSIONIDます。しかし残念ながら、もう少し先に進む必要があります。

秘訣は、実際の「http」プロトコル接続をラップするために使用する「xhttp」などの新しいプロトコルを登録することです。したがって、URLは次のようになります。

xhttp://www.example.com/...

まず、URLStreamHandlerFactoryクラスを定義します

public class MyURLStreamHandlerFactory implements URLStreamHandlerFactory {
    public URLStreamHandler createURLStreamHandler(String protocol) {
        if ("xhttp".equals(protocol)) {
            return new MyURLStreamHandler();
        }
        return null;
    }
}

Java(またはアプリケーション)の初期化時に設定できます。JVMごとに1回だけ実行できます。

URLStreamHandlerFactory fac = new MyURLStreamHandlerFactory();
URL.setURLStreamHandlerFactory(fac);

それでは、先に進みましょうMyURLStreamHandler

public class MyURLStreamHandler extends URLStreamHandler {
    @Override
    protected URLConnection openConnection(URL url) throws IOException {
        return new MyHttpURLConnection(url);
    }
}

これは非常に簡単です。独自の接続を作成します。汚いことをしましょう:

public final class MyHttpURLConnection extends HttpURLConnection {
    private HttpURLConnection conn;
    public MyHttpURLConnection(URL url) throws MalformedURLException, IOException {
        super(url);
        String newUrlString = url.toExternalForm().substring(1);
        conn = (HttpURLConnection) new URL(newUrlString).openConnection();
    }
    @Override
    public void disconnect() {
        conn.disconnect();
    }
    @Override
    public boolean usingProxy() {
        return false;
    }
    @Override
    public void connect() throws IOException {
        conn.connect();
        conn.setRequestProperty("JSESSIONID", "X");
    }
}

そしてvoilá、私たちはなんとか接続にアクセスし、JSESSIONIDヘッダーを設定しました。

必要なのは、クラスをコンパイルし、クラスファイルをクライアントjarに追加し、上記のコードが実行されるのと同じJVMで何らかの方法でinitコードを実行することです。

それができない場合は、別の可能性があります。次のシステムパラメータをクライアントJavaアプリケーションに設定します。

-Djava.protocol.handler.pkgs=com.example.myprotocol

この場合、com.example.myprotocol.xhttp(プロトコル名のようなxhttpMyURLStreamHandler )を作成し、クラスの名前をに変更しますcom.example.myprotocol.xhttp.Handler。これは、プロトコルリゾルバーが検索する固定名です。このjava.protocol.handler.pkgsプロパティはセキュリティマネージャによってチェックされることに注意してください。

于 2013-03-03T00:09:36.663 に答える