专栏首页JAVAandPython君JavaWeb| 详解Cookie与Session会话技术

JavaWeb| 详解Cookie与Session会话技术

1.写在前面的话

今天Web系列终于换了一个主题了,咱们这次来讲讲Cookie和Session会话技术,其实有一定web基础的人对这两个东西还是比较熟悉的,不过不熟悉也没关系,这篇文章我会写的比较详细,也会比较长,如果你看的比较累了可以收藏一下,下次继续来看。

这篇文章主要会讲到---简单介绍会话技术,Cookie的会话流程,Cookie的创建和发送,Cookie的常见API,获取Cookie,Session的会话流程,Session对象的创建和获取,使用Session域对象存取数据,Session的生命周期,Session持久化,购物车的简单使用。

2. 会话技术是个啥?

通俗的来讲就是你打开浏览器访问一个网站,然后到你关闭浏览器这个过程就是一次会话。会话技术就是你这次访问中客户端的一些数据和状态。

会话技术分为Cookie和Session。Cookie数据是存在客户端本地的,这样可以减少服务器的存储压力,但是安全性较差,可以从客户端清除cookie。 Session数据是存储在服务器上的,安全性可能相对来说更好,但是这样会增加服务器端的压力。

3. Cookie的会话流程

这里给大家准备了一张图,内容就是当我们在访问一些购物网站时,把想要购买的商品添加到购物车,此时我们添加的这个信息就会放入到cookie中,然后服务器将其返回给客户端浏览器,当用户去访问购物车时,就会携带这个cookie去访问列表,此时购物车中就含有刚刚所选择的商品。当然这只是个简单的小栗子,只提供给大家思考cookie是怎么去工作的。

4. Cookie的创建和发送

这里我直接上代码给大家看看,cookie是如何被创建并且发送出去的:

@WebServlet(name = "CookieServlet",urlPatterns = "/cookie")
public class CookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = new Cookie("goods","milk");
        response.addCookie(cookie);
    }
}

其实正如上面那两行代码那么简单,第一句就是创建cookie对象,第二句利用response里面提供的方法addCookie()来对cookie对象进行添加,我们运行之后可以在开发者工具里面通过抓包看见cookie的值:

我们此时去访问我们本项目中的一个网页index.jsp,看看这个cookie是否被携带在请求头

中:

果然,大家可以看到我们访问index.jsp时,我们之前的cookie信息仍然被保存在请求头中。

5. Cookie常见的API

常用的方法:

获得Cookie的名称的方法 String getName()

获得Cookie的值的方法 String getValue()

设置Cookie的有效路径 void setPath(String uri)

设置Cookie的有效时长 void setMaxAge(int time)

将信息回写到浏览器 response.addCookie(cookies);

这里的方法我就不给大家一一演示了,相信大家学到这里还是会去调用这些API的。

6. 获取Cookie值

我们还是直接上代码,这次我们需要创建两个Servlet来进行这波操作:

CookieServlet.java

@WebServlet(name = "CookieServlet",urlPatterns = "/cookie")
public class CookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = new Cookie("goods","milk");
        response.addCookie(cookie);
    }
}

getCookieServlet.java

@WebServlet(name = "getCookieServlet",urlPatterns = "/getcookie")
public class getCookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //拿到cookie
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
        //拿到cookie的名字
            String name = cookie.getName();
            if (name.equals("goods")){
            //拿到cookie的值
                String value = cookie.getValue();
                response.getWriter().write(value);
            }
        }
    }
}

可以从上面两块代码看出,我们直接通过request.getCookie()方法就可以去拿到所有的cookie值。大家可以去试一下这两块代码。

7. Session的会话流程

首先,我们来简单介绍一下Session是个啥吧,我就直接百度百科了(这个比我说的更好)

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。有关使用 Session 对象的详细信息,请参阅“ASP 应用程序”部分的“管理会话”。注意 会话状态仅在支持 cookie 的浏览器中保留。

看完了Session的基本概念,我们回到主题来看看Session的会话流程,这里我给大家准备了一张图,方便大家的理解:

这里也比较好理解,客户端添加一个商品到购物车中,此时在服务端会创建一个Session并且给了它一个id,方便下次访问时能够通过这个id来找到它,这个ID就是我们所称的SessionID。

8. Session对象的创建和获取

我们直接上代码来看一下:

@WebServlet(name = "SessionServlet",urlPatterns = "/session")
public class SessionServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建Session,判断服务器上是否存在属于当前会话的Session,
        // 如果有那么返回之前所有的,如果没有那么就新建一个Session
        HttpSession httpSession = request.getSession();
        String id = httpSession.getId();
        response.getWriter().write("sessionID"+id);
    }
}

