Session详解(重点)

这篇具有很好参考价值的文章主要介绍了Session详解(重点)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是Session:

(1)服务器会给每一个用户(浏览器)创建一个Session对象

 比如我们现在都去访问百度,我们使用双核浏览器和谷歌浏览器同时访问百度这个网址,百度那边会有两个session,因为浏览器不一样,但是只要在一个浏览器里面一直用百度的话,就没有区别。我们用两个浏览器相当于是模拟两个客户端。

Session详解(重点)

 (2)一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在。

(3)用户登录之后,整个网站它都可以访问。(保存用户的信息、保存购物车的信息)

比如我们登录csdn之后,csdn网站上的内容都可以进行点击,不用重复登录。可以访问该用户权限下的所有网页。

Session详解(重点)

如果退出用户之后,其中的好多页面都需要我们进行登录之后才可以使用。

 Session和Cookie的区别:

首先我们进行创建一个session类:然后再按住ctrl键的同时点击HttpSession。我们进入Session的源码界面,点开Struct进行查看:
Session详解(重点)

 进入源码界面如下所示:
Session详解(重点)

 我们进行分析源码:
得到一个唯一的标识符:

 public String getId();

获得ServletContext:(web对象几乎都可以获得ServletContext,ServletContext代表整个web服务)

public ServletContext getServletContext();

得到一个节点:(获得这个名字)

public Object getAttribute(String name);

有get就有set:(设置值的方法)

 public void setAttribute(String name, Object value);

移除一个指定的属性:

public void removeAttribute(String name);

判断是否是新的:

 public boolean isNew();

注销:

  public void invalidate();

 setAttribute可以存很多东西 ,Object代表对象,可以存一个对象。

Session详解(重点)

我们设计代码如下所示:

我们在设计代码的过程中,需要重写doGet和doPost方法,因为httpServlet中的doGet和doPost方法只有原生的req和resp,实现页面的数据交互的本质是重写方法,操作req和resp。

package com.rgf.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        req.setCharacterEncoding("utf-8");
        //响应
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //得到Session
        HttpSession session = req.getSession();
        //给Session中存东西
        session.setAttribute("name","蕾峰编程");

        //获取session的ID
        String sessionId = session.getId();

        //判断Session是不是新创建的
        if(session.isNew()){
            resp.getWriter().write("session创建成功,ID:"+sessionId);
        }else {
            resp.getWriter().write("session已经在服务器中存在了,ID:"+sessionId);
        }


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

我们进行设计web.xml:

 <servlet>
        <servlet-name>SessionDemo01</servlet-name>
        <servlet-class>com.rgf.servlet.SessionDemo01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionDemo01</servlet-name>
        <url-pattern>/s1</url-pattern>
    </servlet-mapping>

运行之后界面如下所示:

Session详解(重点) session之所以已经存在了,是因为tomcat启动的时候自动访问了该站点,所以就已经存在了

我们点开开开发者工具进行查看:
Session详解(重点)

我们发现在请求的时候我们带了一个Cookie, 

session其实是浏览器访问此服务器任何一个页面的时候都自动创建的,所以我们在访问了其他页面后,在访问session页会发现已存在。

我们进行单独对象进行分包的时候,一个实体类,两个关键词。即为entity(又叫pojo)最原始的java类

我们进行分包如下所示:
Session详解(重点)

 我们点击Compact Middle Packages,如下所示:

Session详解(重点)

之后我们创建pojo包,在该包下进行创建实体类:
Session详解(重点)

 之后我们再创建一个类,进行提取session里面的东西:由于我们已经再SessionDemo01里面已经在session里面添加了东西,现在我们利用sessionDemo02进行提取session里面的东西:

我们所设计的代码如下所示:

package com.rgf.servlet;

import sun.net.httpserver.HttpServerImpl;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        req.setCharacterEncoding("utf-8");
        //响应
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //得到Session
        HttpSession session = req.getSession();
        //从Session中取出东西,我们将其new一个对象,然后出现Object,我们进行强制转换,点击alt+enter。
        String name = (String) session.getAttribute("name");

        System.out.println(name);


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

