2011-12-14 19 views
4

TomcatコンテナでJavaでhello world Webアプリケーションを実行しました。私はURLで=の両側にアンダースコアを持つクエリ文字列リクエストパラメータの値から#が欠落しています

code=askdfjlskdfslsjdflksfjl#_=_ 

を持っています。サーブレットのクエリ文字列をrequest.getParameter("code")で取得しようとしたときには、askdfjlskdfslsjdflksfjlしか得られません。 #以降の部分がありません。

これはどのように発生し、どのように解決できますか?

+0

はい、アンカー値はサーバーに送信されず、ブラウザーで処理されます。 – home

答えて

1

#はブラウザでのみ解釈され、サーバーでは解釈されません。 #文字をサーバーに渡す場合は、そのURLエンコードを行う必要があります。

例:

URLEncoder.encode("code=askdfjlskdfslsjdflksfjl#=", "UTF-8"); 
+0

私はURLをタイプしましたwww.oauth.com/?code="sdfsdfsdf#_=_ " – user1098255

+0

URLEncoderを使ってリクエストをJava経由で送信できると思いますが、ここではブラウザにURL www.oauthを入力しました。 com /?code = "sdfsdfsdf#_ = _ – user1098255

5

#の後にURLの一部がクエリの一部ではないためです。 approprate RFCの

Section 3.4言う:

クエリコンポーネントは、(「?」)最初の質問 マークで表示された文字と番号記号(「#」)文字 または終了によって終了URIの

+0

質問文字列に#または_文字を送信できませんか? – user1098255

+1

@foniniが言ったように、あなたはそれをエンコードする必要があります。http://www.ietf.org/rfc/rfc1738 .txtにはそう言われています。例えば、#は%23です。 – soulcheck

+0

@ user1098255 http://meyerweb.com/eric/tools/dencoder/ – soulcheck

1

percent encoding on Wikipediaをお読みください。 #=は、URLにreserved charactersです。予約されていない文字だけがURLにプレーンで使用でき、他のすべての文字はURL-encodedとなっています。 #のURLエンコードされた値は%23であり、=%3Dです。だから、これは実行する必要があります。

code=askdfjlskdfslsjdflksfjl%23_%3D_ 

を、これは実際にはそれほどのようないくつかのJSPでHTML <a>リンクから発信した場合:

<a href="servletUrl?code=askdfjlskdfslsjdflksfjl#_=_">some link</a> 

、あなたが実際にJSTL's<c:url>を使用するように変更されている必要があります。

<c:url var="servletUrlWithParam" value="servletUrl"> 
    <c:param name="code" value="askdfjlskdfslsjdflksfjl#_=_" /> 
</c:url> 
<a href="${servletUrlWithParam}">some link</a> 

<a href="servletUrl?code=askdfjlskdfslsjdflksfjl%23_%3D_">some link</a> 

これはJava/Servlets per seとは関係なく、すべてのWebアプリケーションに適用されます。

+0

ありがとうございました。私はサードパーティのサイトからこのパラメータを取得しています。このURLをこのコードで送信しているので、変更する方法はないと思います。 – user1098255

+0

いくつかの選択肢について考えてみましょう。 – user1098255

+0

サードパーティのサイトの間違いです。それを修正するように指示する必要があります。実際には**コールバックURLである場合(つまり、あなたが実際に自分自身で*必要なURL *を作成した場合)、コールバックを行う前に 'URLEncoder#encode()'を使ってそれを修正する必要がありますサードパーティのサイトへのURL。 – BalusC

関連する問題