HttpSession服务器端会话技术

J2EE中的HttpSession总结:

①什么是session?

session是服务器端技术,利用这个技术,服务器在运行时可以为每一个浏览器创建一个共享的session对象,由于

session为用户浏览器独享,所以当浏览器访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户

再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

②session是如何创建的呢?

当用户打开浏览器,访问某个站点时操作session时,服务器就会查找改服务器内存中有没有创建该session对象,如果已经创建那么就通过sessionid值到web服务器中找到该session并使用,如果没有web服务器就会为该浏览器分配一个独享的session,为这个session设置一个sessionid标识,sessionid中包含了浏览器信息和session所属于web服务器下的web应用,然后将sessionid封装到response对象中响应给客户端,客户端将该值存储到cookie中,然后客户端在发出请求时会将该web应用下的cookie都带给web服务器,当要调用session时就通过cookie来找到对应的session。这里要注意的是session是客户端与服务器进行数据共享的一个对象,session虽然存储在web服务器内存中,并且与一个浏览器绑定了。但是web服务器下如果有多个web站点,默认情况下同一个浏览器访问一个web服务器下的不同web站点创建的是不同的session对象。服务器是如何实现一个浏览器在一个web应用下对应一个session如下图:

③session的生命周期默认是30分钟这个可以在web.xml文件中看到其配置的默认时间,也可以通过修改配置来设置session的生命周期。web服务器设置session的默认生命周期如图:

当然如果你修改的是web服务器的web.xml就会对所有web服务器下的所有web应用创建的session的生命周期生效。

如果你修改的是web应用的web.xml就会对当前web应用创建的session的生命周期生效。如果冲突了那么以web应用下设置的优先级更高。

当然还有两个函数可以影响session的生命周期

setInactiveInterval():Specifies the time, in seconds, between client requests before the servlet container will invalidate this session。指的是具体的时间参数是设置servlet容器将使session失效在客户端请求之前。也就是说 这个时间是设置session懒散的时间,在此时间中session没有被访问将会失效,如果被访问了那么就重置time值再次进入懒散状态。

Invalidate():Invalidates this session then unbinds any objects bound to it.

使这个session失效并且使session中绑定的对象都失效。

④session是一个域对象,其数据机构相当于一个map,也是以键值对的形式存储数据的。session中可以存放任何Object对象。同样在session中存储键名重复的值时,该值会被覆盖。

⑤上面我们已经说过session是存储在服务器端的,session在一次会话中有效,那么我们在关闭浏览器后,服务器于该浏览器关联的session有没有自动销毁呢?当然是没有,因为session存储在web服务器端,当浏览器关闭时,浏览器不会发送请求给web服务器,所以session还是在生命周期没有结束时,依然存在于web服务器的内存中。那么也就是说在session生命周期还没有结束时,我们关闭浏览器,再打开浏览器访问web服务器下的web应用,该session仍然是存在的。那么我们如何来获得这个之前被我的浏览器独享的session呢?其实很简单,因为把session和浏览器进行绑定的就是一个JSESSIONID的cookie,也就是说我们在第一次调用该session时就创建一个cookie键名为JSESSIONID的cookie并且把生命周期设置为和session的一样,然后通过response对象响应给浏览器,浏览器做存储这样每次浏览器发送请求都会带上这个cookie。这样就可以实现我们以上关闭浏览器再打开浏览器时,仍然能

访问之前浏览器独享的session。这里需要理解cookie的相关知识。如有不理解可以看看我之前写的cookie的总结:

http://blog.csdn.net/nihaowoshiyudong/article/details/53535183

java代码如下:

①创建session并且存储了JSESSIONID的cookie

package com.yd.servlet;

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;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class CreateSession
 */
@WebServlet("/CreateSession")
public class CreateSession extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public CreateSession() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		//第一次获得session时创建该session
		HttpSession session=request.getSession();
		session.setAttribute("name", "TomCat");
		//存储JSESSIONID这个cookie使其和session的生命周期一样
		Cookie cookie=new Cookie("JSESSIONID", session.getId());
		//设置cookie的生命周期
		cookie.setMaxAge(30*60);
		response.addCookie(cookie);
		//response.sendRedirect("/SessionTest/GetSessionServlet");
	}

	/**
	 * @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);
	}

}

浏览器接受的响应头如图:

②关闭浏览器

③再次打开浏览器发送请求同一web应用下的资源,java代码如下:

package com.yd.servlet;

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;

/**
 * Servlet implementation class GetSessionServlet
 */
