質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

3回答

22030閲覧

リクエストURLを途中で変更したい

jkamiya5

総合スコア12

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

1クリップ

投稿2016/02/26 14:57

編集2016/02/26 15:20

JSP・サーブレットの開発で、リクエストURL(getRequestURL() )の値を、Filter側もしくはServlet側で変更したいのですが、上手いこといきません。

「JavaTM Servlet 2.4 API 仕様」を参照すると、

インタフェース HttpServletRequest
java.lang.StringBuffer getRequestURL()
・・・
このメソッドは文字列ではなく StringBuffer を返すので、例えばクエリパラメータを加えるなど、URL を簡単に変更することができます

となっています。上記をソースにすると、下記のようになります。

■フィルターA

Java

1 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 2 throws IOException, ServletException { 3 4 HttpServletRequest hreq = (HttpServletRequest) request; 5 HttpServletResponse hres = (HttpServletResponse) response; 6 7 StringBuffer stb = new StringBuffer(); 8 stb.append("aaaaaaaaaa=bbbbbbbbbbbb"); 9 hreq.getRequestURL().append(stb.toString()); 10 11 chain.doFilter(hreq, hres); 12 return; 13 14} 15

上記リクエストをサーブレットで受け取ると、クエリパラメータ「aaaaaaaaaa」が取得できるはずですが、「getParameter("aaaaaaaaaa")」を指定してもnullが返るばかりです。

何か実装の不備があるのでしょうか??

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

完全な解決には至ってないのですが、自分で調べた結果わかったことを記載します。

  • この質問の答えについて

まず、このやり方(上記で示したサンプルコード)では、リクエストURL(hreq.getRequestURL())の値は書き換え不可能だと思われます。(※おそらく読み取り専用になっている)。そのため、遷移先のフィルターやサーブレットでもリクエストURL(hreq.getRequestURL())は最初のまま。「JavaTM Servlet 2.4 API 仕様」では、「・・・URL を簡単に変更することができます。」とあるのに、何故だ。。

- 「JavaTM Servlet 2.4 API 仕様」について
このjavadocでは、「・・・URL を簡単に変更することができます。」とあります。私は、てっきり「hreq.getRequestURL()」の書き換えが可能だと誤認しておりました。

しかしこれは、間違ったことを言っているわけではなくて、「hreq.getRequestURL()」 はStringBuffer型の値を返しますが、それを利用してクエリストリングなどを追加し、それで出来上がった新しいurlをもとに、リクエストのフォワード・リダイレクトなどをすれば、リクエストの内容をあたかも途中で変更したかのようにすることが出来る、と解釈しました。

Java

1 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 2 3 HttpServletRequest hreq = (HttpServletRequest) request; 4 HttpServletResponse hres = (HttpServletResponse) response; 5 6 //クエリストリングを追加 7 StringBuffer nextUrl = hreq.getRequestURL(); 8 nextUrl.append("?aaaaaaaaaa=bbbbbbbbbbbb"); 9 10 //フォワードが可能となるようにurlを加工 11 //・・・ 12 13 //新しいurlをもとに、リクエストのフォワード 14 RequestDispatcher rd = hreq .getRequestDispatcher(nextUrl.toString()) ; 15 rd.forward(hreq, hres); 16 17 return; 18}

なるほど。これだと確かにできますね。正直、あのjavadocは紛らわしいと説明だと思いますが。。

ここ にあるように、基本的にはリクエストURLの直接変更はできないようです。

また、リクエストパラメータについては、HttpServletRequestのラッパークラスに特別なフィールドを設ければ、「リクエストオブジェクト」から疑似的なリクエストパラメータが取得可能となるようです。

投稿2016/03/09 04:55

編集2016/03/09 04:58
jkamiya5

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Javaは詳しくないのですがGETパラメータなら.append("?aaaaaaaaaa=bbbbbbbbbbbb") のように"?"が必要なのではないでしょうか?

投稿2016/02/26 15:31

nakit

総合スコア410

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkturbo

2016/02/26 16:46

他の既存パラメータがある場合は「&」ですなぁ。
jkamiya5

2016/02/27 07:45

>nakit様、tkturbo様 ご回答ありがとうございます。 ご指摘の通り、GETパラメータの場合には、一番最初のキーの前に「?」をつける必要がありました。 StringBuffer stb = new StringBuffer(); stb.append("?aaaaaaaaaa=bbbbbbbbbbbb"); hreq.getRequestURL().append(stb.toString()); しかし、上記のようにしてみたところでも、サーブレット側で「getParameter("aaaaaaaaaa")」を指定して、nullが返ってきました。。 原因がわかりません。。
guest

0

もし、URLの書き換えルールが静的に定義できるのであれば、urlrewritefilterを利用するのはいかがでしょうか?
クライアント側のURLは書き換わりませんが、servletへのリクエストURLは書き換えできます。

URLの書き換えルールがビジネスロジックで複雑になる場合は、FilterかServletからリダイレクトさせることになりますかね。。。

投稿2016/05/18 07:09

takyafumin

総合スコア2335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問