对Session运用的实战与原理剖析详解

Posted 上进小菜猪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对Session运用的实战与原理剖析详解相关的知识,希望对你有一定的参考价值。

@[toc]

一.Session基础

1.1什么是Session?

Session是基于Web服务器的状态保持的一种方法。

  • 服务器将为每个用户(浏览器)创建一个Session对象。
  • 一个Session独占浏览器。只要浏览器未关闭(Tomcat未打开或JSSessionID未清除)(关闭网页不影响),Session就存在。
  • 用户登录后,可以访问整个网站!–>保存用户信息。

1.2 Session和的区别?

Cookie原理图如下:

  • Cookie把用户的数据给到用户的游览器,只有游览器本地保存(它可以保持多个)

  • Session把数据写个服务器端的用户对应的Session中,每个用户独占一个。(保存重要的信息,避免浪费服务器的资源)

    Session原理图如下:

    二.Session保持会话实战

1.我们可以在之前cookie项目过程下,新建类名为:SessionDemo01的工程类。

2.继承HttpServlet,重写doGet,和doPost,并且将doPost直接调用doGet。

3.在doGet重写方法中,先设置编码格式,防止中文乱码出现。

req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");

4.得到Session:

 HttpSession session = req.getSession();

5.给Session里存入东西。

session.setAttribute("name","菜猪");

6.获取到Session的id值:

String id = session.getId();

7.写一个判断,让Session存在于Session不存在分别输出俩种不同的提示文字:

if(session.isNew())
    resp.getWriter().write("session创建成功"+id);
else 
    resp.getWriter().write("session已经存在了"+id);

8.给上面新建的Session类注册一个url,以及写一下映射:

<servlet>
    <servlet-name>session01</servlet-name>
    <servlet-class>com.gowork.servlet.SessionDemo1</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>session01</servlet-name>
    <url-pattern>/se1</url-pattern>
</servlet-mapping>

9.启动服务器,打开游览器,查看结果如下:

我使用了一个没有访问过的某狐游览器,第一次访问得到如下截图:

之后刷新,打开新的标签页以及关闭游览器再次打开,都是出现这个页面:

我们换一个游览器,出现下面页面,我们对照来看;

我们看上图,发现,俩个游览器同时访问该url,得到的Session的id不一样,这恰恰的验证了最开始的Session的特性:

我们在当前页面中,按f12,发现:我们写的是Session,为什么会出现Cookie呢?

我们来看一下Session创建的时候,做了一个什么事情。

Cookie jsessionid = new Cookie("JSESSIONID", id);
resp.addCookie(jsessionid);

在Session创建的时候相当于创建了应该Cookie对象,把Session的id值放到了里面。

2.1 Session跨servlet使用

1.新建一个类,类名为SessionDemo2。

2.和上面一样,先继承HttpServle,t重写doGet,和doPost,并且将doPost直接调用doGet。

3.获取Session,设置字符编码:

req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
HttpSession session = req.getSession();

4.获取Session里name的值,并且输出到控制台:

String naem = (String) session.getAttribute("name");
System.out.println(naem);

5.启动服务器,游览器先访问se1,然后再访问se2:

上图,我们可以看出,在类SessionDemo2可以获取到SessionDemo1中session里key名为name的值,并且输出。

2.2 Session存储多种类型

1.我们新建一个person类:

private String name;
private int age;

2.然后有参构造函数:

我们使用快捷键

public person(String name, int age) 
    this.name = name;
    this.age = age;


public String getName() 
    return name;


public int getAge() 
    return age;


public void setName(String name) 
    this.name = name;


public void setAge(int age) 
    this.age = age;


@Override
public String toString() 
    return "person" +
        "name=" + name + \\ +
        ", age=" + age +
        ;

3.我们在SessionDomo1里new一个person对象。

session.setAttribute("name",new person("caizhu",1));

4.在SessionDomo2输出person对象:

person naem = (person) session.getAttribute("name");
System.out.println(naem.toString());

5.结果检验:

2.3 注销Session

创建SessionDomo3。

注销Session只需要一句代码,如下:

HttpSession session = req.getSession();
session.removeAttribute("name");
session.invalidate();

测试:

当前ID为:D142028FFFD305DBEE37C8FF22565EAA

访问se3,执行删除Session。再次访问Se2,因为Session被删除,se2会空指针报错:

再次访问se1:

现在的ID变为:D11FAC1C9F215D26E53FEB3FBB9D0826

值已经改变了,说明之前对Session的删除是有效的。

2.3.1设置Session的失效时间

这里的session-timeout里的数字的单位是分钟。下文的代码代表着,15分钟之后Session失效。

<seeson-config>
    <session-timeout>15</session-timeout>
</seeson-config>

以上是关于对Session运用的实战与原理剖析详解的主要内容,如果未能解决你的问题,请参考以下文章

Redis实战和核心原理详解使用Spring Session和Redis解决分布式Session跨域共享问题

[动态规划-背包问题入门] 原理,运用,实战

Java并发编程原理与实战十九:AQS 剖析

JavaWeb实战之Response重定向运用以及原理详解

Web协议详解与抓包实战:HTTP1协议-请求与响应的上下文

详解 WebSocket 原理,附完整的聊天室实战 Demo