JavaWeb研究ノート4:クッキー&セッション

1 - 要求の転送とリダイレクト

要求の転送
次のように要求を言葉で表現転送します:

request.getRequestDispatcher("login_success.html").forward(request, response);

強みと弱み:

1、アドレスが要求サーブレットのアドレスはOK 200を返していることを示す
ことは、ヘルプクライアントに内部サーバであるので、一度だけ要求の数、2は、フォローアップ作業を実行
3を、唯一のリソースパス自身のプロジェクトにジャンプすることができます
4、わずかに高い効率を、唯一の要求が実行されるので、
要求オブジェクト5、A上で使用することができます

リダイレクト
として文言リダイレクションは、以下のとおり方向変更(Reorient)即ちジャンプ位置パラメータを

response.sendRedirect("login_success.html");

強みと弱み:

図1に示すように、アドレスが最終パスそのリソースアドレスに表示される
2、リクエストの少なくとも二倍の数、最初の要求後にサーバは、第二の訪問を行い、302及びアドレス、アドレスに基づいてブラウザを戻します
3 、任意のパスに移動することができ、独自のプロジェクトファイルだけでなく、
図4に示すように、わずかに低い効率は、2つの要求行う
5を、後続の要求、一方はA上の未使用に要求に格納されたデータ、または要求を使用することはできませんそれは二つの異なる要求であるので、オブジェクト

リダイレクトについて、私が書いたものの前に:

response.setStatus(302);
response.setHeader("Location","login_success.html");

だから、今あなたが直接の代わりにラインを使用することができ
、よく理解リクエストとリダイレクトの事実を転送し、見えることがあります。
ここに画像を挿入説明

2-クッキーシンプルな導入と使用

実際には、小さなデータクライアントへのサーバーとは、クライアントに保存されている:クッキー
シナリオ:>自動ログイン、閲覧履歴、ショッピング・カート

Q:なぜ、クッキーを持っていますか?
A:通信はステートレスであるとき、HTTP要求はステートレス、クライアントとサーバです。実際には、第二の訪問の時には、クライアントは、サーバーは、クライアントが以前に前へのアクセスを持っていたことを知りません。私は、ユーザーがあるする前にクッキーは、企業レベルから言えば、実際には、データをそこに保存する必要があり、より良いユーザーエクスペリエンス、より良い相互作用[自動ログイン]を注文し、より良いコレクトユーザーの習慣[ビッグデータ]です。

クッキーの使用状況やアクセス:

response.setContentType("UTF-8");	//设置编码,否则响应在页面的中文会乱码
Cookie[] cookies = request.getCookies();	//获得Cookies,有可能为空对象
if(cookies==null){		//若为空对象则添加一次
	Cookie cookie = new Cookie("hpf","perfect");	//以key-value的形式保存
	response.addCookie(cookie);
	response.getWriter().write("Cookie添加成功!");
	System.out.println("Cookie添加成功!");
}else{
	for (Cookie cookie : cookies) {		//遍历
		String name = cookie.getName();
		String value = cookie.getValue();
		System.out.println("Cookie:"+name+"="+value);
	}
}

共通APIをクッキー:

//关闭浏览器后,cookie就没有了 ---> 针对没有设置cookie的有效期
//expiry: 有效 以秒计算。
//正值: 表示在这个数字过后,cookie将会失效。
//负值: 关闭浏览器,那么cookie就失效, 默认值是 -1
cookie.setMaxAge(60 * 60 * 24 * 7);	 //使用Cookie对象来设置,表示七天有效期
//cookie.setValue(newValue);	//赋值新的值
//用于指定只有请求了指定的域名,才会带上该cookie
cookie.setDomain(".itheima.com");
//只有访问该域名下的cookieDemo的这个路径地址才会带cookie
cookie.setPath("/CookieDemo");
3-クッキー最終を取得します。

ここでクッキーは、包括的な例である以下のコード(本体部):
login.htmlと:

