セッション

6801 ワード

HTTPは「無状態」プロトコルであるため,クライアントがページを要求するたびに,webサーバは以前のレコードを保存しないが,webアプリケーションはいずれも関係を維持する必要があるため,Sessionを媒介として関係維持を行う必要がある.
セッションを維持する3つの方法
  • Cookies

  • 1つのWebサーバは、各Webクライアントのクッキーとして一意のセッションIDを割り当てることができ、クライアントの後続要求に対して受信したクッキーを使用して識別することができる.AndroidプロジェクトはCookiesを使うことを考えることができます.私はもともと使ったことがあります.
  • hiddenタイプフォーム
  • 1つのWebサーバは、非表示のHTMLフォームフィールドと、フォームがコミットされると、指定された名前と値が自動的にGETまたはPOSTデータに含まれる一意のセッションID とを送信することができる.Webブラウザがリクエストを返すたびにsession_id値は、異なるWebブラウザの追跡を維持するために使用することができる.ただし、通常のハイパーテキストリンク()をクリックすると、フォームがコミットされないため、非表示のフォームフィールドも通常のセッション追跡をサポートしません.
  • URL書き換え
  • 各URLの末尾にセッションを識別するために追加のデータが追加され、サーバはセッション識別子を格納されたセッションに関するデータに関連付けます.例えば、wiki/6Zeo5bqX5ZCO5Y-w566h55CG57O757uf5o6l5Y-j/20142171?t=1504509668660は、セッションセッション識別子をt=1504509668660として付加し、識別子は、クライアントを識別するためにWebサーバによってアクセスされ得る.うちの会社は前後に分かれていて、バックグラウンドは一般的にSpringで、フロントエンドはこのような方法で、このような方法は各ページにsessionIdを割り当てます.
    HttpSessionオブジェクト
  • サーブレットは、複数のページにわたる要求またはウェブサイトへのアクセス時にユーザを識別し、ユーザ情報を記憶する方法
  • を提供するHttpSessionインタフェースを提供する.
  • サーブレットコンテナは、このインタフェースを使用して、HTTPプロトコルクライアントとサーバ間のセッションを作成します.セッションは、複数の接続またはページ要求
  • にわたって指定された期間継続する.
  • HttpSessionオブジェクト
  • を取得するためにHttpSession()メソッドを呼び出す
    HttpSession session = request.getSession();
    

    方法
    説明
    public Object getAttribute(String name)
    セッションセッションで指定した名前のオブジェクトを返し、名前のオブジェクトが指定されていない場合nullを返します.
    public Enumeration getAttributeNames()
    Stringオブジェクトの列挙を返します.Stringオブジェクトには、セッションにバインドされているすべてのオブジェクトの名前が含まれます.
    public long getCreationTime()
    セッションセッションが作成された時間をミリ秒単位で返します.
    public String getId()
    セッションセッションに割り当てられた一意の識別子を含む文字列を返します.
    public long getLastAccessedTime()
    クライアントがセッションセッションに関連するリクエストを最後に送信した時間をミリ秒単位で返します.
    public int getMaxInactiveInterval()
    サーブレットコンテナは、クライアントアクセス時にセッションセッションが開く最大時間間隔を秒単位で保持します.
    public void invalidate()
    セッションセッションが無効であることを示し、その上にバインドされているオブジェクトを解除します.
    public boolean isNew()
    クライアントがセッションを知らない場合、またはクライアントがセッションに参加しないことを選択した場合、メソッドはtrueを返します.
    public void removeAttribute(String name)
    セッションセッションから指定した名前のオブジェクトが削除されます.
    public void setAttribute(String name, Object value)
    指定した名前でオブジェクトをセッションセッションにバインドします.
    public void setMaxInactiveInterval(int interval)
    サーブレットコンテナがセッションが無効であることを示す前に、クライアント要求間の時間を秒単位で指定します.
    セッションの例
    package com.jty.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    /**
     * Created by TaoYuan on 2017/9/4 0004.
     */
    public class TestSession extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doPost(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //        
            HttpSession session = req.getSession(true);
            //    
            String createTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(session.getCreationTime()));
            //      
            String lastAccessTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(session.getLastAccessedTime()));
    
            String title = "Test Session";
            Integer visitCount = 0;//    
            String visitCountKey = "visitCount";//     key
            String userIDKey = "userID";//  id key
            String userID = "TaoYuan";//  id
    
            //              
            if (session.isNew()){
                session.setAttribute(userIDKey, userID);
            } else {
                visitCount = (Integer)session.getAttribute(visitCountKey);
                visitCount = visitCount + 1;
                userID = (String)session.getAttribute(userIDKey);
            }
            session.setAttribute(visitCountKey,  visitCount);
    
            //         
            resp.setContentType("text/html;charset=UTF-8");
            PrintWriter out = resp.getWriter();
    
            String docType = "
    "; out.println(docType + "
    " + "" + title + "
    " + "
    " + "

    " + title + "


    " + "

    Session


    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    Session
    id" + session.getId() + "
    " + createTime + "
    " + lastAccessTime + "
    ID" + userID + "
    " + visitCount + "

    " + ""); } }

    セッションの削除
    ユーザーのセッション・データが完了したら、次の選択肢があります.
  • 特定のプロパティを削除します.public void removeAttribute(String name)メソッドを呼び出して、特定のキーに関連付けられた値を削除できます.
  • セッション全体を削除:public void invalidate()メソッドを呼び出してセッション全体を破棄できます.
  • sessionセッションの有効期限の設定:public void setMaxInactiveInterval(int interval)メソッドを呼び出して、sessionセッションのタイムアウトを個別に設定できます.
  • ユーザーのログアウト:servlet 2.4をサポートするサーバを使用している場合は、logoutを呼び出してWebサーバのクライアントをログアウトし、すべてのユーザーに属するすべてのセッションを無効に設定できます.
  • web.xml構成:Tomcatを使用している場合は、上記の方法に加えて、次のように、sessionセッションタイムアウトをweb.xmlファイルで構成できます.
  •   
        15
      
    
  • TIP:
  • Tomcatのデフォルトの30分タイムアウト時間.
  • getMaxInactiveInterval()メソッドは、セッションのタイムアウト時間を秒単位で返します.
  • Web.xmlでsessionセッションのタイムアウト時間を15分に設定すると、getMaxInactiveInterval()は900を返します.


  • 今日は特に卵が痛い問題にぶつかった.
    127.0.0.1アクセス可能、localhostアクセス不可の問題