会话技术

一.会话技术

简介:
会话简单理解为:用户打开一个浏览器,点击多个超链接访问服务器的web资源,然后关闭浏览器,整个过程称为是一次会话。
使用场景:
每个用户与服务器进行交互过程中,产生一些各自的数据,程序想要把这些数据进行保存,就需要使用会话技术。
例如:用户点击超链接购买一个商品,程序应该保存用户所购买的商品,以便于用户点击结账可以得到用户所购买的商品信息
会话技术分类:

  • Cookie:
    Cookie是客户端技术,程序把每个用户的数据以cookie的形式保存到各自浏览器中。当用户使用浏览器再次访问服务器中的web资源的时候,就会带着各自的数据过去。这样,web资源处理的就是用户各自的数据了。
  • Session:
    Session是服务器端技术,利用这个技术,服务器在运行时为每一个用户的浏览器创建一个独享的session对象。由于session为用户浏览器独享,所有用户在访问服务器的时候,可以把各自的数据放在各自的session中,当用户再次访问服务器中的web资源的时候,其他web资源再从用户各自的session中取出数据为用户服务。

两种技术的实现原理:

  • Cookie:
    浏览器访问服务器的时候会将已有的cookie带着过去,此时可以使用request.getCookies():这个方法来获取请求中cookie所附带的信息,然后在完成操作之后再将带有新的数据的cookie发送到浏览器,此时使用response.addCookie(cookie)这个方法。这个时候就可以将处理过后的数据存储到浏览器上
    在这里有个注意事项:
    使用下面的方法可以实现数据的持久化。
		//在这里需要将用户名长久的存储,所以使用cookie对象
		Cookie cookie = new Cookie("rember", reuser.getUsername());
		//设置路径
		cookie.setPath("/anli01");
		//设置生存时间
		cookie.setMaxAge(60*60*12);
		//添加cookie
		response.addCookie(cookie);
  • Session:
    当浏览器第一次访问服务器时,将会创建一个新的Session空间,然后服务器会返回到浏览器Session-ID(唯一标识,相当于开锁的钥匙),它的方法相当于一个域,它包含域的所有方法.
    基于Cookie的,基于Cookie回写了一个Session的ID。

二.使用会话技术实现记录用户上次访问时间

代码:
编写Cookie工具类:

public class CookieUtil {
	//根据指定的name来找到指定的cookie
	public static Cookie getCookie(Cookie[] cookies,String sname){
		if (cookies == null) {
			return null;
		}else{
			//遍历整个cookie集,然后根据name来匹配
			for (Cookie cookie : cookies) {
				if (cookie.getName().equals(sname)) {
					return cookie;
				}
			}
			return null;
		}		
	}

}

创建一个Servlet类:CookieServlet:

public class CookieServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	    Cookie[] cookies = request.getCookies();
	    Cookie cookie = CookieUtil.getCookie(cookies, "lastDate");
	    if (cookie == null) {
			response.setContentType("text/html;charset=UTF-8");
			response.getWriter().println("欢迎使用");
		} else {
			response.setContentType("text/html;charset=UTF-8");
			String value = cookie.getValue();
			response.getWriter().println("上次登录的时间为"+value);
		}
	    
	    Cookie c = new Cookie("lastDate", new Date().toLocaleString());	
	    c.setPath("/myday17");
	    //设置生存时间
	    c.setMaxAge(60*30);
	    //当设置时间为0的时候就是相当于将这个Cookie销毁
	    //c.setMaxAge(0);
	    response.addCookie(c);	    
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

四.关于Cookie的使用

  • 一个Cookie只用标识一种信息,至少含有一个标识该信息的名称和值。
  • 一个web站点可以给一个浏览器发送多个Cookie。一个web浏览器可以存储多个web站点的Cookie。
  • 浏览器一般只允许存放300个Cookie,每个站点最多可以存放20个Cookie,每个Cookie的大小限制为4KB(老版本浏览器)。-----浏览器存放的Cookie的大小和个数是有限制的。
  • 如果创建了一个Cookie,并发送到浏览器,默认情况下它是一个会话级别的Cookie。用户退出浏览器就被删除。如果希望将这个Cookie存到磁盘上,需要设置有效时长调用setMaxAge(int
    maxAge)方法,以秒为单位的。
  • 需要手动删除持久性Cookie,可以将Cookie的有效时长设置为0.必须注意:删除Cookie时候,path必须一致,否则无法删除。
  • 删除cookie其实就是添加一个name重复的coolie。

五.两种会话技术的区别

  1. Cookie:
     Cookie保存的数据是有个数和大小的限制的。
     数据是保存客户端浏览器上(相对不是很安全)。
  2. Session
     Session没有个数和大小限制。
     数据是保存在服务器上(相对比较安全)。

六.Servlet的数据访问范围(域的范围)

  1. ServletRequest:
    请求范围
    创建:当用户向服务器发送一次请求,服务器创建一个request对象。
    销毁:当服务器对这次请求作出了响应,服务器就会销毁这个request对象。
    作用范围:一次请求。(转发就是一次请求)。
  2. HttpSession
    会话范围
    创建:服务器端第一次调用getSession()方法的时候。
    销毁:三种情况。
    Session过期,默认的过期时间30分钟(web.xml中配置)。
    非正常关闭服务器。(正常关闭服务器—session会被序列化)。
    手动调用session.invalidate();
    作用范围:一次会话(多次请求)
  3. ServletContext
    应用范围
    创建:服务器启动的时候创建,为每个web项目创建一个单独ServletContext对象。
    销毁:服务器关闭的时候,或者项目从服务器中移除的时候。
    作用范围:整个应用
  4. 注意:对于域对象都有一样的方法:
    存数据:
    void setAttribute(String name,Object value);
    取数据
    Object getAttribute(String name);
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值