サーブレットセッション追跡の基本


序文

提示:这里可以添加本文要记录的大概内容:

Web アプリケーションでは、セッション トラッキングは、異なるページ間でのユーザー アクティビティを追跡するために、クライアントとサーバー間の永続的な接続を維持する技術です。

サーブレット セッションの追跡は、次の方法で実装できます。

  1. Cookie: サーブレットは、クライアント側の Cookie に一意の識別子を保存して、リクエストごとにユーザー セッションを追跡できます。

  2. URL 書き換え: サーブレットは URL に一意の識別子を追加して、リクエストごとにユーザー セッションを追跡できます。

  3. 非表示のフォーム フィールド: サーブレットはフォーム フィールドに一意の識別子を追加して、リクエストごとにユーザー セッションを追跡できます。

  4. HttpSession オブジェクト: サーブレットは HttpSession オブジェクトを使用して、サーバー側でユーザーのセッション状態を維持できます。各セッション オブジェクトには一意の識別子があり、これによりサーバー側でユーザー セッションを追跡できるようになります。


提示:以下是本篇文章正文内容,下面案例可供参考

クッキーインスタンス

Cookie をフロントエンドに送信する準備をします。

import java.io.IOException;
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;
@WebServlet("/cookie1")
public class SendCookieToClientServlet extends HttpServlet{
    
    
	//动态项目      没有去 其他下找 web
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
		System.out.println("准备发送cookie给客户端");
		Cookie cookie = new Cookie("login", "zhangsan");
		cookie.setMaxAge(60*60*24*7);  //单位是:秒,这里是7天
		resp.addCookie(cookie);
		
	}
}

プロジェクトを実行します。
ここに画像の説明を挿入
コードが有効になり、Cookie がクライアントに送信されることを意味します。

クライアントの Cookie を取得します。

import java.io.IOException;
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;

@WebServlet("/cookie2")
public class ReciveCookieFromClinetServlet extends HttpServlet{
    
    
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
		System.out.println("获取客户端的cookie");
		Cookie cookiesCookie [] = req.getCookies();
		for (int i = 0; i < cookiesCookie.length; i++) {
    
    
			Cookie cookie = cookiesCookie[i];
			System.out.println(cookie.getName()+"-"+cookie.getValue());
		}
	}
}

サーバーを再起動し、コンソールをクリアし、Web ページを実行して
ここに画像の説明を挿入
Cookie テクノロジー コアにリンクします。初めてアクセスすると、サーバーは有効期間内にいくつかの Cookie 情報を送信してクライアントに保存します。同じクライアントが別のリクエストをサーバーに送信すると、デフォルトで Cookie がサーバーに送信されます。

クッキーの欠点

セキュリティが低い
互換性の問題
適時性の問題
ストレージ容量の制限

クッキーケースコード

[例 1: サーブレットからクライアントに Cookie を保存する]

//SetCookie Servlet
Cookie c=new Cookie("season","spring");
c.setMaxAge(30);
response.addCookie(c);
Cookie d=new Cookie("nextseason","summer");
d.setMaxAge(10);
response.addCookie(d);

【例2:クライアント側でCookieを読み取る】