然后我们来看下结果是咋样的:

9.使用Session域对象存取数据

其实Session中也是可以存储数据的,它也是域对象(关于域对象是啥可以看我之前的文章),所以他也有相应的方法来存储和获取数据.

我相信大家看这几个方法都是比较眼熟的,其实每个域对象的存储的方法都差不多。由于篇幅的原因我就不去一一写这些方法给大家看了,大家可以自己动手去试一下。

10.Session的生命周期和持久化

又谈到生命周期这个东东了,相信大家都不陌生了,无非就是它啥时候出生啥时候挂掉,Session这个还是挺简单的:

创建:第一次执行request.getSession()方法时,就创建了,记得是第一次创建的时候。

销毁:服务器关闭(非正常)、Session过期了(默认是30分钟)

这里就引申出一个问题,Session的过期时间这么去设置?其实想要修改这个时间,我们只能从配置文件web.xml中去修改,如果我们想让我们所有的项目都修改那么我们可以去修改Tomcat里面的web.xml

如果只是单纯的一个项目那么我们直接在我们项目的web.xml里面加上上图的标签代码即可。

关于持久化这个问题,首先我们得知道Session是基于Cookie来的,所以想要让Session持久化,那么必定得让Cooike先持久化,不然会在浏览器关闭后就被销毁掉,我们来看一下代码:

HttpSession httpSession = request.getSession();
Cookie cookie = new Cookie("JSESSIONID",httpSession.getId());
//设置持久化时间
cookie.setMaxAge(60*60);
response.addCookie(cookie);

通过上面的代码我们就可以实现Session的持久化!

END

终于写完了这篇文章,希望对大家还是有所帮助的,最近这段时间也是比较忙,所以可能原创文章来的有点慢,不过还是有很多朋友从我公众号受到了很多益处所以我也是动力十足,4月底送了一本书给阅读量最高的朋友,我希望日后争取能够每个月送读者朋友们一本书,以此来感谢大家的支持!

JAVAandPython君---一个坚持原创技术文章输出的公众号!如果你觉得这篇文章对你有所帮助可以点个“在看”或者给JAP君加个小鸡腿!

本文分享自微信公众号 - JAVAandPython君(JAVAandPythonJun),作者:JAP君

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 小白学Flask第三天| 今天把视图函数的路由给讲清楚!

    大家可以看到输出了一个Map映射的对象,里面有一个列表,列表里就有着路由的详细信息。这里我给大家详细讲解一下里面的内容

    Python进击者
  • 小白学Flask第七天| 讲讲cookie和session的操作

    cookie和session都是web开发当中老生常谈的话题,我们首先来看看Flask当中cookie是如何使用的。

    Python进击者
  • 17岁网瘾少年竟是黑客 利用游戏漏洞盗窃12余万

    记者从渝中警方获悉,一17岁网瘾少年当黑客,盗取了一互联网民营企业账户,让原本向公司“买”装备的他,变为向公司“卖”装备,短短几天时间,他便从网络上盗走了该公司...

    Python进击者
  • cookie详解

    今天看到一篇cookie的文章,写的特别详细,感谢 晚晴幽草轩 的分享,原文链接http://mp.weixin.qq.com/s/NXrH7R8y2Dqxs9...

    用户1214487
  • 在 PHP 中使用和管理 Session

    与 Cookie 一样,Session 技术也是用于解决 HTTP 协议无状态的问题,不过,与 Cookie 数据保存在客户端不同,Session 数据存储在服...

    学院君
  • Servlet第六篇【Session介绍、API、生命周期、应用、与Cookie区别】

    什么是Session Session 是另一种记录浏览器状态的机制。不同的是Cookie保存在浏览器中,Session保存在服务器中。用户使用浏览器访问服务器的...

    Java3y
  • Session分布式共享 = Session + Redis + Nginx

    一、Session 1、Session 介绍 我相信,搞Web开发的对Session一定再熟悉不过了,所以我就简单的介绍一下。 Sess...

    逸鹏
  • Java Web之Cookie和Session的理解

    Cookie和Session.jpg 日常现象 登录了某个网站,过一会儿再登录,诶,不用输入密码了,直接是登录状态了,好神奇~~~ 在某网站看了一部手机,接下来...

    YungFan
  • 基于ZooKeeper的分布式Session实现

    用户1263954
  • 探索式测试,到底应该如何开展?

    对于探索式测试的具体执行层面,我们会采用一种称之为Session-Based Testing management(简称SBTM)的方法来进行测试。关于SBTM...

    测试小兵

扫码关注云+社区

领取腾讯云代金券