

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;


/**
* セッション管理実験プログラム
* ログイン、ログアウトの処理を行う。
* ログイン用フォームを表示し、ログインしたら、ログイン確認用フォームを表示する。
*/

public class LoginServlet extends HttpServlet {

  //**doGet用メソッド**//
  public void doGet(HttpServletRequest request,
  HttpServletResponse response)
  throws IOException, ServletException
  {
    //レスポンスの為の準備処理を行う。
    response.setContentType("text/html;charset=iso-2022-jp");
    PrintWriter out = response.getWriter();
    createHeader(out);

    //セッションを作成する。引数がfalseなので、セッションがない場合は新規作成されない。
    HttpSession session = request.getSession(false);

    //セッションが空の場合は、ログインの為の処理を行う。
    if(session==null){
      String loginid = request.getParameter("loginid");
      String password = request.getParameter("password");
      //フォームからの情報があれば、フォーム送信中なのでセッションを設定
      if (loginid != null && password != null) {
        //セッションを作成する。引数がtrueなので、セッションがない場合は新規作成される。
        session = request.getSession(true);
        session.setAttribute("loginid", getUnicode(loginid));//ログイン名
        session.setAttribute("password", getUnicode(password));//パスワード
        session.setAttribute("count", String.valueOf(0));//確認した回数
        //セッションタイムアウト時間の設定(秒)。-1でタイムアウトなし。
        session.setMaxInactiveInterval(30);
        //セッションタイムアウト時間の取得
        int i=session.getMaxInactiveInterval();
        out.println("ログインしました。タイムアウト時間＝"+i);
        checkLoginForm(out); //ログイン確認フォームを作成する。
      }
      //フォームの情報がなければ、ログインしていないので、フォームを作成。
      else createForm(out);
    }
    //セッションがある場合は、ログイン情報を確認。
    else{
      String login_s=(String)session.getAttribute("loginid");
      String password_s=(String)session.getAttribute("password");

      String count=(String)session.getAttribute("count");
      count=String.valueOf((Integer.parseInt(count)+1));//カウントを一つ増やす。
      session.setAttribute("count", count);//セッションにカウンタ数を入れる。

      //ログイン情報がセッションにあるか確認し、あればそのように表示する。
      if (login_s != null && password_s != null) {
        String logout = request.getParameter("logout");
        if(logout==null)logout="";
        //ログアウト要求がきていれば、セッションを終了する。
        if(logout.equals("true")){
          out.println("ログアウトしました。");
          session.invalidate();
        }
        //ログアウト要求がきていなければ、ログイン名を表示する。
        else{
          out.println("<p>現在ログインしています。:ログイン名＝"+getUnicode(login_s)+"確認カウント数＝"+count+"</p>");
        }
        checkLoginForm(out); //ログイン確認フォームを作成する。
      }
      //ログイン情報が紛失していれば、ログインを再要求。
      else{createForm(out);}
    }


    out.println("</body></html>");
  }

  //**doPost用メソッド**//
  public void doPost(HttpServletRequest request,
  HttpServletResponse response)
  throws IOException, ServletException
  {
    doGet(request, response);
  }

  //**HTMLヘッダーをつくるメソッド**//
  public void createHeader(PrintWriter out){

    out.println("<html>");
    out.println("<body bgcolor=\"white\">");
    out.println("<head>");
    out.println("<title>" + "ログイン処理" + "</title>");
    out.println("</head>");
    out.println("<body>");
  }

  //**ログイン用フォーム（HTML）をつくるメソッド**//
  public void createForm(PrintWriter out ){
    out.println("<p>現在ログインしていません。ログインして下さい。</p>");
    out.println("<form>");
    out.println("<form name=\"form1\" method=\"get\" action=\"http://localhost:8080/examples/servlet/LoginServlet\" >");
    out.println("ログイン名:<input type=\"text\" name=\"loginid\"><br/>");
    out.println("パスワード:<input type=\"password\" name=\"password\"><br/>");
    out.println("<input type=\"submit\" name=\"Submit\" value=\"ログイン\">");
    out.println("</form>");
  }

  //**ログイン確認用フォーム（HTML）をつくるメソッド**//
  public void checkLoginForm(PrintWriter out){
    out.println("<p>ログインの確認を行います。</p>");
    out.println("<form>");
    out.println("<form name=\"form1\" method=\"get\" action=\"http://localhost:8080/examples/servlet/LoginServlet\" >");
    out.println("<input type=\"submit\" name=\"Submit\" value=\"確認\">");
    out.println("</form>");
    out.println("<form>");
    out.println("<form name=\"form2\" method=\"get\" action=\"http://localhost:8080/examples/servlet/LoginServlet\" >");
    out.println("<input type=\"submit\" name=\"Submit\" value=\"ログアウト\">");
    out.println("<input type=\"hidden\" name=\"logout\" value=\"true\">");
    out.println("</form>");
  }
  /**
 	以下はフォームから入力された日本語を、正しく表示させる為のメソッドである。
  **/
  private String getUnicode(String s) throws UnsupportedEncodingException{
    return new String(s.getBytes("8859_1"),"JISAutoDetect");
  }

}