web-dev-qa-db-ja.com

複数のサーブレットが転送された後、サーブレット/ jspから元のリクエストURLを取得する方法

multiple内部サーブレット/ jspフォワードを使用して表示用の適切なjspに到達するstruts/tilesを使用するクルーズ予約アプリに取り組んでいます。しかし、ページのレンダリングに使用される最後のjspに到達すると、${pageContext.request.requestURL}呼び出しで、jspはthisjspのパスを返します。

例えば

  1. 元のリクエスト:/ booking/getCruiseDetails
  2. 転送先:/booking/validateCruiseDeteails.jsp
  3. 転送先:/booking/validateUser.jsp
  4. 最後に転送される:/ booking/showCruiseDetails.jsp

したがって、/ booking/showCruiseDetails.jspで${pageContext.request.requestURL} /booking/showCruiseDetails.jspを取得します

multipleforwardで到達したjspから元の(クライアントが作成した)要求URLを取得するにはどうすればよいですか。私は解決策を示唆するstackoverflowに関する次の投稿を見つけました here および here ですが、複数回転送した後に元のリクエストURLを見つける方法については触れていません発生しています。

29
Salman Paracha

この投稿でより良い答えを見つけました[ JavaサーブレットでURLを検出するにはどうすればよいですか? ]

ターゲットJSPで次を使用します。

request.getAttribute("javax.servlet.forward.request_uri")

元のURLが何であるかを調べるため。

転送サーブレットで追加の手順を実行する必要はありません。

57
Lenny Markus

フィルタを使用して、Originアドレスを要求属性に設定し、jspから読み取ることができます。

/ booking/*にマップされたフィルターは実行します:

request.setAttribute("Origin", request.getRequestURL());

Jsp:

${pageContext.request.attribute["Origin"]}

これは、フィルターがデフォルトでREQUESTディスパッチャーを設定しているため機能します。これは、転送/インクルードではなく、直接のクライアント要求に対してのみフィルターが実行されることを意味します

11
lukastymo
${requestScope["javax.servlet.forward.request_uri"]}

または一重引用符で

${requestScope['javax.servlet.forward.request_uri']}
3
Marcus

代わりに、サーブレットフィルターを使用して情報を検証することを検討してください。つまり、検証の転送を回避し、単一のJSPファイルにとどまることができます。

以下を使用して、Bean参照を使用せずに表示できます。

<h:outputText value="#{requestScope['javax.servlet.forward.request_uri']}" />

もちろん、web.xmlファイルで404ページをマップする必要があります。

<error-page>
    <error-code>404</error-code>
    <location>/xhtml/pg/error/404.xhtml</location>
</error-page>
0
Sky Games Inc

@Lenny Markusと同じですが、Request Dispatcherクラスで提供される定数を使用します。

request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI)
0
winter