微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

一.Session基础

1.1什么是Session?

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

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

1.2 Session和的区别?

Cookie原理图如下:

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

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

    Session原理图如下:

    image-20220824182654841

二.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.启动服务器,打开游览器,查看结果如下:

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

image-20220824150040933

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

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

image-20220824150246943

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

  • 服务器将为每个用户(浏览器)创建一个Session对象。
  • 一个Session独占浏览器。只要浏览器未关闭(Tomcat未打开或JSSessionID未清除)(关闭网页不影响),Session就存在。

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

image-20220824152217991

我们来看一下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:

image-20220824162306733

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

2.2 Session存储多种类型

1.我们新建一个person类:

private String name;
private int age;

2.然后有参构造函数

我们使用快捷键

有参构造方法:alt+ins选择Constructor
无参构造方法:alt+ins选择Constructor然后选择下方的SelectNone

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.结果检验:

image-20220824164933986

2.3 注销Session

创建SessionDomo3。

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

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

测试:

image-20220824171804889

当前ID为:D142028FFFD305DBEE37C8FF22565EAA

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

image-20220824171935474

再次访问se1:

image-20220824171955333

现在的ID变为:D11FAC1C9F215D26E53FEB3FBB9D0826

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

2.3.1设置Session的失效时间

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

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

原文地址:https://www.jb51.cc/wenti/3281770.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