JavaWeb——什么是Session及Session的用法

1.什么是Session
当用户请求来自应用程序的 Web页时,服务器会给每一个用户(浏览器)创建一个Session对象;

在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中;

当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去,默认情况下,只要浏览器没有关闭,这个Session就一直存在。

Session可以理解为一个抽象概念,即会话,会话用于记录一个用户在我们网站上的一些行为、一些状态

Session存储了需要在整个用户会话过程中保持其状态的信息,例如登录信息或用户浏览Web应用程序时需要的其它信息。

Session又可以指在后台保存用户状态来实现会话的方式,它把用户状态存储在后台的内存、数据库等介质中,然后我们利用请求的Cookie中保存的Session ID来为这个请求找到它对应的会话。

2.Session的常用方法

isNew()//判断是否是新的Session,一般在第一次访问的时候出现
getid()//拿到session的ID
getCreationTime()//当前session创建的时间
getLastAccessedTime()//最近的一次访问这个session的时间。
setAttribute()//设置Session的值
getAttribute()//获取Session的值
removeAttribute()//移除Session的值
invalidate()//手动注销Session
复制代码

3.Session的一些用法
1.实现Session
package com.cheng.session;

import com.cheng.pojo.Person;

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

public class SessionDemon01 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 id = session.getId();

        //判断session是否为新创建的
        if (session.isNew()){
            resp.getWriter().write("session创建成功,sessionID为"+id);
        }else{
            resp.getWriter().write("session已经在服务器中存在,sessionID为:"+id);
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

复制代码

注册Servlet

 <servlet>
        <servlet-name>SessionDemon01</servlet-name>
        <servlet-class>com.cheng.session.SessionDemon01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionDemon01</servlet-name>
        <url-pattern>/s1</url-pattern>
    </servlet-mapping>
复制代码

启动服务器测试

第一次访问

在这里插入图片描述

重新访问,发现Session已经保存在服务器中

在这里插入图片描述

2.跨Servlet获取Session里的值
Servlet1存放值:

package com.cheng.session;

import com.cheng.pojo.Person;

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


public class SessionDemon01 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");
        HttpSession session = req.getSession();
        session.setAttribute("name","万里顾一程");
        String id = session.getId();
        if (session.isNew()){
            resp.getWriter().write("session创建成功,sessionID为"+id);
        }else{
            resp.getWriter().write("session已经在服务器中存在,sessionID为:"+id);
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

复制代码
 <servlet>
        <servlet-name>SessionDemon01</servlet-name>
        <servlet-class>com.cheng.session.SessionDemon01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionDemon01</servlet-name>
        <url-pattern>/s1</url-pattern>
    </servlet-mapping>
复制代码

Servlet2取出值

package com.cheng.session;

import com.cheng.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 SessionDemon02 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");

        HttpSession session = req.getSession();
        //通过键取出值
        String name = (String) session.getAttribute("name");
        resp.getWriter().write(name);

    }

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

复制代码
  <servlet>
        <servlet-name>SessionDemon02</servlet-name>
        <servlet-class>com.cheng.session.SessionDemon02</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionDemon02</servlet-name>
        <url-pattern>/s2</url-pattern>
    </servlet-mapping>
复制代码

启动服务器测试

先运行s1,在运行s2

在这里插入图片描述

3.跨Servlet获取Session里的对象
对象类

package com.cheng.pojo;

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    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;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

复制代码

Servlet1存放对象:

package com.cheng.session;

import com.cheng.pojo.Person;

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

public class SessionDemon01 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");
        HttpSession session = req.getSession();
        session.setAttribute("name",new Person("万里顾一程",20));
        String id = session.getId();
        if (session.isNew()){
            resp.getWriter().write("session创建成功,sessionID为"+id);
        }else{
            resp.getWriter().write("session已经在服务器中存在,sessionID为:"+id);
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

复制代码

   <servlet>
        <servlet-name>SessionDemon01</servlet-name>
        <servlet-class>com.cheng.session.SessionDemon01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionDemon01</servlet-name>
        <url-pattern>/s1</url-pattern>
    </servlet-mapping>
复制代码

Servlet2取出对象

package com.cheng.session;

import com.cheng.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 SessionDemon02 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");

        HttpSession session = req.getSession();
        Person person = (Person) session.getAttribute("name");
        System.out.println(person);
        resp.getWriter().write(person.toString());

    }

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

复制代码
  <servlet>
        <servlet-name>SessionDemon02</servlet-name>
        <servlet-class>com.cheng.session.SessionDemon02</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionDemon02</servlet-name>
        <url-pattern>/s2</url-pattern>
    </servlet-mapping>
复制代码

启动服务器测试

先运行s1,在运行s2

在这里插入图片描述

3.注销Session
1.手动注销
package com.cheng.session;

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 SessionDemon03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("name");
        //手动注销
        session.invalidate();
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

复制代码

2.自动注销
在web.xml里加入

  <session-config>
        <!--Session一分钟后失效-->
        <session-timeout>1</session-timeout>
    </session-config>
复制代码

两种使用场景:如果用户点了关闭浏览器,则是手动注销,如果用户超过一定时间没访问web页面,则可以用自动注销

4.Session和Cookie的区别
Cookie是把用户的数据写给用户的浏览器,由浏览器保存,可以保存多个
cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗
cookie的有效期在cookie生成的时候设置进去。
Cookie原理图:

在这里插入图片描述

Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中

Session是把用户的数据写进用户独占的session中,服务器保存,登陆信息等重要信息存放入session

如果主要考虑到安全应当使用session ;

Session的有效期在web.xml配置文件里设置

Session原理图:

在这里插入图片描述

最后
如果你觉得此文对你有一丁点帮助,点个赞。或者可以加入我的开发交流群:1025263163相互学习,我们会有专业的技术答疑解惑

如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点star:http://github.crmeb.net/u/defu不胜感激 !

PHP学习手册:https://doc.crmeb.com
技术交流论坛:https://q.crmeb.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CRMEB定制开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值