3

Java サーブレットを使用してレッスン用の Web アプリを作成しています。ある時点で、jsp ページにリダイレクトし、そこで使用したい情報も送信したいと考えています (GET メソッドを使用)。私のサーブレットには、次のコードがあります。

String link = new String("index.jsp?name="+metadata.getName()+"&title="+metadata.getTitle());

response.sendRedirect(response.encodeRedirectURL(link));

jsp では、これらのパラメーターを次のように取得します。

<%
request.getParameter("name");
request.getParameter("title");
%>

パラメータにラテン文字のみが含まれていない場合を除いて、すべて正常に機能します(私の場合、ギリシャ文字を含めることができます)。たとえば、name=ΕΡΕΥΝΑΣ の場合、name=¡¥ を取得します。このエンコードの問題を修正するにはどうすればよいですか (UTF-8 に設定します)? encodeRedirectURL() がこの仕事をしていませんか? ある時点で encodeURL() も使用する必要がありますか? 私は最後のものを試しましたが、問題はまだ存在していました。

前もって感謝します :)

4

4 に答える 4

8

HttpServletResponse#encodeRedirectURL()URLをURLエンコードしません。jsessionidセッションがあり、クライアントでCookieが無効になっている場合にのみ、属性がURLに追加されます。確かに、これは紛らわしいメソッド名です。

URLEncoder#encode()URLを作成するときに、自分の助けを借りてリクエストパラメータをエンコードする必要があります。

String charset = "UTF-8";
String link = String.format("index.jsp?name=%s&title=%s", 
    URLEncoder.encode(metadata.getName(), charset), 
    URLEncoder.encode(metadata.getTitle(), charset));

response.sendRedirect(response.encodeRedirectURL(link));

そして、マッピングされ、基本的に次のメソッドを実行するフィルターを作成します。/*doFilter()

request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);

そして、JSPの先頭に以下を追加します。

<%@ page pageEncoding="UTF-8" %>

最後に、次のように表示できるようになります。

<p>Name: ${param.name}</p>
<p>Title: ${param.title}</p>

参照:

于 2011-02-23T21:23:41.037 に答える
1

java.net.URLEncoderを使用して、各パラメーターをURLに追加する前にエンコードします。このように考えてください。名前に「&」が含まれている場合、これがパラメーター区切り文字ではないことをどのようにして知ることができますか?

于 2011-02-23T21:27:09.623 に答える
0

URLEncoder.encode()クエリ文字列に入れる前に、すべてのリクエストパラメータをでエンコードする必要があります。

このencodeRedirectURLメソッドは、必要に応じてセッションIDをURLに含めるためにのみ使用されます(ブラウザーでCookieがサポートされていない場合はURLの書き換え)

于 2011-02-23T21:23:11.710 に答える
0

代わりに次はどうですか?

  • 名前とタイトルをリクエストオブジェクトの属性として設定します。
  • リクエストオブジェクトから、またはサーブレットコンテキストを介して、JSPのリクエストディスパッチャを取得します。
  • リクエストディスパッチャを使用して、リクエストをJSPに転送します。
  • JSPからのリクエストでこれらの属性にアクセスします。

これにより、ブラウザを最初のサーブレットからJSP派生サーブレットにリダイレクトする手間が省け、パラメータエンコーディングの問題全体が完全に回避されます。

また、JSPページディレクティブがコンテンツエンコーディングをUTF-8に設定していることを確認してください。

于 2011-02-23T21:23:26.733 に答える