【Jsp】第四课 会话管理与使用

概述

讲会话管理之前,我们这里举个小故事:小明和小王今天没有课,买了点瓜子,花生,啤酒,炸鸡在宿舍边吃边喝边聊天。

维持三个小时的聊天开始了,在这个过程中小明说一句,小王回一句,小王说一句,小明回一句,那么小明说一句,小王回一句这一个来回称为一次对话,维持三个小时的聊天中包含了无数次对话,称为一次谈话。

同比,小明比喻成浏览器,小王比喻成服务器,浏览器向服务器发出请求,服务器回复浏览器请求,这一个来回称为一次请求,那么在一段时间内的多次请求称为一次会话。 

问题:

那中途小李加入这次谈话的话,小李与小王之间的谈话称为第二个谈话。

因此这里可以总结出,一次会话表示:同一个浏览器在某一段时间内与服务器之间的多次请求。

问题

 以上是一个案例,及服务器当前遇到的问题,如果大家还是不能理解,那么这里在举个例子,这里我们把服务器当做包工头,多个浏览器当做工人。假设包工头今天需要十个工人干活,每个工人按小时付钱,那么每个工人今天所做的小时都不一样,问包工人最后采取什么办法能区分每一个工人最后各自工作了多少个小时?

这里显而易见的办法就是,包工头给每一个招进来的工人进行编号,贴上唯一编号的便利贴,并开始记录每一个员工的工作时长即可。

那回归我们的知识点中,也是一样的,服务器作为给浏览器提供服务的过程中,也是需要区分浏览器的。因此开始进入我们这一次的知识点,Jsp中给我们提供了两种区分浏览器的技术供我们使用。CookieSession对象。

Cookie的概念以及使用

Cookie 的本意是“小甜饼”,我们俗称“曲奇饼”
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。

当用户使用浏览器再去访问服务器的时候,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据

1.一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(name)和值(value)。
2.一个web网站可以给一个web浏览器发送多个cookie,一个浏览器也可以存储多个cookie。
3.浏览器一般只允许存放300个cookie,每个网站最多存放20个cookie,每个cookie的大小限制为4kb。
4.如果创建了一个cookie,并将他发送到了浏览器,默认情况下他是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。 

 Cookie中的方法_1

Cookie cookie = new Cookie(name, value);
创建 Cookie
ps:在Co okie中存储中文,需要转码解码
转码:URLEncoder.encode( value , "UTF-8") ;
解码:URLDecoder.decode(value , "UTF-8");
setMaxAge ()
设置 Cookie 的最大保存时间,单位秒,正值表示经过设定的秒值后, Cookie 将过期。负值表示不在客户机上保存 Cookie ,如果用户关闭浏览器时, Cookie 会被删除,默认设置。 0 值表示删除现有 Cookie
getMaxAge ()
返回以秒表示的Cookie的最大保存时间

Cookie中的方法_2

getName()
返回 Cookie 的名字
getValue()
返回Cookie名/值对中值的部分
setValue ( value )
给Cookie赋值

 Cookie中的方法_3

request.getCookies();
获取浏览器访问服务器时传递过来的cookie数组
response.addCookie(cookie);
将创建的Cookie添加到 r esponse对象中
这样服务器在输出 r esponse对象中的内容时就会把cookie也输出到客户端浏览器

禁用Cookie

        Cookie是存放在客户端的机器上面,如果客户端的浏览器出于安全方法的考虑,在浏览器的隐私设置中阻止了所有的 Cookie
        服务器就没有办法把一些信息写入到客户端,使用Cookie 就没有用了

 

实例代码如下:

package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;

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;

/**
 * Servlet implementation class Servlet1
 */