我们在web.xml里面进行注册:

 <servlet>
        <servlet-name>SessionDemo02</servlet-name>
        <servlet-class>com.rgf.servlet.SessionDemo02</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionDemo02</servlet-name>
        <url-pattern>/s2</url-pattern>
    </servlet-mapping>

我们进行运行之后,发现如下所示:

Session详解(重点)

出现空白,这个时候我们在控制台进行查看的时候,发现输出为null。

我们先进行访问 http://localhost:9571/Cookie_war/s1 的时候,之后再进行访问http://localhost:9571/Cookie_war/s2的时候,这个时候我们发现控制台输出我们在s1里面的session存入的东西。

Session详解(重点)

 我们进行创建了Person类,如下所示:

package com.rgf.pojo;

public class Person {
    private  String name;
    private int age;
    //有参无参构造:Constructor
    //有参构造:
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
//无参构造:Select None
    public Person() {
    }

    //ctrl+o为重写方法
//鼠标右键Generate,进行重写get和set方法。
    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    //为了调试输出方面,还会加toString:
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}



我们在sessionDemo01该类里面存入session的代码修改如下所示:

 //        //给Session中存入东西
        session.setAttribute("name",new Person("蕾峰编程",22));

之后再SessionDemo02里面往出取session的代码如下所示:

   Person person = (Person) session.getAttribute("name");
       // public String toString()返回该对象的字符串表示。
        // 通常,ToString方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。
        System.out.println(person.toString());

session不仅可以存字符串,也可以存用户的信息。

我们进行运行之后,如下所示:
Session详解(重点)

 我们发现对象也可以往里面存,也可以从里面取出来。

我们必须先进行再SessionDemo01里面进行存之后才能再SessionDemo02里面进行取。

我们进行注销session,我们所设计的代码如下所示:
 

package com.rgf.servlet;

import com.rgf.pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        req.setCharacterEncoding("utf-8");
        //响应
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //得到Session
        HttpSession session = req.getSession();
        //取消掉我们所存入的name。
        session.removeAttribute("name");
        //注销掉session
        session.invalidate();

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

之后在web.xml里面进行注册:

 <servlet>
        <servlet-name>SessionDemo03</servlet-name>
        <servlet-class>com.rgf.servlet.SessionDemo03</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionDemo03</servlet-name>
        <url-pattern>/s3</url-pattern>
    </servlet-mapping>

之后运行之后如下所示:
Session详解(重点)

 我们再重新登录s1,发现如下所示:
Session详解(重点)

说明以前的session已经被注销了。 

我们知道session是一个浏览器对应一个session,我们利用其他浏览器进行对比如下:
Session详解(重点)

 我们发现这两个浏览器里面所使用的session的ID不同。我们再进行回车,发现他们的ID还是那个样子,没有发生变化。

我们先利用s3,进行session的注销,之后我们访问s2,发现如下所示:

Session详解(重点)

 出现空指针异常,这个空指针异常是person空指针异常,是因为session中的键name不存在导致的。注销之后访问s2正常会更新ID。

我们重新访问s1后,我们发现如下所示:
Session详解(重点)

我们发现这个ID与此前的不一样,一旦注销之后,浏览器就会产生一个新的session。 

我们再双核浏览器进行同样的操作:
Session详解(重点)

我们发现该ID也发生了变化。 这种方式是手动注销的方式。

当用户登录的时候,如果一两天还没有用的话,我们有自定失效时间。我们在web.xml里面进行设置如下所示:

<!--设置session默认的失效时间,  -->
    <session-config>
        <!--15分钟后Session自动失效,以分钟为单位-->
        <session-timeout>1</session-timeout>
    </session-config>

如果我们所设置失效时间长的话会因为如果用户量特别大,服务器上全是session,会容易崩。

我们在更好的网站一般采用cookie,cookie会持久化的保存到客户端,浏览器也有清除cookie的作用,点击设置,进入清除浏览数据,如下所示:

Session详解(重点)

 但是我们建议一般不删除cookie.

我们进行测试看是否在我们所设置的session会在一分钟后失效:
Session详解(重点)

 我们进行刷新如下所示:
