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是怎么去工作的。


JavaWeb| 详解Cookie与Session会话技术


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的值:


JavaWeb| 详解Cookie与Session会话技术


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

中:



JavaWeb| 详解Cookie与Session会话技术


果然,大家可以看到我们访问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的会话流程,这里我给大家准备了一张图,方便大家的理解:


JavaWeb| 详解Cookie与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);
    }
}


JavaWeb| 详解Cookie与Session会话技术


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

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


JavaWeb| 详解Cookie与Session会话技术


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


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

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


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


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



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


JavaWeb| 详解Cookie与Session会话技术


     如果只是单纯的一个项目那么我们直接在我们项目的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

上一篇:SQL 查询总是先执行SELECT语句吗?你们都错了!


下一篇:SQL Server DBA工作内容你知道多少?