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是如何被创建并且发送出去的:

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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对象的创建和获取

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

代码语言:javascript
复制
@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先持久化,不然会在浏览器关闭后就被销毁掉,我们来看一下代码:

代码语言:javascript
复制
HttpSession httpSession = request.getSession();
Cookie cookie = new Cookie("JSESSIONID",httpSession.getId());
//设置持久化时间
cookie.setMaxAge(60*60);
response.addCookie(cookie);

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

END

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

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