質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Q&A

解決済

1回答

4683閲覧

POSTデータの文字エンコード

take_take

総合スコア21

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

0グッド

0クリップ

投稿2017/05/22 14:36

JSPでの文字のエンコードについて質問です。
1つ目のJSPで入力されたデータを送信し、2つ目のJSPで受け取ったパラメータをクッキーとして保存します。

わからないのは、2つ目のJSPで、setCharacterEncodingでリクエストをエンコードしているのに、その次の行でさらにURLEncoder.encodeで、getParameterで取得したパラメータをエンコードしていることです。
私の認識では、POSTで送信したデータはリクエストのメッセージボディに記述されるので、setCharaEncodingでエンコードすれば、URLEncoder.encodeは必要ないのではないかと思うのですが、この2行の内どちらかを削除すると文字化けします。

この2行が必要な理由について教えて頂きたいです。
宜しくお願い致します。

HTML

1<%@ page contentType="text/html; charset=UTF-8" import="java.net.*"%> 2<% 3 String email = ""; 4 Cookie[] cookies = request.getCookies(); 5 if (cookies != null) { 6 for (Cookie cook : cookies) { 7 if (cook.getName().equals("email")) { 8 email = URLDecoder.decode(cook.getValue(), "UTF-8"); 9 break; 10 } 11 } 12 } 13%> 14 15<!DOCTYPE html> 16<html> 17 <head> 18 <meta charset="UTF-8"> 19 <title>クッキー情報</title> 20 </head> 21 22 <body> 23 <form method="POST" action="cookie2.jsp"> 24 メールアドレス: 25 <input type="text" name="email" size="40" value="<%=email %>" > 26 <input type="submit" value="送信"> 27 </form> 28 </body> 29</html> 30

HTML

1<%@ page contentType="text/html; charset=UTF-8" import="java.net.*"%> 2<!DOCTYPE html> 3<html> 4 <head> 5 <meta charset="UTF-8"> 6 <title>クッキー情報</title> 7 </head> 8 9 <body> 10 <% 11 request.setCharacterEncoding("UTF-8"); 12 String value = URLEncoder.encode(request.getParameter("email"), "UTF-8"); 13 Cookie cook = new Cookie("email", value); 14 cook.setMaxAge(60 * 60 * 24 * 180); 15 response.addCookie(cook); 16 %> 17 クッキーが保存されました 18 </body> 19</html> 20

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

単純にCookieに値を詰める時にURLエンコードしたバイト列を入れる必要があるだけでは?
そのために1ページ目でCookieから取り出した値をデコードしているのではないですか?

投稿2017/05/22 14:54

koko_u

総合スコア936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

take_take

2017/05/22 15:18

ご回答ありがとうございます! URLエンコードしたバイト列というのは%AF%3Aみたいな、%が付いた形式であって、setCharacterEncodingでは、同じUTF-8でエンコードしてもこの形式にはならない。クッキーに値を保存する時にはURLエンコードされたものが必要。という認識で大丈夫でしょうか。
koko_u

2017/05/22 22:29

Cookie にASCII以外の文字を格納した場合の挙動は(多分)ブラウザに依存するので、お手軽に URLエンコードを使っているだけで、エンコードとデコードが正しくできれば、何でもよいです。 一方で、POSTリクエストボディのエンコードはHTTPの仕様で決まっているので、getParameter() を呼び出す前に、setCharacterEncoding で文字コードを指定することが Servlet API の仕様として決まっている、ということです。
take_take

2017/05/25 02:56

わかりました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問