@WebServlet("/GetSessionServlet")
public class GetSessionServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public GetSessionServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获得session中的属性
		request.setCharacterEncoding("utf-8");
		HttpSession session=request.getSession();
		String name=(String) session.getAttribute("name");
		System.out.println("关闭浏览器后显示的session内容:"+name+"id值"+session.getId());
		//显示的结果
		//关闭浏览器后显示的session内容:TomCat id值8B49F6CBD34BFDDEE43BA58912FA65D9
	}

	/**
	 * @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);
	}

}

请求信息头如下:

可见请求信息头的JSESSIONID和响应信息头的JSESSIONID的值一样。所以通过JSESSIONID就能找到浏览器独享的session,无论是否是一次会话,只要session生命周期没有结束,都可以访问到该session。

时间: 2024-11-06 22:00:24

HttpSession服务器端会话技术的相关文章

会话技术中的Cookie与session

关于会话技术 会话:一次会话中包含多次请求和响应. 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 功能:在一次会话的范围内的多次请求间,共享数据 方式: 客户端会话技术:Cookie 服务器端会话技术:Session Cookie: 概念:客户端会话技术,将数据保存到客户端 使用步骤: 创建Cookie对象,new Cookie(String name, String value) 绑定数据. 发送Cookie对象, response.addCookie(Cookie

会话技术Session&Cookie

一.会话技术简介 1.存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪     里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态.会话技术是帮助服务器   记住客户端状态(区分客户端) 举例购物过程: 2.会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话.会话技术就是记录这次会话中客户端的状态与数据的. 会话技术分为Cookie和Sessio

JavaWeb学习笔记五 会话技术Cookie&Session

什么是会话技术? 例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态.会话技术是帮助服务器记住客户端状态(区分客户端). 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话.会话技术就是记录这次会话中客户端的状态与数据的.会话技术分为Cookie和Session: Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端可以清除

Cookie&&Session会话技术之再体验

1.转发与重定向[****]    * 重定向:重新确定请求方向        * 发送者:服务器 --> 响应(response)浏览器        * 执行者:浏览器 --> 重新请求        * 跳转        * response.sendRedirect("/day04/1.html");        * //完全等价,隐藏了HTTP协议的具体要求        * response.setStatus(302);        * response

会话技术Cookie&Session

一.会话技术简介 1.存储客户端的状态 如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态.会话技术是帮助服务器    记住客户端状态(区分客户端) 2.会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话.会话技术就是记录这次会话中客户端的状态与数据的. 会话技术分为Cookie和Session: Cookie:数据存储在客户端本地,减少服务器

Java实战之04JavaWeb-03会话技术

一.会话技术简介 1.什么是会话,为什么需要会话技术? 会话:从打开一个浏览器,访问某个网站,到关闭这个浏览器的这个过程称为一次会话.http协议是状态的. 2.会话技术的分类 客户端存储技术:Cookie 服务端存储技术:Session Cookie和Session的区别? 1)存储在Cookie中的用户的信息 存在客户端,Session将数据存储在服务器端,但是需要在客户端存储Session的编码id 2)安全性而言 Cookie相对不安全 Session相对安全 3)性能而言:根据实际的情

JavaWeb学习之转发和重定向、会话技术:cookie、session、验证码实例、URLConnection使用(下载网页)(4)

1.转发和重定向 HttpServletResponse response 转发: RequestDispatcher dispatcher = request.getRequestDispatcher("/secondServlet"); request.setAttribute("pwd","123");//这里设置的值在secondServlet中可以获取到 dispatcher.forward(request, response);//调

会话技术cookie和session详解

什么是会话 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 会话技术解决了什么问题 每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据. 例如:用户点击超链接通过一个servlet购买了一个商品,程序应该保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户商品为用户结帐. 会话技术分类 会话技术会为两类 Cookie Cookie是客户端技术,程序把每个用户的数

会话技术Session

Session技术 Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间     存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内 存空间.所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客      户的唯一性标识JSESSIONID 在Session这我们需要学习如下三个问题: 怎样获得属于本客户端的session对象(内存区域)? 怎样向session中存取数据(session也是一个域对象)?