【Java Web】-> Session -> 如何实现登录与注销?

Ⅰ 关于Session

在前面一篇讲Cookie的文章中我提到了会话的概念,->Cookie,这个Seesion就是一个会话。关于seesion我们有几点需要知道:

  • 服务器会给每一个用户(浏览器)创建一个Session对象
  • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就一直存在。
  • 用户登录之后,整个网站都可以访问。(比如你登了CSDN,点首页、创作中心任何地方跳转过去还保留着你的登录信息)。

Ⅱ Seesion的用法

A. 向Session存入数据

我们从简单的获取Session入手,看看Sessio都有哪些信息。

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

/**
 * 获取session的基本操作
 * @author tyz
 */
public class CreateSession extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        //解决中文乱码问题
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        //得到Session
        HttpSession session = req.getSession();
        //向Session中存数据
        //区别于Cookie,Cookie的键值都是String,Session值可以是对象
		session.setAttribute("name", "Jessica");

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

        //判断Session是不是新创建的
        if (session.isNew()) {
    
    
            resp.getWriter().write("This session is new: " + id);
        } else {
    
    
            resp.getWriter().write("This session is old: " + id);
        }
    }

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

注释我已经写得很清晰了,session的这几个操作都比较简单,在后面我有一个判断,如果seesion已经存在了,我们就输出This is old: 并加上这个session的ID, 否则就输出的是This is new: 加上ID。

我们来看看运行结果。

在这里插入图片描述

输出的是This session is old,也就是session已经存在了。这就是我们上面说的,服务器会给每个用户都建立一个Session,在网站被关闭后才会消失。
在这里插入图片描述
所以在我们获取客户端的cookie的时候,必然存在一个cookie就是我们圈起来的这个session,在打开浏览器的时候它就出现了。
可以看到,在Request的header里,被加入了这么一个cookie:
在这里插入图片描述
好了。现在我们再来建一个servlet,因为在当前这里我们是建了一个session的,现在我们把它取出来。

在这里插入图片描述

B. 获取Session的值

我们建立一个获取session值的servlet如下

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

/**
 * @author tyz
 */
public class GetSession 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的值
        String name = (String) session.getAttribute("name");

        System.out.println(name);
    }

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

首先我们先进入/putS,把session放进去
在这里插入图片描述
接着进入/getS

在这里插入图片描述
可以看到,我们定义的session的值被正常取出了。

在前面的注释中我说了,seesion和cookie存数据的一个区别就是cookie规定的value之只能是String,但是session是Object,也就是可以存一个对象进session。

为了验证,我们先建一个简单的类。

package com.tyz.object;

/**
 * @author tyz
 */
public class Person {
    
    
    private String name;
    private int age;
    private boolean gender;

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

    @Override
    public String toString() {
    
    
        return this.name + " " + (this.gender ? "Male" : "Female") + " " + this.age;
    }
}

现在我们把这个类的对象存入session。

在这里插入图片描述
那获取session就变成下面这样
在这里插入图片描述
结果如下,可以看到输出了我们生成的一个Person对象
在这里插入图片描述
我们知道,Servlet中的ServletContext在不同的servlet之间也是共享数据的,所以可以用来存取数据,但是它并没有session强大,如果服务器很多用ServletContext可能就爆炸了,虽然session也不能存太多数据,但还是要比ServletContext好很多。

那接下来我们再来看看Session的删除和注销。

session删除也是只有一行代码。
在这里插入图片描述
我们先不存session,直接取一下,看会得到什么。

在这里插入图片描述
可以看到在不用我们第一个存放session的servlet的情况下,直接取会取到null,现在我们先存放,再用刚写的删除,然后再取一下。
在这里插入图片描述
所以这个removeAttribute()就是帮我们把这个session的对象给删除了,不存在这条数据了。接下来我们看注销。

C. Session的删除与注销

在这里插入图片描述
加入这行代码之后再运行看上去结果是一样的,有的浏览器可能会在注销后再取得seesion报出异常,有的则不会,后台仍然是输出了一个null。

removeAttribute()invalidate()到底有什么区别呢?我补充一下。

  • session.removeAttribute()适用于清空指定的属性
  • session.invalidate()是清除当前session的所有相关信息

具体点说就是removeAttribute()是从session删除指定名称的绑定对象,也就是说调用此方法后再调用getAttribute(name)时,不能获取指定名称的绑定对象,但是session还存在。invalidate()就是销毁此session对象,session对象中绑定的那些对象值也都不存在了.

上面实现的是一种手动注销的方法,在web.xml中还可以配置session,让它自动注销。
在这里插入图片描述
现在我们设置一个session试一下。

在这里插入图片描述

过了一分多钟我又get了一下seesion

在这里插入图片描述
输出的就是null 了,

Ⅲ Session和Cookie的异同总结

在上一篇文章我写了 Cookie ,现在我们学了Session之后再来总结一下它们之间的区别。

  1. Cookie是把用户的数据写给用户的浏览器,浏览器保存;
  2. Session把用户的数据写到独占的Session中,服务器保存;
  3. Session对象由服务器创建。

Session最常见的使用场景就是保存用户的登录信息了,还有就是保存购物车信息啊,网站中常用的信息诸如此类。

猜你喜欢

转载自blog.csdn.net/qq_45627684/article/details/113102012