【Session简述】

* 在Web开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下),因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

【session和cookie的主要区别】

* Cookie是把用户的数据写到用户的浏览器。

* Session技术把用户的数据写到用户独占的session中。

[ Cookie的局限 ]

  1.Cookie只能存字符串类型,不能保存对象

  2.不能存中文,数据类型只能为非中文String。

  3.1个cookie的容量不能超过4KB。

  4.相对数据存放不安全

[ Session的特点 ]

  1.会话数据存放在服务器端(服务器内存),占用的是服务器资源。

  2.数据类型是任意的,没有大小的限制。

  3.相对安全。

【获取session】

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

【Session 使用核心技术】

HttpSession类:用于保存会话数据。

1.创建或得到HttpSession对象

  HttpSession request.getSession()

  HttpSession request.getSession(boolean create)

2.设置session对象

  void setMaxInactiveInterval(int interval) :设置session的有效时间(单位:秒)

  void invalidate():手动销毁session对象

  String getId():得到session的编号Id

3.保存会话数据得到Session对象

  void setAttribute(String name,Object value):保存数据

  Object getAttribute( String name ):获取数据

  void  removeAttribute(String name):清除数据

【Session原理】

1.服务器创建Session对象,分配一个唯一的标记(JSESSIONID),会话数据保存在Session对象中,然后服务器把JSESSIONID作为Cookie发送给浏览器保存。

  响应头:JSESSIONID=7EBC5D0B44D9D3DDE7FAD83C077E3D3E

2.浏览器得到JSESSIONID的cookie,保存在浏览器的目录中

3.浏览器在下次访问服务器的时候,带着JSESSION的cookie数据访问服务器。

  请求头:Cookie:JSESSIONID=7EBC5D0B44D9D3DDE7FAD83C077E3D3E

4.服务器得到JSESSIONID,在服务器内存中查询是否存在对应的编号的Session对象。

5.如果找到对应的Session对象,返回这个对象

6.如果找不到对应的Session对象,有可能返回null,也有可能是创建新的session对象(HttpSession session=request.getSession(); )

[核心的几个方法]

  HttpSession session=request.getSession();

1.创建Session对象

  Session session=new Session();

  Cookie cookie=new Cookie("JESSIONID","001");  //注意默认保存在浏览器内

  response.addCookie(cookie);

2.得到Session对象

  在服务器查询对应的JESSIONID的对象,返回session对象。

结论:浏览器通过JESSIONID(Session编号)在服务器中查询session对象

【session的几个细节】

1.setMaxInactiveInterval:设置Session对象的有效时间

  注意:并不是浏览器关闭,session就销毁!!

  默认情况:等待30分钟空闲时间,session对象才会销毁。

设置全局的Session对象的过期时间(分钟),如下:

<!--  设置全局的Session对象的过期时间(分钟) -->
<session-config>
<session-timeout> </session-timeout>
</session-config>

2.可以让JSESSIONID不会随着浏览器关闭而丢失!!

/**
* 设置JESSIONID的时间,不会随着浏览器的关闭而丢失!
*/
Cookie c=new Cookie("JESSIONID",session.getId());
c.setMaxAge(1*30*24*60*60); //1个月
response.addCookie(c);

3.直接手动销毁Session对象

invalidate();

4.创建或得到Session对象

request.getSession(); / request.getSession(true);     //创建或得到session对象,查询session对象,如果没有对应的session对象,就创建新的session对象。
request.getSession(false); //得到Session对象。查询session对象,如果没有直接返回null

【Session入门案例】

[SessionDemo00.java]  存储一个Session对象

package com.session.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; @WebServlet("/SessionDemo00")
public class SessionDemo00 extends HttpServlet {
private static final long serialVersionUID = 1L; public SessionDemo00() {
super();
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session=request.getSession();
session.setAttribute("name", "哈哈哈哈"
); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
} }

[SessionDemo01.java] 查询对应的Session对象

package com.session.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;

@WebServlet(
"/SessionDemo01")
public class SessionDemo01 extends HttpServlet {
private static final long serialVersionUID = 1L; public SessionDemo01() {
super();
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter(); HttpSession session=request.getSession();
String value=(String) session.getAttribute("name");
//输出获取的Session数据到浏览器
out.write("获得Session值是:"+
value);
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
} }

【运行结果】

[ 1.第一次访问SessionDemo00 ]

[ 2.然后访问SessionDemo01 ]

[ 隐藏问题:关闭对应的火狐浏览器,重新访问SessionDemo01,会出现以下情况 ]

【如何解决上面的而隐藏问题,我们希望所有浏览器所有页面后,访问ServletDemo01时仍能获取对应的Session】

[ ServletDemo00.java ] 需要在ServletDemo00中代码修改

package com.session.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; @WebServlet("/SessionDemo00")
public class SessionDemo00 extends HttpServlet {
private static final long serialVersionUID = 1L; public SessionDemo00() {
super();
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session=request.getSession();
    /*-------------------增加以下代码--------------------------*/
String sessionId=session.getId();
Cookie cookie=new Cookie("JSESSIONID",sessionId);
cookie.setPath("/HelloServlet");
cookie.setMaxAge(10*60); //有效期10分钟
response.addCookie(cookie); session.setAttribute("name", "哈哈哈哈"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
} }

[ 关闭浏览器所有页面后(首先访问过SessionDemo00),再次访问SessionDemo01后 ]

16_会话技术_Session的更多相关文章

