web-dev-qa-db-ja.com

JavaでリクエストをリダイレクトしながらHTTPヘッダーでデータを渡す方法

1つのサーバーから別のサーバーにリクエストをリダイレクトしながら、HTTPヘッダーでデータを渡すことは可能ですか?.

これが私のシナリオです。すべてのリクエストが通過する汎用フィルターが1つあります。今、いくつかの条件に基づいて、API objHttpServletResponse.sendRedirect(strURL)を使用してリクエストをいくつかの異なるサーバーにリダイレクトしています。

しかし、問題は、objHttpServletResponse.setHeader("Key", "Value");のような応答ヘッダーにいくつかのデータを設定しているとき、リダイレクトされたサーバーでは利用できないことです。

だから、私の質問は、

1。リクエストのリダイレクト中にヘッダーでデータを渡す方法はありますか?

2。そうでない場合、リクエストのリダイレクト中にデータを送信する他の可能な方法は何ですか?

注意してください:他のいくつかの方法、例えば

RLパラメーターを使用:objHttpServletResponse.sendRedirect(strURL+"?param="+ strParamValue);

または

セッションを使用:HttpSession session = httpRequest.getSession(); session.setAttribute("Key", "Value");

私が期待しているものではありません。

17
anij

設定したヘッダーは、ロケーションヘッダーとステータスコードとともに、クライアントに送信される応答に書き込まれます。 サーブレットを使用したリクエストのリダイレクトと、「setHeader」メソッドが機能しないことを参照してください

クライアントは、Locationヘッダーで指定したURLに同じリクエストを送信することになっています。 送信したリクエストと同じです。

リダイレクトされたリクエストとともに、指定したヘッダーをブラウザに送信させます。 (ドメイン)Cookieヘッダーの追加を検討しましたか?一部のグーグルは、リダイレクト応答で設定されたCookieがほとんどのブラウザーで取得されると信じるようにします。 http://blog.dubbelboer.com/2012/11/25/302-cookie.html を参照してください

9
flup

Apache HttpClient をご覧ください。

この例では、いくつかのパラメーターをpostリクエストに追加します:

    String url = "https://selfsolve.Apple.com/wcResults.do";

    HttpClient client = HttpClientBuilder.create().build();
    HttpPost post = new HttpPost(url);

    // add header
    post.setHeader("User-Agent", USER_AGENT);

    List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
    urlParameters.add(new BasicNameValuePair("sn", "C02G8416DRJM"));
    urlParameters.add(new BasicNameValuePair("cn", ""));
    urlParameters.add(new BasicNameValuePair("locale", ""));
    urlParameters.add(new BasicNameValuePair("caller", ""));
    urlParameters.add(new BasicNameValuePair("num", "12345"));

    post.setEntity(new UrlEncodedFormEntity(urlParameters));

    HttpResponse response = client.execute(post);
    System.out.println("Response Code : " 
                + response.getStatusLine().getStatusCode());
2
SparkOn

問題は、responseredirect()メソッドが新しい要求を完全に開始し、それによってリダイレクト前に設定された属性が失われることです。幸いなことに、まだ問題を解決する流な方法があります。

response.setHeader("Key", "Value");
request.getRequestDispatcher("redirecturl").forward(request, response);

その後、目的地で次のことができます

response.getHeaders("key")
1
Adindu Stevens

サーバーとの間のHTTP要求/応答を確認しましたか? chromeまたはfirefoxで多くのプラグインを使用して、それを確認できます。値がサーバーから別のサーバーに渡されているかどうかを確認できます
また、httpResponse.getHeader( "Key");を使用してヘッダーを取得します。 request.getHeader( "key")を使用していません。同僚の1人が数日前に同じ問題に直面していました。彼はリクエストを使用してヘッダー値を取得していました

0
SVashisth

JSリダイレクトを使用できます。つまり、sendRedirectを呼び出す代わりに、必要なリダイレクト設定ヘッダーを行う埋め込みJavaScriptを含むHTMLページを返します。

ただし、GETパラメーターを使用するのが本当に最善のソリューションです。ユーザーがパラメータを手動で変更することに懸念がある場合は、MACコードを使用してパラメータを保護します。 メッセージ認証コード を参照してください。

最も単純な形式では、?p1=1&p2=2&mac={mac value}, where {mac value} = md5('MY_SECRET_KEY' + 'p1=1&p2=2').受信側はMACを再計算し、提供されたものと比較できます。外部ユーザーは「MY_SECRET_KEY」を知ることができないため、有効なMACを作成できません。

0
Sergey Alaev