2

一意の識別子を入力として取り、ドキュメントを返すか、ドキュメントが別のサーバーで見つかる場合は 302 Moved Temporarily リダイレクトを送信するサーブレットに取り組んでいます。もう 1 つのサーバーは、Apache を備えた Linux ボックスであり、webdav を介してファイルを公開します。私はこのサーバーを制御できません。

URL に特殊文字 (ドイツ語のウムラウト) が含まれていない限り、リダイレクトは正常に機能します。

このhttp://webfolder.company.com/projekt/übersicht.pdf URL をコピーしてブラウザ (Chrome) に貼り付けると、問題なくファイルを開くことができます (ウムラウトは URL に残ります)。

しかし、サーバー側からリダイレクトを送信すると、URL がエンコードされhttp://webfolder.company.com/projekt/%C3%BCbersicht.pdf、何らかの理由で理解できないため、404 - Not Found が発生します。

私のサーブレット実装は、データベース (MySQL、UTF-8) から URL を取得し、HttpServletResponse.sendRedirect メソッドを使用します。

response.sendRedirect(remoteRessource);

(remoteRessource は文字列です)。を使用curlすると Location ヘッダーが設定されていることがわかりますが、Chrome (および Firefox) は URL を にエンコードするhttp://webfolder.company.com/projekt/%C3%BCbersicht.pdfため、404 エラーが発生します。

< HTTP/1.1 302 Moved Temporarily
< Date: Wed, 06 Mar 2013 20:50:16 GMT
< Server: Apache-Coyote/1.1
< Location: http://webfolder.company.com/projekt/übersicht.pdf
< Content-Type: text/html;charset=UTF-8
< Content-Length: 0
< Set-Cookie: JSESSIONID=FA670C0DDA55593368A3285F54894153; Path=/; HttpOnly
< Vary: Accept-Encoding

エンコードされていないブラウザにリダイレクト URL をそのまま提供する適切な方法は何ですか? ありがとう。

修理

Julian Reschke の回答のおかげで、両方のサーバーで使用されているエンコーディングが異なることがわかりました。これで、Java/URI クラスがエンコーディングを処理できるようになり、問題なく動作するようになりました。

URI uri = new URI(schema, host, path, null);
String location = uri.toASCIIString();
response.sendRedirect(location);
4

2 に答える 2

3

原因として考えられるのは、Apache+WebDAV を実行しているサーバーが UTF.8 とは異なるエンコーディングを想定していることです。ISO-8859-1 かな?

于 2013-03-11T08:30:42.880 に答える
0

ローカライズされた文字 [この場合はドイツ語のウムラウト] を送信する代わりに、文字の国際化のために i18n パッケージを使用する必要があります。

あなたのケースで何が起こっているのかhttp://docs.oracle.com/javase/1.5.0/docs/api/java/net/URLEncoder.htmlを見てください

エンコードについてはこちらを参照し、デコードについてはこちらを参照してください

于 2013-03-10T21:36:31.870 に答える