  1. 16_会话技术_Session案例

    [购物车中的信息保存] [Book.java] package com.Higgin.shopping; public class Book { private String id; private ...

  2. 会话技术之Cookie 和 Session

    为什么要使用会话技术 会话从字面上来说就是,就是两个人说话,也就是两个人交流,那么这里说的是计算机web端的交流,因为互联网是基于HTTP传输信息的,而http传输是无状态协议,缺少状态,意味着如果后 ...

  3. 关于PHP中会话技术的知识点分享

    前言:在PHP中会话技术也是特别重要的,主要应用在免登录,保存一些持久化数据等等的方面,但是后期的介绍中,我将会放弃这种技术改用redis方法来替换这种方法. (一)cookie技术(即数据缓存在客户 ...

  4. php会话技术之Session用法

    php会话技术之Session用法举例. 本文原始链接:http://www.jbxue.com/article/8940.html1.创建session <?php     //创建sessi ...

  5. Django2.2 会话技术cookie session token的区别以及实例介绍

    一.区别: 本人见解:使用自定义数据项进行加密,作为唯一身份识别,登陆时写入cookie(session基于这个).在显示相关数据 1.cookie 属于客户端会话技术(数据存储在客户端) 默认的Co ...

  6. PHP会话技术

    由于HTTP协议是无连接.无状态的,所以HTTP协议无法记住客户端的信息.为了弥补HTTP协议的这两种不足,所以出现了会话技术. 1 Cookie技术 1.1 什么是Cookie 服务器端,将能够唯一 ...

  7. 16)用了session会话技术

    为什么用session会话技术? 因为假如你进入后台,不可能随意进入,即使你的验证通过了,那么还需要一个变量来存一个标志,假如标志的值是yes,那么我们可以直接进入后台的首页,无需验证,但是,标志是n ...

  8. 会话技术( Cookie ,Session)

    会话技术:    会话:浏览器访问服务器端,发送多次请求,接受多次响应.直到有一方断开连接.会话结束.        解决问题:可以使用会话技术,在一次会话的多次请求之间共享数据.           ...

  9. Java Web之会话技术

    客户端与服务器通信过程中,会产生一些数据.比如,A和B分别登陆了某宝购物网站,A买了一个Android手机,B买了一个iPhone手机,当结账时,web服务器需要分别对用户A和B的信息分别保存.根据J ...

随机推荐

  1. 锋利的jquery第二版学习笔记

    jquery系统学习笔记 一.初识:jquery的优势:1.轻量级(压缩后不到30KB)2.强大的选择器(支持css1.css2选择器的全部 css3的大部分 以及一些独创的 加入插件的话还可支持XP ...

  2. JAVA的设计模式之单例设计模式

    1.确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例. 1)理论 Java Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 使用Singl ...

  3. 【3D研发笔记】之【数学相关】(一):坐标系

    现在开始学习3D基础相关的知识,本系列的数学相关笔记是基于阅读书籍<3D数学基础:图形与游戏开发>而来,实现代码使用AS3,项目地址是:https://github.com/hammerc ...

  4. Oracle管道函数示例

    Oracle的管道函数需要定义下面的三样: Record/Object Type:定义一个Record或Object类型的变量,这个变量用于表示返回结果集的一行数据,有点像C#中的DataRow类. ...

  5. Android开发日志问题

    以前在Android开发中发现,日志打印好多,调试的时候各种加Log,之后就各种不删除,导致项目后期花大把时间删除日志打印. 学到一个好方法: 在所有尽可能高的父类里面加上一个常量 DEBUG ,一开 ...

  6. 补丁安装命令(WUSA)

    wusa windows6.1-kb2716513-x64.msu /quiet /norestart msxml4-kb2758694-enu.exe /quiet /norestart 安装.ms ...

  7. BZOJ 1143: [CTSC2008]祭祀river 最长反链

    1143: [CTSC2008]祭祀river Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...

  8. 【翻译自mos文章】DBA_JOBS 和 DBA_JOBS_RUNNING 不同的结果的解释

    DBA_JOBS 和 DBA_JOBS_RUNNING 不同的结果 參考原文: Different Results from DBA_JOBS and DBA_JOBS_RUNNING (Doc ID ...

  9. C++ Primer 学习笔记_95_用于大型程序的工具 --多重继承与虚继承

    用于大型程序的工具 --多重继承与虚继承 引言: 大多数应用程序使用单个基类的公用继承,可是,在某些情况下,单继承是不够用的,由于可能无法为问题域建模,或者会对模型带来不必要的复杂性. 在这些情况下, ...

  10. sql server char nchar nvarchar varchar之間的區別

    char存储固定长度的字符串,最大长度为8000个字节. varchar存储可变长度的字符串.最大长度为8000个字节. nchar存储固定长度的Unicode字符串,最大长度为4000个字符. nv ...