Session 及其使用示例

Session 及其使用示例

说明:下面介绍 ,我们使用到了浏览器抓包,HTTP 的知识,如果不了解,请先简单了解下 HTTP 介绍,HTTP 请求,HTTP 响应。因为 和 是一对“好兄弟”session用法 java,我们介绍 也要使用到 ,如果不清楚 ,请查看 详解。

什么是

在网络应用中称为“会话控制”session用法 java,是服务器为了保存用户状态而创建的一个特殊的对象。简而言之,就是一个对象Session 及其使用示例,用于存储信息。

有什么用

我们先来想一个问题,这个问题就是我们在游览购物网站时,我们并没有登录,但是我们任然可以将商品加入购物车,并且进行查看,当我们退出浏览器后再打开浏览器进行查看时,购物车中依然有我们选择的商品,这该怎么实现呢?

当然,我们可以使用 ,但是 不能存放大量数据,这时,我们就需要一种新的技术,。 是存储于服务器端的特殊对象,服务器会为每一个浏览器(客户端)创建一个唯一的 。这个 是服务器端共享,每个浏览器(客户端)独享的。我们可以在 存储数据,实现数据共享。

这是 的简单原理示意图

类似于一个 Map,里面可以存放多个键值对session用法 java,是以 key-value 进行存放的。key 必须是一个字符串,value 是一个对象。

底层实现机制

是每一个浏览器(客户端)所唯一的,这个是怎么实现的呢?其实,在访问一个网站时,在 HTTP 请求中往往会携带一个 ,这个 的名字是 ,这个 表示的就是 的 id,这个是由服务器创建的,并且是唯一的。服务器在使用 时,会根据 来进行不同操作,如下图所示:

当我们在服务端使用 时,首先要获取 ,这个 是通过 进行获取。当然,这时就已经有好多种情况了。例如浏览器访问时没有携带 ,浏览器携带的 对应的 不存在(或者失效)等情况。上面这个图就对服务器获取 的一些情况进行了说明。

浏览器抓包进行查看

下面我创建了一个简单的服务器,服务端操作 ,看浏览器中的 是如何进行携带的。我服务器的访问地址是 :8080/cs/, 最开始浏览器是没有 的 ,而服务端要操作 ,我们访问后看服务器返回什么。

这是我们抓包后看到的请求头

这是我们的响应头

我们发现如果浏览器访问服务器,如果没有携带 ,那么服务器就会创建一个 ,并且把这个 的 返回给浏览器。

下面,我们再次访问同样的地址,这次就会携带 了。

我们发送的请求头

我们抓包看见的响应头

我们发现,如果浏览器携带了 ,那么浏览器在访问时就会携带。而服务器在使用 时,就会使用这个 的 。

当然,上面是正常情况,那就是服务器端有对应 的 ,并且没有过期。下面,我把浏览器发送请求的 改 2 个字母,看浏览器请求和服务器返回的是什么。

请求头

响应头

这次,我们发现请求头和响应头都携带了 ,这是因为浏览器携带的 在服务器端并没有对应的 ,或者 已经过期了。所以服务器创建了一个新的 ,并且把新的 返回给了浏览器。

通过 底层实现机制和 HTTP 抓包查看Session 及其使用示例,大家应该已经对 的原理有了清晰的认识。下面我来介绍一下 的常用方法(基于 Java)。

常用方法 实例应用

我们利用 来实现一个登录验证的功能。如果用户登录成功了,那么我们在 1 天内访问主页面就不需要登录了。我们利用 进行实现。

我创建了一个 html 页面,2 个 来实现这次功能。代码如下:

html 页面




    
    login
    



    用户名:
密 码:

这个 html 就是一个简单的登录页面。

这个 用于判断用户名和密码是否是我们规定的

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
 
@WebServlet("/checkLogin")
public class CheckServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //得到用户名和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //判断用户名和密码是否为我们设置的密码
        if (username.equals("tom") && password.equals("tom123")){
            //得到 Session
            HttpSession Session = request.getSession();
            //设置最长访问间隔时间
            Session.setMaxInactiveInterval(60*60*24);
            //将用户名存入 Session
            Session.setAttribute("username",username);
            //重定向到主页面
            response.sendRedirect(request.getContextPath()+"/mainPage");
        }else {
            //设置 MIME 类型和编码
            response.setContentType("text/html;charset=utf-8");
            //写回提示信息
            PrintWriter writer = response.getWriter();
            writer.write("

账号或密码错误

"); writer.write("

01点击重新登录

"); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }

这个 就是我们的主页面

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
 
@WebServlet("/mainPage")
public class MainServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应的 MIME 类型和编码
        response.setContentType("text/html;charset=utf-8");
        //得到 Session
        HttpSession Session = request.getSession();
        //取出用户名
        Object username = Session.getAttribute("username");
        PrintWriter writer = response.getWriter();
        //判断用户名是否存在
        if (username != null){
            //在一天内登录过,无需再次登录
            writer.write("

用户:"+username+" 登录成功

"); }else { //没有登录,或者登录间隔大于 1 天。重定向到登陆界面 response.sendRedirect(request.getContextPath()+"/login.html"); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }

代码测试

我们一来就直接访问主界面。

发现服务器发现我们没有登录,直接重定向到登录界面。下面我们来登录一下,输入我们设置的用户名和密码,分别是 tom 和

我们登录成功了,那么现在我们关闭浏览器,然后重新打开,并且直接访问主界面,看能否直接访问。

我们发现登录成功了,并没有重定向,因为我们已经登录过了嘛,一天之内都不需要重新登陆。我们的功能就实现了。

和 的比较总结

就是一个存储于服务器的特殊对象,通过 可以实现数据共享, 有一个 ,这个是 的唯一标识,使用它可以查找到 。 是会话级别的,对于每一个客户端来说是独享它所拥有的 的,我们使用 在进行页面跳转时,服务端可以利用 进行数据共享。 由服务器进行控制。 的创建和销毁都是服务器进行管理的。服务器会为每一个客户端创建一个 。

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » Session 及其使用示例

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们