Session详解(重点)

发现出现了一个新的session。

Session和Cookie的区别:
Cookie是把用户的数据写给用户的浏览器,浏览器保存。(可以保存多个)

Session把用户的数据写到用户独占Session中,服务器端保存。(保存重要的信息,减少服务器资源的浪费)

Session对象由服务器创建

session使用场景:

(1)保存一个登录用户的信息;(用户登录之后,只要不关掉浏览器,都在session里面,都可以去享受他的服务,无论跳到哪个网页,他的信息都会存在)

(2)购物车信息

(3)在整个网站中经常会使用的数据,我们将它保存在Session中。

使用session的代码如下所示:

将东西存入session:

package com.rgf.servlet;

import com.rgf.pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;

public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
                req.setCharacterEncoding("utf-8");
                //响应
                resp.setCharacterEncoding("utf-8");
                resp.setContentType("text/html;charset=utf-8");
        //
        //        //得到Session
                HttpSession session = req.getSession();
        //        //给Session中存入东西
        session.setAttribute("name",new Person("蕾峰编程",22));

        //获取session的ID
        String sessionId = session.getId();

        //判断Session是不是新创建的
        if(session.isNew()){
            resp.getWriter().write("session创建成功,ID:"+sessionId);
        }else {
            resp.getWriter().write("session已经在服务器中存在了,ID:"+sessionId);
        }
//Session创建的时候做了什么事情:
        //session在创建的时候带了一个cookie,而且服务器把该cookie响应给客户端了。
        //Cookie cookie = new Cookie("JSESSIONID",sessionId);
     //   resp.addCookie(cookie);


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

从session里面取东西:
 

package com.rgf.servlet;

import com.rgf.pojo.Person;
import sun.net.httpserver.HttpServerImpl;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        req.setCharacterEncoding("utf-8");
        //响应
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //得到Session
        HttpSession session = req.getSession();
        //从Session中取出东西,我们将其new一个对象,然后出现Object,我们进行强制转换,点击alt+enter。
        Person person = (Person) session.getAttribute("name");
       // public String toString()返回该对象的字符串表示。
        // 通常,ToString方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。
        System.out.println(person.toString());


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

所需要存入的东西:
 

package com.rgf.pojo;

public class Person {
    private  String name;
    private int age;
    //有参无参构造:Constructor
    //有参构造:
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
//无参构造:Select None
    public Person() {
    }

    //ctrl+o为重写方法
//鼠标右键Generate,进行重写get和set方法。
    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    //为了调试输出方面,还会加toString:
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}



手动注销session:

package com.rgf.servlet;

import com.rgf.pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        req.setCharacterEncoding("utf-8");
        //响应
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        //得到Session
        HttpSession session = req.getSession();
        //取消掉我们所存入的name。
        session.removeAttribute("name");
        //手动注销session
        session.invalidate();

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

自动注销session,会话自动过期:web.xml:

 <!--设置session默认的失效时间,  -->
    <session-config>
        <!--15分钟后Session自动失效,以分钟为单位-->
        <session-timeout>1</session-timeout>
    </session-config>

我们查看cookie原理如下所示:

Session详解(重点)

 我们的session原理如下所示:‘

Session详解(重点)

而对于ServletContext而言:

Session详解(重点)文章来源地址https://www.toymoban.com/news/detail-460570.html