//getCookie.jsp
<%
Cookie[] a=request.getCookies();
for(int i=0;i<a.length;i++)
{
    
    
out.println(a[i].getName()+:"+a[i].getValue()+"<br>");
}
%>

【例3:Cookieカウントを使用する場合】

//visitCount.jsp计数次数
<%@ page contentType="text/html;charset=UTF-8" %>
<%int count = 0; 
 Cookie[] cookies = request.getCookies(); / / 得到所有的Cookie
if(cookies != null) {
    
     
   for(int i=0; i<cookies.length; i++) {
    
    
       if(cookies[i].getName().equals("Counter"))
            count = Integer.parseInt(cookies[i].getValue());  //获取Counter以前值
   }  }
count++;
if(count == 1)
   out.println("欢迎首次光临");
else 
  out.println("您已经光临了" + count+"次");
// 将新的count写入客户端
Cookie c = new Cookie("Counter", ""+count);
c.setMaxAge(60*60*24*365);       // Cookie 的有效期为 1 年
response.addCookie(c); %>

【例4:Cookieを削除する】

//cookie remove.jsp
<%
int count=0;
// 将新的count写入客户端
Cookie c = new Cookie("Counter", ""+count);
c.setMaxAge(0);       // Cookie 的有效期为 0
response.addCookie(c); %>

【例5:ショッピングカートログイン実験 1.ホームページからショッピングカートページに入る】

//首页home.html
<a href="cart.jsp">购物车</a>
<a href=”remove.jsp”>删除计数cookie</a>

[例5: ショッピングカートのログイン実験、2. ショッピングカートのページで、まずユーザーがログインしているかどうかを判断し、そうでない場合はログインページlogin.htmlにジャンプします]

//购物车  cart.jsp
<h1>购物车</h1>
<%int count = 0; 
 Cookie[] cookies = request.getCookies(); // 得到所有的Cookie
if(cookies != null) {
    
     
   for(int i=0; i<cookies.length; i++) {
    
    
       if(cookies[i].getName().equals("Counter"))
            count = Integer.parseInt(cookies[i].getValue());  //获取Counter以前值
   }  }
 
if(count==0)response.sendRedirect(request.getContextPath()+"/login.html");
%>
//login.html
<h1>用户登录</h1>
	<form action="visit.jsp" method="post">
		用户名<input type="text" name="user"><br><br>
		密码
		<input type="password" name="password"><br>		
		<input type="submit" value="提交">
	</form>
//visit.jsp
<%int count = 0; 
 Cookie[] cookies = request.getCookies(); // 得到所有的Cookie
if(cookies != null) {
    
     
   for(int i=0; i<cookies.length; i++) {
    
    
       if(cookies[i].getName().equals("Counter"))
            count = Integer.parseInt(cookies[i].getValue());  //获取Counter以前值
   }  }
 
count++;
if(count == 1)
  response.getWriter().println("欢迎首次光临");
else 
  response.getWriter().println("您已经光临了" + count+"次");
 
// 将新的count写入客户端
Cookie c = new Cookie("Counter", ""+count);
c.setMaxAge(60*60*24*365);       // Cookie 的有效期为 1 年
response.addCookie(c); 
response.sendRedirect(request.getContextPath()+"/cart.jsp");
%>

セッション

Session を使用して、セッションのログイン状態を維持します。

  1. 最初のリクエストが行われると、サーバー側で Session オブジェクトが作成され、このオブジェクトの sessionId が生成されます。
  2. 同時に、Cookie を使用してこの sessionId をクライアントに返し、クライアントの Cookie に保存します。
  3. クライアントが次のリクエストを開始するときは、この sessionId を伝えてサーバーに送信する必要があります。
  4. サーバーは受信した sessionId に基づいて Session オブジェクトを取得し、最後のリクエストの情報を取得します。

StoreDataServlet クラスの作成: User オブジェクト (ユーザー情報を表す) を HttpSession に保存するために使用されます。

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;
import com.sun.org.apache.bcel.internal.generic.NEW;
import po.User;
@WebServlet("/store")
public class StoreDataServlet extends HttpServlet{
    
    
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
		HttpSession session = req.getSession();
		session.setAttribute("login", new User(1,"二哈喇子","吃饭快"));
	
	}
}

ユーザー クラスの作成: ユーザー ID、ユーザー名、ロールなどのユーザー エンティティを表します。

public class User {
    
    
	private Integer id;
	private String name;
	private String role;
	public User() {
    
    
		super();
		// TODO 自动生成的构造函数存根
	}
	public User(Integer id, String name, String role) {
    
    
		super();
		this.id = id;
		this.name = name;
		this.role = role;
	}
	@Override
	public String toString() {
    
    
		return "User [id=" + id + ", name=" + name + ", role=" + role + "]";
	}
	
}

GetDateServlet クラスを作成します。これは、保存されている User オブジェクトを HttpSession から読み取り、コンソールに出力するために使用されます。

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("/get")
public class GetDateServlet extends HttpServlet{
    
    
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
		HttpSession session = req.getSession();
		System.err.println(session.getAttribute("login"));
		
	}
}

