入力フォームを作っているときにハマったのでメモ
想定している状況
- 入力フォームで入力した情報を登録する
- 入力した情報はセッションで管理する
プログラム
Hogehoge.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/hogehoge")
public class Hogehoge extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 省略
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 文字コードを指定
req.setCharacterEncoding("utf-8");
// リクエストからセッションを取得
HttpSession session = req.getSession(false);
// 二回目以降のアクセスをできなくするためにセッションの有無を確認する
if (session == null) {
// 二回目以降のアクセスなら別の画面(fugafuga)へ遷移
req.getRequestDispatcher("/fugafuga.jsp").forward(req, resp);
} else {
// 登録する値を取得
String xxxxxx = (String) session.getAttribute("xxxxxx");
// 登録する処理(省略)
// 登録後の画面(hogehoge)へ遷移
req.getRequestDispatcher("/hogehoge.jsp").forward(req, resp);
// セッションを全て破棄する
session.invalidate();
}
}
}
fugafuga.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>fugafuga</title>
</head>
<body>
登録完了しました。
</body>
</html>
やりたかったこと
- 複数回の登録を防ぐために、登録後はセッションを破棄する
- F5などで再度ページが読み込まれた場合は、別のページ(jsp)に遷移する
実際におこったこと
- F5などで再度ページが読み込まれたとき、一度目は別のページ(jsp)に遷移する
- その後セッションが新たに作られてしまい、二度目はセッションが存在するときの挙動になってしまう
解決方法①
JSPに以下を記述しよう!
.jsp
<%@ page session="false"%>
解説
上記のプログラムだと一度目の再読み込みではきちんとfugafugaに遷移するが、
二度目の再読み込みではhogehogeへ遷移してしまう。
原因はjspにある。
jspでsession属性の指定を省略すると、session="true"が設定されたものと見なされて勝手にセッションがつくられてしまう。
fugafuga.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
そのため、以下のように書かないと、セッションが新たに作られてしまうのである。
fugafuga.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="false"%>
解決方法②
条件式を変えてしまおう!
Hogehoge.java
//if(session != null){
if(session.getAttribute("xxxxxx") != null){
}
解説
新しいセッションは勝手に作られるが、セッションのattributeはもちろん削除されているからである。
ただ新しいセッションが残り、無駄にメモリが消費されるので可能な限り①を推奨する。
結論
JSPでは何も書かないと勝手にHTTPセッションを作成する。
それを知らないとセッションが存在しているかどうかの条件分岐で困ることになるので注意。
また、アプリケーションサーバ上のメモリが無駄に消費されるので、セッションが不必要ならばJSPに以下を記述するべし。
.jsp
<%@ page session="false"%>