@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Servlet1() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		response.setCharacterEncoding("UTF-8");
		PrintWriter pw=response.getWriter();
		//当浏览器访问服务器的时候
		//获得浏览器发送过来的所有cookie
		Cookie[] cookies=request.getCookies();
		//Servlet循环遍历所有的cookie,直到找到服务器能识别的标识为止
		if (cookies!=null) {
			for (int i = 0; i < cookies.length; i++) {
				String name=cookies[i].getName();
				System.out.println(name+"---"+cookies[i].getValue());
				if (name.equals("tag")) {
					//当查找到正确的数据时,终止遍历
					//获取出来的中文数据,需要进行解码
					String value=URLDecoder
								.decode(cookies[i].getValue(),
										"UTF-8");
					pw.print(value);
					break;
				}
				
			}
		}
		
		//创建Cookie对象,存储的中文数据需要进行转码
		Cookie cookie=new Cookie("tag", 
				URLEncoder.encode("中国", "UTF-8"));
		//表示设置Cookie在浏览器内存中保留的时间,单位以秒计算
		//cookie.setMaxAge(300);
		response.addCookie(cookie);
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 给每一个第一次访问服务器的浏览器进行贴上唯一标签,这样浏览器便可区分浏览器,每一个浏览器访问服务器的次数即可统计。代码如下:

package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;

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;

/**
 * Servlet implementation class Servlet2
 */
@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
	private static final long serialVersionUID = 1L;
    int tag=0;
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Servlet2() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//默认为第一次访问
		boolean isFirst=true;
		response.setContentType("text/html");
		response.setCharacterEncoding("UTF-8");
		PrintWriter pw=response.getWriter();
		//检查当前访问服务器的浏览器是否是第一次
		Cookie[] cookies=request.getCookies();
		if (cookies!=null) {
		for (Cookie cookie : cookies) {
			//循环遍历该浏览器的所有cookie
			String name=cookie.getName();
			if ("tag".equals(name)) {
				isFirst=false;
				String value=URLDecoder
						.decode(cookie.getValue(), "UTF-8");
				pw.print(value);
			}
		}
	}
		if (isFirst) {
			//说明没有在该浏览器的所有cookie中找到服务器能识别的标识
			//该浏览器第一次访问服务器
			tag++;
			String text="当前浏览器是第"+tag+"个访问服务器的浏览器";
			Cookie cookie=new Cookie
					("tag",URLEncoder.encode(text, "UTF-8"));
			response.addCookie(cookie);
			pw.print(text);
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

Session的概念以及使用

HttpSession 对象
服务器为每个会话创建一个 HttpSession 对象
每个会话对象都有一个唯一的 ID
把用户的数据保存在相应的 HttpSession 对象内

程序第一次调用request.getSession()方法时就会创建一个新的session,可以用isNew()方法来判断session是不是新创建的。

session对象默认30分钟没有使用,服务器就会自动销毁session。

在web.xml中可以设置session的失效时间

当需要在程序中手动设置session失效时,可以手动调用session.invalidate()

Session中的方法

request.getSession()
获取 session 对象
如果 session 对象不存在,则创建一个新的,并返回
isNew()
判断 session 对象是新创建的,还是已存在的
session.invalidate ()
手动 摧毁session

SessionCookie的区别

Cookie是把用户的数据写给用户的浏览器。
Session技术把用户的数据写到用户独占的session中。

        Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象 

实例代码如下:

package com.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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;

/**
 * Servlet implementation class Servlet3
 */
@WebServlet("/Servlet3")
public class Servlet3 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Servlet3() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		response.setCharacterEncoding("UTF-8");
		PrintWriter pw=response.getWriter();
		//当浏览器第一次访问服务器的时候
		//需要获得session对象
		//requset会先查找服务器中是否有该浏览器对应的session对象
		//如果没有就创建Seesion对象,如果有就获得出来用
		//session对象只和浏览器有关,
		//只要浏览器不关闭,服务器中所有servlet都能共享数据
		HttpSession session=request.getSession();
		if (session.isNew()) {
			//将数据存储在session中
			session.setAttribute("a", "abc");
			//删除指定的数据
			//session.removeAttribute("a");
			//直接干掉session对象
			//session.invalidate();
			pw.print("当前浏览器是第一次访问,session对象刚刚被创建");
		}else {
			String v=(String) session.getAttribute("a");
			pw.print("当前浏览器不是第一次访问,session对象是很早就存在的"+v);
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

  • 26
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笔触狂放

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值