Cookie、Session傻傻分不清楚

转载请注明出处:http://blog.csdn.net/qq_15002323/article/details/51201597

Cookie是什么鬼

额,作为一个java web小白,看到Cookie一脸懵逼有没有(⊙﹏⊙)。虽然英文差的不要不要的,但还是知道这是个能吃的曲奇吧。什么鬼?会话保持?客户端存储?最好不要让我弄懂了,要不然砍翻你,啊痛!~

Cookie嘛,说简单点就是一种在客户端保存信息的技术。举个栗子吧~~o(>_<)o ~~在浏览某些网页的时候,假如需要登录操作,你输入正确的账号和密码后登陆成功后,第二次访问这个登陆网页是不是发现账号密码已经被系统填充了,就算重启计算机,仍然如此。这,就是Cookie所起的作用啦。

那么我们要问,Cookie怎么来的啊,具体是做什么的,我在这里可以打个非常合适的比喻。周末我去某个商场办理了一个VIP(^__^) ,商场给我发了一张卡,我进去的产生的任何消费都会记在我的这张卡上(当然不可能记在别人卡上啊T T),商场也不知道我什么时候去消费,也不知道我消费完什么时候会离开,但是那张VIP卡就是我的凭证。可能我无意丢失了,我可以去找商场挂失。可能有人捡到了但是该VIP卡相关信息都不知道,严重怀疑非本人,商场方面可自行注销掉该凭证。

好了,言归正传,在上面的例子中,商场给我发的VIP卡就是我们的Cookie,这里的商场就是服务器,我就是浏览器。O(∩_∩)O哈!有没有石破惊天之效,原来Cookie也不过如此啊。

总结为一句话,Cookie就是服务器给客户端做的一个标记,客户端收到标记(Set-Cookie)后,根据这个标记的一系列的属性值决定是否在本地创建相关的标记。

说了这么多,来点干货好吧。先写一个空的servlet,配置好映射,然后打开火狐浏览器(为什么不用chrome咧,我发现chrome在Cookie查看这块有点问题,明明本地有就是查不出来,吐槽吐槽T^T)访问这个servlet看看请求部分:

看的也许一头雾水是不是,不要紧,重要的是Cookie,这个响应头和请求头部都没有这个单词是吧- -,然后我们稍作修改:

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CookieTest extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        // 设置临时Cookie,只存在一次会话中,默认值
        Cookie tempCookie = new Cookie("temp", "tempCookie");
        tempCookie.setMaxAge(-1);
        response.addCookie(tempCookie);
        // 设置瞬时Cookie,浏览器收到Cookie立即删除
        Cookie cookie = new Cookie("cookie", "666");
        cookie.setMaxAge(0);
        response.addCookie(cookie);
        // 设置常驻Cookie
        Cookie userCookie = new Cookie("user", "cjt");
        userCookie.setMaxAge(60 * 60 * 24);
        response.addCookie(userCookie);
    }
}

可以看到我们往客户端写了三个Cookie,注释都写的很清楚了三种的区别,然后我们重新访问该servlet:

可以发现,在Response Headers中多出了个Set-Cookie啊,这就是服务器向客户端发出的指令,大部分浏览器都是支持Cookie的,我用的是火狐,可以在浏览器右上角打开菜单–>选项–>隐私–>历史记录–>下拉框选择使用自定义历史记录设置–>显示Cookie,查看到本地保存的Cookie,也有一个简单的方法,在浏览器地址栏输入url访问后,点击网址前面的地球小图标–>更多信息–>安全–>查看Cookie。我们过滤下,看看我们需要的:
Cookie、Session傻傻分不清楚_第1张图片
可以看到本地已经存在了两个Cookie了,temp和user,temp的过期时间为浏览器会话结束,而user的过期时间是一天后,cookie设置为临时的,所以会立即过期,不信?关闭浏览器所有窗口,然后重新打开浏览器,再次查看Cookie,发现只有一个user的值了:

写到这里应该对Cookie有了一个初步的理解了吧,说说怎么修改已存在的Cookie吧,由于response里面只有addCookie方法,所以只有new一个Cookie然后add进去采取覆盖的方式。

Session又是什么鬼

懵ing~~~,Cookie还没弄清楚,Session又是什么鬼啊,呵,待我细细道来,吹牛又不犯法(⊙o⊙)。

上节说到,服务器给客户端分发Cookie,然后客户端第二次访问服务器会将保存的Cookie原封不动地传回给服务器,如果传递的Cookie很多,这样就增加了数据传输量,顺其自然,Session就这样出现了。

当客户端访问某个服务器(貌似是网页,servlet就没有,但是如果在servlet中编写getSession()也可以出现!!)的时候,服务器通常会分发一个JsessionId(JsessionId = session.getId(),过期时间为会话结束)给客户端,用作对客户端的唯一标识,然后客户端保存在会话Cookie中,话不多说,我们新建一个空页面NewFile.jsp,访问看看效果:
Cookie、Session傻傻分不清楚_第2张图片
没骗你们吧,通过查看保存的Cookie值看出JSESSIONID是一个会话Cookie,刷新页面:
Cookie、Session傻傻分不清楚_第3张图片
这样客户端就会通过name为JSESSIONID这个Cookie找到以前在服务端创建的某一个HttpSession对象,这个过程也叫作Session跟踪。来点代码吧,新建一个session的servlet:

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class SessionTest extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        HttpSession session = request.getSession();
        // 设置session有效时间为1天
        session.setMaxInactiveInterval(60 * 60 * 24);
        if (session.isNew()) {
            session.setAttribute("name", "cjt");
            writer.write("新建Session成功");
        } else {
            writer.write(session.getAttribute("name").toString());
        }
    }
}

当第一次访问这个servlet的时候,浏览器会输出“新建Session成功”的字样,刷新网页后,会将先前存的“cjt”输出。这里值得说的是Session是保存在服务器上的,所以浏览器并不能控制Session的创建与销毁,一次会话结束Session就被销毁这句话是不对的。只是因为浏览器第二次访问的时候JSESSIONID改变了(这是个会话Cookie),所以通过getSession()获取的是一个新的Session,先前的暂存在服务器上,到了过期时间(默认是二十分钟)自动销毁。

相比Cookie,Session则简单很多,相信如果认真看下来这边水文,肯定会对Cookie和Session有一个非常熟悉的了解。(^o^)/~,之前总不太清楚这一块,现在终于弄懂了,无情~~

如果再有人问你Cookie和Session有什么区别,我们终于可以大声的告诉他们,Cookie是保存在客户端,Session是保存在服务器了。然而,后续的就是跟他们吹牛了- -。

关于什么Cookie保存中文,如果禁用了Cookie则通过重写URL跟踪Session的,都很好理解,遇到了直接用就可以了,这里就不细讲(我是真细讲不了),到了水文的末尾,拜了个拜。

你可能感兴趣的:(java,java,Web,session,cookie)