<body>
	<h3>请登录</h3>
	<form action="Demo03">
		账号:<input type="text" name="username">
		密码:<input type="password" name="password">
		<input type="submit" value="登录">
	</form>
</body>

CookieUtil:

//获取指定name的Cookie
public static Cookie getCookie(Cookie[] cookies,String name){
	for (Cookie cookie : cookies) {
		if(cookie.getName().equals(name)){
			return cookie;
		}
	}
	return null;
}
//清空当前浏览器的Cookie
public static Cookie[] clearCookie(Cookie[] cookies,HttpServletResponse response){
	for (Cookie cookie : cookies) {
		cookie.setMaxAge(0);
		response.addCookie(cookie);
	}
	return cookies;
}

GetLastLoginTime:

response.setContentType("text/html;charset=UTF-8");
Date currenDate = null;
String currenTime = "";
String username = request.getParameter("username");
Cookie[] cookies = request.getCookies();
Writer writer = response.getWriter();
if(cookies!=null){
	//获取上一次登录的时间
	Cookie time = CookieUtil.getCookie(cookies, "time");
	if(time!=null){
		String value = time.getValue();
		writer.write("欢迎"+username+"登录,上一次的登录时间为:"+value);
		currenDate = new Date(System.currentTimeMillis());
		currenTime = currenDate.toLocaleString();
		time.setValue(currenTime);
		time.setMaxAge(60*5);
		response.addCookie(time);
	}else{
		CookieUtil.clearCookie(cookies,response);
		response.setHeader("refresh", "3;login.html");
		writer.write("Cookie已有数组,清空成功!");
	}
}else{
	currenDate = new Date(System.currentTimeMillis());
	currenTime = currenDate.toLocaleString();
	Cookie time = new Cookie("time", currenTime);
	time.setMaxAge(60*5);
	response.addCookie(time);
	response.setHeader("refresh", "3;login.html");
	writer.write("未找到Cookie,添加timeCookie成功!");
}

まとめと個人的な経験:
1、login.htmlをもっと言う、またはそう単純ではない
2、フィールド内に、setContentTypeこの方法ではなく、テキストの間違った操作を行う!!! / HTML;のcharset = UTF-8
3、この事ライター最高のオブジェクトを書き出すために、またはすべての時間を取得する
最初の上陸が、しかし、その空のutil、それを利用取り、前にそこにクッキーがあり、4を
5空の完成または完成加えるクッキーを、リフレッシュする必要がありますlogin.htmlとする
6を、コードはコードですが、それが出て1回の書き込みではなく、必ずしもバック、紆余曲折あり、あなたのアイデアを知っています!

4 - クッキー商品履歴

まず第一に、私はWebContentの中に置かれた商品のhtmlページを、ご用意しております。
第二に、その後のWebContentファイルに新しいJSPを作成し、product_list.jsp、JSPにHTMLに内容をコピーします。
その後、ジャンプアドレス、変更product_list.jspで商品に変更します。

思考プロセスレコード:
1、ユーザーがホーム商品のリストを入力し、商品が選択されていないが、ホームに今回初めて
2、ユーザーが商品を選択したが、製品IDを返すJSP、サーブレットは、ID記録クッキーに基づいて
3、ユーザーが最初ではありませんホームに時間が、他の商品をお選び、サーブレットは、クッキーの最後のidにこれを追加します

次のようにサーブレットのコード:

String id = request.getParameter("id");
Cookie[] cookies = request.getCookies();
Cookie history = CookieUtil.getCookie(cookies, "history");
if(history==null){//第一次进网站,没有cookie保存
	Cookie h = new Cookie("history",id);
	h.setMaxAge(60*1);
	//设置访问这个工程的时候,才带cookie过来
	h.setPath("/CookieDemo02");
	response.addCookie(h);
}else{//非第一次浏览,输出cookie并更新
	System.out.println(history.getValue());
	history.setValue(id+"#"+history.getValue());	//拼接Cookie
	history.setMaxAge(60*1);
	history.setPath("/CookieDemo02");
	response.addCookie(history);
}
//跳转到具体的info页面
response.sendRedirect("product_info.htm");