到了这里,关于Session详解(重点)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何将linux数据从一个服务器复制到另外一个服务器

    首先先要确定两台服务器之间可以通讯 可以使用ping 服务器的地址查看是否通信 然后使用下面的步骤进行通讯 可以使用scp命令来在Linux系统中将文件或目录从一台服务器复制到另一台服务器。 语法为:scp [选项] 源路径 目标地址 其中,[选项]包括但不限于: 命令参数: 示例

    2024年01月19日
    浏览(38)
  • git push提交代码到服务器报remote: [session-xx] Access denie The requested URL returned error: 403

    操作: 执行 git push -u origin master ,我想把commit的代码直接提交到远程的仓库,哪知道直接给我一个报错: remote: [session-xxx] Access denied fatal: unable to access \\\'https://gitee.com/xxx/xxx.git/\\\': The requested URL returned error: 403 原因: 这是账号不一致 可以通过查询一下当前用户: cat ~/.gitconfig

    2024年02月11日
    浏览(36)
  • 迁移Linux服务器用户数据(将一个服务器的Linux用户数据迁移到另一个Linux服务器用户的流程)

    先来到根目录,再使用tar命令打包数据: tar czvf root.zip.gz ./* 在根目录使用指令: scp 打包好的数据 用户@ip:目的用户下的某个目录 源Linux服务器用户 : 查看压缩包是否到达: 对收到的数据进行解压,使用指令 tar xzvf root.zip.gz 解压到当前目录下。 目的Linux服务器用户 : 看到

    2024年02月08日
    浏览(40)
  • 为什么TM服务器要安装php~ 现在服务器都用什么php环境,服务器安装php环境的作用是什么?

    \\\"想像力比知识更重要。因为知识是有限的,而想像力是无限,它包含了一切,推动着进步,是人类进化的源泉。 -- 爱因斯坦 为什么服务器要安装php~ 导读:今天来给各位分享关于服务器为什么安装PHP的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开

    2024年02月16日
    浏览(51)
  • 如何从一个git服务器仓库将项目迁移到另一个git服务器仓库

    最近服务器迁移涉及到代码也需要一块迁移,梳理了一些git服务迁移指令,希望大家共享😁(从服务器A迁移到服务器B) 1. 首先将服务器A上的代码进行备份 1.1 git备份指令【从A服务器(https://gitlab.xxxx.cn)上clone代码到本地】 ​​​​ git clone --bare https://gitlab.xxxx.cn/front/ifix

    2024年02月11日
    浏览(36)
  • 将一个服务器上的文件复制到另一个服务器中的容器里

    步骤: 将A服务器上的文件复制到B服务器上 将B服务器上的文件复制到指定容器中 (将本地文件复制到服务器上同理) 使用scp命令 1. 复制文件 命令格式: scp local_file remote_username@remote_ip:remote_folder 2. 复制目录 命令格式: scp -r local_folder remote_username@remote_ip:remote_folder 注意 :

    2024年02月07日
    浏览(30)
  • 媒体服务器与视频服务器有什么区别

    媒体服务器与视频服务器有什么区别 流媒体服务器用在远程教育,视频点播、网络电台、网络视频等方面。 直播过程中就需要使用流媒体服务器,一个完整的直播过程,包括采集、处理、编码、封包、推流、传输、转码、分发、解码、播放等过程,流媒体服务器主要负责采

    2024年02月11日
    浏览(34)
  • Nginx与Tomcat的区别,什么是HTTP服务器(处理静态资源的服务器),什么是处理动态资源的服务器

    Nginx和Tomcat都是常用的Web服务器,但它们的主要作用不同。 Nginx是一个HTTP服务器,反向代理服务器和通用TCP/UDP代理服务器。 它通常用于静态内容、媒体流和负载均衡。在高流量和高并发负载下,Nginx表现更出色,并且能够轻松处理静态文件、压缩和SSL/TLS卸载等任务,以减轻

    2024年02月14日
    浏览(29)
  • 【云服务器】对比传统服务器,为什么说云服务器更具优势?

    个人主页:【😊个人主页】 系列专栏:【❤️其他领域】 2006年搜索引擎大会上,“云服务器”的概念孕育而生,时至今日云服务器与传统服务器的优劣对比仍在各大论坛进行着激烈论争。但我们不可否认的是云服务器早已正式走入公众视野,渗透到了我们工作和生活的各个

    2024年02月05日
    浏览(51)
  • 【阿里云服务器数据迁移】 同一个账号 不同区域服务器

    假如说一台云服务器要过期了,现在新买了一台,有的人会烦恼又要将重新在新的服务器上装环境,部署上线旧服务器上的网站项目, 但是不必烦恼,本文将介绍如何快速将就旧的服务器上的数据迁移到新的服务器上. 包括所有的环境和网站项目噢 !  填写 镜像名称和描述. 选择自定

    2024年01月24日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包