0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【JavaServlet】千里の道も一歩から 四歩目

Last updated at Posted at 2020-06-09

#進行状況
前回でようやく
login.jsp → LoginServlet.java → mypage.jsp
の遷移ができるようになりました。
ちなみに、mypage遷移時のURLは
http://localhost:8080/ServletApp/mypage.jsp
となりますが、もし最後の拡張子が気になる場合はweb.xmlに

web.xml
<servlet>
	<servlet-name>mypage</servlet-name>
	<jsp-file>/mypage.jsp</jsp-file>
</servlet>
<servlet-mapping>
	<servlet-name>mypage</servlet-name>
	<url-pattern>/ServletApp/mypage</url-pattern>
</servlet-mapping>

を加えてあげると、遷移時のURLが
http://localhost:8080/ServletApp/mypage
になります。

##その他のデータの受け渡し方法
実は、サーブレット間のデータの受け渡しには、前回やったrequest.getParameter()メソッドを利用する方法以外に、「クッキー」と「セッション」と呼ばれるものが存在します。
#クッキー作りましょう
クッキーとは、サーバからレスポンスが返ってくる際にクライアント側に保存される情報です。(よくサイトを閲覧していると「このサイトはCookieを使用しています」等ポップアップが出ることもありますね)
servlet17.png
クライアント側でデータを保存しておくメリットとして、

  • 会員制サイト → 次回からユーザ名の入力を省略する
  • ショッピングサイト → カートに入れた商品を覚えておく

などが挙げられます。
それではクッキーを作っていきましょう。まずはLoginServlet.javadoPost()メソッドを改造します。

LoginServlet.java
protected void doPost(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
	req.setCharacterEncoding("UTF-8");
	String name=req.getParameter("name");
	Cookie c[]=req.getCookies();
	boolean CreatedCookie=false;
	for(Cookie cookie:c) {
		if(cookie.getName().equals("cookie_user")) {
			CreatedCookie=true;
		}
	}
	if(CreatedCookie==false) {
		Cookie cookie=new Cookie("cookie_user",name);
		res.addCookie(cookie);
	}
//		if(Arrays.stream(c)
//			.filter(e->!e.getName().equals("cookie_user"))
//			.count()==c.length) {
//		Cookie cookie=new Cookie("cookie_user",name);
//		res.addCookie(cookie);
//	}
	req.setAttribute("name",name);
	req.getRequestDispatcher("/mypage.jsp").forward(req,res);
}

※6~15行目とコメントアウト行は書き方が違うだけでほぼ同じ動きになります。お好みで使い分けてください。

  • req.getCookies() ・・・クライアントが持っているクッキーを配列で取得(5行目)
  • cookie.getName() ・・・クッキーの名前を取得(8行目)
  • new Cookie(String name,String value) ・・・名前:値のペアでクッキーを作成(13行目)
  • res.addCookie(Cookie cookie) ・・・クッキーをレスポンスに設定(14行目)

これによって、ログイン時に入力したユーザ名をcookie_userという名前で保存できます。
また、ここには出てきませんが、

  • cookie.setMaxAge(int seconds) ・・・クッキーの有効期限を秒数で指定(有効期限が切れるとクッキーが破棄されます)
  • cookie.setValue(String value) ・・・クッキーに値を再設定

などもあります。
次にlogin.jsp<body>タグ内を改造します。

login.jsp
<body>
<%
	Cookie cookies[]=request.getCookies();
	String username="";
	for(Cookie c:cookies){
		if(c.getName().equals("cookie_user"))username=c.getValue();
	}
%>
<form action="/ServletApp/mypage" method="post">
name:<input type="text" name="name" value=<%=username%>><br>
password:<input type="text" name="password"><br>
<input type="submit" value="login">
</form>
</body>

ログイン画面表示時に、既にcookie_userというクッキー名が存在する場合、その値をテキストフィールドに入力させておく、という処理になります。
#クッキー使いましょう
それではlogin.jspへアクセスします。
servlet19.png
nameに「はと」と入力してログインします。
servlet21.png
一見何も変化がないように見えますが、ここで再度login.jspにアクセスしてみましょう。
servlet22.png
nameに、既に先ほど入力した「はと」が入力されているのが分かります。
#クッキー調べましょう
クッキー作りましょうで「クライアント側に保存される情報」と言いましたが、Google Chromeで保存されたクッキーを調べる方法があります。

  1. login.jspを開いた状態でF12キーを押して「開発者ツール」を開く。
  2. メニューのApplicationタブをクリックする。
2020-06-07.png
  1. Cookiesをクリックする。
2020-06-07 (1).png 1. `http://localhost:8080`をクリックする。 2020-06-07 (2).png 完了です。 `Name`に先ほど作成したクッキーの名前である`cookie_user`が、`Value`に入力したユーザ名である「はと」が表示されていますね。値の書き換えや削除もこの画面でできます。

#セッション作りましょう
セッションとは、「ログインしてからログアウトするまで」や「ログイン後、放置してタイムアウトするまで」といった接続の開始~終了(もしくは破棄)までの一連の処理の事を指します。
ただ、通常のWebページには「接続している状態」を受け渡す機能はないので、以下のようにサーバにアクセスするたび別の接続として扱われてしまいます。
servlet24.png

この接続A~接続Cを一連の処理(セッション)にしていきましょう。

LoginServlet.javaに以下のコードを追加します。

LoginServlet.java
HttpSession session=req.getSession();
Date date=new Date(session.getCreationTime());
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
session.setAttribute("lastLoginDate", sdf.format(date));
session.setMaxInactiveInterval(20);

lastLoginDateという名前でセッションの開始時刻を保存するコードです。

  • req.getSession() ・・・セッションを取得
  • session.getCreationTime() ・・・セッションが初めて作成された日時をlong型で取得
  • session.setAttribute(String name,Object value) ・・・名前:値のペアでパラメータを格納
  • session.setMaxInactiveInterval(int s) ・・・セッションの有効期限を秒数で指定(デフォルトは1800秒のはず)

mypage.jspも改造します。

mypage.jsp
<body>
<%
    String name=request.getParameter("name");
    String session_date=session.getAttribute("lastLoginDate").toString();
%>
<%=name%>さんのログイン日時は<%=session_date%>です。
</body>
  • session.getAttribute(String name) ・・・引数で指定した名前に対応する値をセッション内からObject型で取得

また、今回は利用しませんが

  • session.getAttributeNames() ・・・そのセッションに格納されているパラメータ名をString型の配列で取得
  • session.lastAccessedTime() ・・・そのセッションで最後に接続してきた時間を取得

などもあります。
#セッション使いましょう
では再びlogin.jspへアクセスします。
「はと」と入力してログイン。
servlet26.png
ざっくり現在時刻が表示されていると思います。
それでは間髪入れずにF5キーでページ更新(本物の入力フォームや商品ページではやらないでね)
servlet26.png
時刻は変わりません。先ほど有効期限に設定した20秒の間は「同一の接続」とみなされます。
それでは時間をおいて再リロード。
servlet27.png

セッションもクッキーの一種のため、クッキー調べましょうと同じようにセッションが確認できます。ただ、極力改変などができないよう難しい文字列になっています。

今回はここまでになります。もう少しでフレームワークに入れるかな・・・。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?