🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

2回答

2035閲覧

Cookieの設定と取得について

shoka_amiss

総合スコア4

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2019/11/19 07:44

前提・実現したいこと

アクセス時にクッキーを利用して現在時刻を記録し、
2回目以降のアクセス時にクッキーの値を取り出し、前回アクセス時刻を表示。

発生している問題・エラーメッセージ

コンパイル時点でエラーはないが、例外とされてしまう。

エラーメッセージ
重大: サーブレット [api.GetCookie] のServlet.service()が例外を投げました

該当のソースコード

package api;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**

  • Servlet implementation class GetCookie

*/
@WebServlet("/GetCookie")
public class GetCookie extends HttpServlet {
private static final long serialVersionUID = 1L;

/** * @see HttpServlet#HttpServlet() */ public GetCookie() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); try (PrintWriter out = response.getWriter()) { Date date = new Date(); String str = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(date); Cookie c = new Cookie("now",str); response.addCookie(c); Cookie[] cs = request.getCookies(); if (cs != null) { for (int i = 0; i <= cs.length; i++) { String cookieName = cs[i].getName(); if (cookieName.equals("now")) { String cookieValue = cs[i].getValue(); out.print(cookieValue); break; } } } } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }

}

Java

試したこと

PrintWriterのtryを外して実行するとHTTP Error500が出る。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答2

0

Cookieでは半角スペースは区切り文字の扱いになるので、値に指定するとそこで途切れてしまいます。

https://triple-underscore.github.io/http-cookie-ja.html

他にも利用できない文字として、
制御文字、空白、ダブルクォート、カンマ、セミコロン、バックスラッシュ
がありますので、これら以外の半角英数記号を使わないと、少なくとも昨今のJavaサーブレットコンテナはエラー(RFC 6265違反)とします。

日付を扱いたい場合はCookieの有効期限でも利用しているlong値に変換するのが一番良いでしょう。
java.util.Dateはlongと相互変換ができます。

java

1Date date = new Date(); 2long t = date.getTime(); 3date.setTime(t);

投稿2019/11/23 14:01

A-pZ

総合スコア12011

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

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

0

Cookie には利用できる文字に制限があります。
今回のケースでは半角スペースが含まれており、それが利用不可能であるため例外が発生しているようです。

そのため、SimpleDateFormat で指定しているフォーマットに半角スペースを含まない形式にするなり、Base64 や URL エンコードするなり、利用不可能な文字列が含まれないように修正する必要があります。

投稿2019/11/20 00:59

d-yosh

総合スコア270

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問