>最終的にはクラスに変換、サーブレットである - ここでは、JSP、AVAサーバページャは何をしています。これは、JSP、Javaコードで書くことができます。

  • 定義したグローバル変数
    <%のInt = 99;! %>
  • ローカル変数を定義します
    。<%int型、B = 999;% >
  • JSPページで、ディスプレイの値及びb
    <= %%>
    <%B =%>

次のようにJavaコードをproduct_list.jsp:

<% 
	Cookie[] cookies = request.getCookies();
	Cookie history = null;
	if(cookies==null){
		history = null;
	}else{
		history = CookieUtil.getCookie(cookies, "history");
	}
	String[] ids = null;
	//若history为空的话
	if(history==null){
%>
		<h1>您的浏览记录为空!</h1>
<%
	}else{
		ids = history.getValue().split("#");
		for(String id : ids){
%>
			<li style="width: 150px;height: 216;float: left;margin: 0 8px 0 0;padding: 0 18px 15px;text-align: center;"><img src="products/<%=id%>.jpg" width="130px" height="130px" /></li>
<%
		}
	}
%>

注:
最初のペア<%>、クッキーが判断されていない場合、それはとても裁判官に、nullポインタエラーを報告しますページを入力することが可能です。
ここでは、ディレクトリ製品の画像ファイルに入るために使用するIDです。
だから、上記のすべての機能コードの実装されている:ショッピングモールを入力し、項目を選択することができ、最終的に視聴履歴に能力

削除閲覧履歴を達成するために:
歴史の絵の下の最初のdivをH2、H2ネストされた<書き込みにA HREF =「ClearHistory」>をクリア閲覧履歴</ A >
次に、主なコードは次の通りされ、実際には非常に簡単ですClearHistoryを記述します。

Cookie[] cookies = request.getCookies();
Cookie history = CookieUtil.getCookie(cookies,"history");
Cookie cookie = new Cookie("history", "");
cookie.setMaxAge(0);
cookie.setPath("/CookieDemo02");
response.addCookie(cookie);
response.sendRedirect("product_list.jsp");

要約注:
1、0にクッキーが何のdeleteメソッド、唯一MAXAGEセットではありません削除
セット0に、意図は、ブラウザが閉じられた後にのみ明らかであるので、それはすぐに見ることができない2
3を、削除常にません削除うち、歴史における一般的な、またはないように注意し、十分に、非最初のブラウジングあなたはクッキーを追加するときに、パスを設定するのを忘れクッキーにつながるが、後から追加されていない/ CookieDemo02以下で、フォーカス!

クッキー概要:
  1. クッキーは、サーバからクライアントへのデータの小さな部分を送信し、クライアントに保存されています

  2. クッキーを取得し、クッキーを追加

    request.getCookie();
    response.addCookie();
    
  3. クッキー分類
    セッションCookie
    によってデフォルト、ブラウザを閉じ、クッキーが消えます

    クッキーの持続
    時間をかけて、彼らは有効であり、クライアントに保存されます

    cookie.setMaxAge(0); //设置立即删除
    cookie.setMaxAge(100); //100 秒
    
  4. クッキーのセキュリティ問題
    クッキーによる1は、クライアントに保存されますので、安全性に問題がある
    セッションの導入に> -この問題を解決するために、クッキーの大きさと数が限られている、2、および

5セッションのプレゼンテーションおよび使用するのは簡単

セッションセッションはクッキーのメカニズムに基づいて
クッキーの類似点とセッションとの違い:
クッキーは、サーバからクライアントに返されたデータのごく一部であり、クライアントに保存され、データはセッションですが、サーバ側に保存されています

セッションの共通API:

//得到会话ID
String id = session.getId();
//存值
session.setAttribute(name, value);
//取值
session.getAttribute(name);
//移除值
session.removeAttribute(name);

セッションのライフサイクル:
創造:でrequest.getSession()を呼び出し、サーブレットで、この方法は、それがセッションを作成した場合
破壊:でもブラウザ、セッションオフ、セッションデータをサーバのメモリに保存されているのも、破壊しない
:方法を破壊し
、サーバのシャットダウン、1を
2に、セッションのセッション時間の期限が切れ、および期間の終了ようにします。デフォルトでは30分間有効です。

6-セッションは、ページカートを達成します

セッションカート(分析)の例:
1、この例のデータ・ストレージ・カートはまた、クッキーなど、より多くのセキュリティセッションと上で行うことができます
2、最初の一般的な構造:製品ページ- > Count.Servlet->請求ページ
3、第二は、馴染みの方法の使用するセッションと缶の内側であります

セッション・カートの例(ページ表示):
product_list.jsp:

<body>
	<h1>请选择以下商品购买!</h1>
	<a href="Count?id=0"><h3>iphone7</h3></a>
	<a href="Count?id=1"><h3>小米10</h3></a>
	<a href="Count?id=2"><h3>华为p30pro</h3></a>
	<a href="Count?id=3"><h3>魅族3</h3></a>
	<a href="Count?id=4"><h3>联想y7000p</h3></a>
	<a href="Count?id=5"><h3>戴尔外星人</h3></a>
</body>

カウント:

response.setContentType("text/html;charset=utf-8");
String[] names = {"iphone7","小米10","华为p30pro","魅族3","联想y7000p","戴尔外星人"};	//所有的商品名
Integer id = Integer.parseInt(request.getParameter("id"));		//获取传过来的id
String name = names[id];	//取出id所对应的商品名
Writer writer = response.getWriter();	//获取输出流
HttpSession session = request.getSession();		//获得Session
Map<String, Integer> cart = (Map<String, Integer>)session.getAttribute("cart");
if(cart==null){	//以大化小,先化大的
	cart = new LinkedHashMap<String, Integer>();
	request.getSession().setAttribute("cart", cart);
}
if(!cart.containsKey(name)){	//第一次选择商品,并且购物车里面没东西
	cart.put(name, 1);
}else{	//不是第一次选择商品,要叠加数量并显示
	cart.put(name, (cart.get(name)+1));
}
writer.write("<a href='product_list.jsp'><h2>继续购物</h2></a>");
writer.write("<a href='cart.jsp'><h2>进行结算</h2></a>");

cart.jsp:

<body>
	<h1>以下为所选商品以及数量</h1>
	<%
		Map<String,Integer> cart = (Map<String,Integer>)request.getSession().getAttribute("cart");
		for(String name : cart.keySet()){
	%>
		<h3>商品名:<%=name %>	数量:<%=cart.get(name)%></h3>
	<%
		}
	%>
		<a href="ClearCart"><h2>清空购物车</h2></a>
</body>

セッション・カートの例(空のカート):

HttpSession session = request.getSession();
//写法二:移除整个session
session.invalidate();

//写法一:移除cart这个map
session.removeAttribute("cart");
response.sendRedirect("cart.jsp");

カートの概要例:
1はそう、彼らはより良い多くの恩恵を受け、クッキーやセッションの使用方法を理解することを
強化し、未熟練と統合されました上で地図を利用して、2
財のコードを追加し、3を、私が学んだカウント大化小さなアイデアは、大(カート)の判断を入れ、小さな(アドオン)を行う
4を、<%>用途は、強化されていると徐々に書き込みJSPページのコードに使用される、foreachループもされています強化
5を、基礎となるWebプロジェクトの実装では、深い理解と発展して、そして彼らの努力に感謝しています!

公開された15元の記事 ウォン称賛18 ビュー4575

おすすめ

転載: blog.csdn.net/oZuoShen123/article/details/105096255