この Web アプリケーションは、Servlet API に基づくセッション管理機能、つまりユーザーのセッション情報をサーバー側で保存および管理する機能を実装します。ユーザーがログインすると、ユーザー情報が HttpSession オブジェクトに保存され、ユーザー セッション中に、この情報に他のサーブレット クラスまたは JSP ページがアクセスして使用できるようになります。セッション管理テクノロジーにより、Web アプリケーションはユーザーのステータスをより便利に管理および制御できるようになり、アプリケーションのセキュリティと信頼性が向上します。

サーバーを再起動し、コンソールをクリアし、Web ページでリンク ストアを実行し、
ここに画像の説明を挿入
取得パスを実行してリンク ストアを取得します。
ここに画像の説明を挿入

セッションの作成と破棄

セッションの作成

メソッドを呼び出してrequest.getSession()この Session オブジェクトを取得します

  1. パラメータなし: getSession()Session オブジェクトがある場合は一部を返し、ない場合はサーバーに新しい Session オブジェクトを作成させます。
  2. パラメータあり: パラメータ付きのブール型を渡します。true の場合、パラメータなしと同じ効果があります。false の場合、Session オブジェクトが見つからない場合、新しいオブジェクトは作成されず、null が返されます。

getSession メソッドを呼び出さないとセッションは作成されません。

セッションの破棄

セッションが破棄される状況は 2 つだけです。
1 つ目: セッションが session.invalidate() メソッドを呼び出します。
2 番目: 前後 2 つのリクエストが、セッションで指定されたライフサイクル時間を超えました。

デフォルトでは 15 分で破壊されますが、アクティブに破壊することもできます

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;
//单词多个r
@WebServlet("/destroy")
public class DestroySessionServlet extends HttpServlet{
    
    
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
		HttpSession session = req.getSession();
		session.invalidate();
	}
}

サーバーを再起動し、コンソールをクリアし、Web ページ上のリンクを順番に実行して
ここに画像の説明を挿入
ここに画像の説明を挿入
から、destroy を実行して破棄します。

最後に、get を実行して
ここに画像の説明を挿入
タイムアウトの破棄を取得します。
画像の説明を追加してください

    <session-config>
    	<session-timeout>30</session-timeout>
    </session-config>

タイムアウト破壊テスト後にコードを削除する

セッションとクッキーの違い

1. Cookie はブラウザまたはローカルに保存できます。セッションはサーバー上にのみ存在できます。2. セッションは
任意の Java オブジェクトを保存できます。Cookie は String 型のオブジェクトのみを保存できます。これはサーバー
のメモリ サイズに関係します

違う

保存場所: Cookie はオフライン ストレージに属するクライアントのハードディスクに保存され、セッションはサーバーのメモリに保存されます。

生存時間: Cookie はクライアントに長期間保存できます。特定の生存時間は、setMaxAge() メソッドで指定された値によって決まります。セッションは、ユーザーがサーバーにアクセスすると生成され、クライアントがタイムアウトするかオフラインになると消滅します。

セキュリティ: Cookie はクライアント側に保存され、不純な動機を持つ Web サイトによって読み取られる可能性があります。セキュリティは劣りますが、セッションはサーバーのメモリに保存され、ユーザーが変更することはできず、クライアントのブラウザを閉じると消去されます。セキュリティはより優れています。

接続

Cookie であっても、セッションの非表示オブジェクトであっても、ブラウザは Cookie をサポートする必要があり、Cookie は無効になっていません。

セッションはサーバー側のメモリに保存されますが、クライアントとサーバー間のセッション状態管理を実現するには、クライアントのブラウザは Cookie 内のセッション ID によって自身を識別し、その ID をサーバー上のセッションにバインドする必要があります。
したがって、Session と Cookie は実際には相互に関連しており、通常、この 2 つは一緒に使用されます。

おすすめ

転載: blog.csdn.net/rej177/article/details/131752692