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的持久化!