2009-05-11 8 views
2

私たちが構築している製品の要件は、そのURLエンドポイントがユーザーにとって母国語で意味的に意味があることです。これは、太陽の下のすべてのアルファベットをサポートするためにUTF-8でエンコードされたURLが必要であることを意味します。Tomcat 5.5をUTF-8に設定すると、すべてのsendRedirect()リダイレクトがエンコードされますか?

また、私たちがサポートしているすべてのアプリケーションサーバーとバージョンのインストール構成ドキュメントを提供する必要はありません。このコードを実行するといいでしょう。これは、サーブレットが要求を受け取った時点で、アプリケーションサーバーなどでエンコードされているために可能ではない可能性があります。

これは私の最初の使用例です。米国のASCII文字)を使用して、リクエストのパス情報を再構成して、次のようにしてください:

​​

ただし、sendRedirect()を使用してPOSTからGETにリダイレクトした後では、これは機能しません。要求のパスはすでにエスケープされているため(öは%F6としてエンコードされています)、上記の方法は機能しません。

私の疑問に思うことは、このすべてが間違っているということですか?もしそうなら、私の無知に対する解毒剤は何ですか? :)

更新:解決策を見つけました。問題は、サーブレットAPIが、リダイレクトを送信する前にURLエンコーディングに関していくつかの奇妙な動作をしていることです。 sendRedirect()を呼び出す前に、URLエンコード(UTF-8文字をエスケープ)する必要があります。 encodeRedirectURL()メソッドはそれを行いません。

このページでは、それについて説明しますと調査と実験するhttp://www.whirlycott.com/phil/2005/05/11/building-j2ee-web-applications-with-utf-8-support/

答えて

2

が見つかりました。問題は、サーブレットAPIが、リダイレクトを送信する前にURLエンコーディングに関していくつかの奇妙な動作をしていることです。 sendRedirect()を呼び出す前に、URLエンコード(UTF-8文字をエスケープ)する必要があります。 encodeRedirectURL()メソッドはそれを行いません。

このページではそれについて説明します。http://www.whirlycott.com/phil/2005/05/11/building-j2ee-web-applications-with-utf-8-support/

4

カップルの事:

  • はあなた./conf/server.xmlファイルを見てください、コネクタははURIEncodingを持っていることを確認してください属性は「UTF-8」に設定されています。

例:

<Connector port="8080" 
      protocol="HTTP/1.1" 
      URIEncoding="UTF-8"/> 
  • ブラウザベースのツール(例:FirefoxのためのTamperData)のいくつかの並べ替えを使用して、ブラウザがサーバに送信しているかを確認する - それは非常によく脱出することができますそれはあなたのためです。この場合、サーバ上でURL.decode()を使用することができます。
  • Response.redirect()を使用する代わりに、ヘッダーと応答コードを手動で設定します。

例えば:

response.setHeader("Location", myUtf8unencodedUrl); 
response.setStatus(response.SC_MOVED_TEMPORARILY); 

ない約束が、これは、それが私だったら、私は試してみるだろうかです。 :)

1

我々は同様に、ここではすなわち、私たちの製品を同じような状況を持っているが、地球上の潜在的にあらゆる言語でユーザーに意味のあるURLを表示するために必要とされます。私たちのツールとテクニックはすべてUTF-8をサポートしているので、問題はありません。 IE(7,8)は醜いエスケープされたURLを表示しますが、FirefoxはエスケープしてURLを表示します。つまり、 '/français/Banane.html'は '/ fran%'としてIEに表示されます。 C3%A7ais/Banane.html ' フォーム提出後のPOST /リダイレクト後のGETは、UTF-8 URLを送信したり、UTF-8 URLをエスケープしたりすることはありません。また、XMLスタイルの数字エンティティコーディングを成功させずに使用しようとしました。

しかし、私たちは最終的に、POST後にうまくリダイレ​​クトする方法を見つけました.ISTF-8文字列をISO-8859-1をバイト単位でエンコードしています。とにかくこれがどのように機能するのか私たちは本当に理解していません(どのようにしてブラウザがそれを解読するかを知ることができます、utf-8文字あたりのバイト数が変わる可能性があり、ブラウザは元々utf-8ですか?します。リダイレクト先のコピーについては


package springapp.web.servlet; 

import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 

import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.commons.io.IOUtils; 

public class TestServlet extends HttpServlet { 

private static final long serialVersionUID = -1743198460341004958L; 

/* (non-Javadoc) 
    * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 
    */ 
@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException { 

    String url = "çöffte.html"; 
    try { 
     ServletContext context = req.getSession().getServletContext(); 
    // read utf8 encoded russian url 
      if (context.getResource("/WEB-INF/ru_url.txt") != null){ 
      InputStream is = context.getResourceAsStream("/WEB-INF/ru_url.txt"); 
      if (is != null){ 
       url = IOUtils.toString(is, "UTF-8"); 
       System.out.println(String.format("Redirecting to [%s]", url)); 
      } 
      } 
     } 
     catch (FileNotFoundException fNFEx) { 
     fNFEx.printStackTrace(); 
     } 
     catch (IOException ioEx) { 
     ioEx.printStackTrace(); 
     } 

     byte[] utfBytes = url.getBytes("UTF-8"); 
     String result = new String(utfBytes, "ISO-8859-1"); 
     resp.sendRedirect(result); 

     // does not work: 
     //resp.sendRedirect(url); 
     //resp.sendRedirect(Utf8UrlEscaper.escapeUtf8(url)); 
     //resp.sendRedirect(Utf8UrlEscaper.escapeToNumericEntity(url)); 
} 
} 

をし、例えば任意のネイティブ言語のURLを貼り付けます。ここでは

はそれを試してみるための単純なサーブレットですwikipediaからUTF-8でエンコードされたファイル(BOMなし)で保存し、WEB-INFディレクトリに保存します。この例では、ロシアのURL(http://ru.wikipedia.org/wiki/Заглавная_страница) を「ru_url.txt」という名前のファイルに保存しました。

任意の* .abc urlをテストサーブレットにマッピングする単純なSpringMVCアプリケーションを作成しました。 あなたがアプリを起動し、 'localhost:8080/springmvctest/a.abc'のようなものを入力すると、ロシアのwikipediaサイトにリダイレクトする必要があります。ブラウザ(IEとFirefox、Safariなど) -8エンコードされたネイティブローションURL。

関連する問題