day_1_12 cookie&session

cookie&session都是会话跟踪技术.

Cookie

Cookie: 是由服务器创建, 然后通过响应头发送给浏览器, 并且保存在浏览器中, 当浏览器再次访问服务器的时候, 会将Cookie放在请求头中传给服务器.

在浏览器与服务器中间的执行过程:


Cookie.png
在服务器中如何创建一个Cookie?

Cookie cookie = new Cookie(name, value);
示例:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       // 创建一个cookie对象
       Cookie cookie = new Cookie("name", "gouwa");
       // 设置Cookie响应头
       response.addCookie(cookie);
   }
cookie中保存中文

默认情况下, value不能是中文
但是可以通过URL编码, 在Cookie中保存中文!

     //编码: URLEncoder
    static String encode(String s, "utf-8")
     //解码: URLDecoder
     static String decode(String s, "utf-8")

示例代码:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // post请求乱码处理
        request.setCharacterEncoding("utf-8");

        // 获取用户名并且保存到Cookie中
        String username = request.getParameter("username");
        // 编码
        username = URLEncoder.encode(username, "utf-8");

        Cookie cookie = new Cookie("username", username);
        // 设置cookie保存1小时
        cookie.setMaxAge(60 * 60);
        response.addCookie(cookie);
    }

通过response将cookie设置到响应头

    // 常用
    void addCookie(Cookie cookie)
    void setHeader(String name, String value)

响应头:
Set-Cookie:name=gouwa
请求头:

        Cookie:
        JSESSIONID=7AFE4B9766B503964702B0CC7C9C14DE; name=gouwa; ASP.NET_SessionId=2y0jnu5yxbqk0j20luqzca2z;
        ticket=f92223d3477d4a759e195fd41f4e5c6e; Idea-755a90e2=cc8656ab-7ff4-4417-9c64-dd3911e79468;

JSESSIONID=C476C4B2FF9BD2D9572E5F84708A9634
而Session底层是怎样来依赖Cookie的?
sessionid -> JSESSIONID

在服务器中获取浏览器传递过来的Cookie
    // 通过request对象获取
    Cookie[] getCookies()

cookie的示例:
要求: 在登录页面登录一次以后, 可以将用户名保存到登录框中,
第二次登录的时候还有用户名, 用户名不要使用中文!
思路:
1. 表单提交到servlet, 获取到用户名, 将用户名保存到Cookie中,
然后通过响应头发送给浏览器
2. 当再次访问登录的jsp页面时, 将Cookie取出来, 并且显示在用户名的输入框中
实现代码: login.jsp和LoginServlet.java

<%@ page import="java.net.URLDecoder" %>
<%--
  User: menglanyingfei
  Date: 2018/1/12
  Time: 10:13
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>登录</title>
</head>
<body>
    <%-- 获取浏览器发送过来的Cookie
    --%>
    <%
        String value = "";
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                // 判断Cookie的名称是否等于"username"
                if ("username".equals(cookie.getName())) {
                    value = cookie.getValue();
                    // 解码
                    value = URLDecoder.decode(value, "utf-8");
                }
            }
        }
    %>
    <form action="/day_1_12/loginServlet" method="post">

        用户名:<input type="text" name="username" value="<%= value%>">
        <br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

Servlet处理逻辑:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;

/**
 * Created by menglanyingfei on 2018/1/12.
 */
@WebServlet(name = "LoginServlet", value = "/loginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 请求乱码
        request.setCharacterEncoding("utf-8");

        // 获取用户名并且保存到Cookie中
        String username = request.getParameter("username");
        // 编码
        username = URLEncoder.encode(username, "utf-8");

        Cookie cookie = new Cookie("username", username);

        cookie.setMaxAge(60 * 60);
        response.addCookie(cookie);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}
设置Cookie的存活时间

cookie默认当浏览器关闭的时候, 会清除掉.

        setMaxAge(int expiry)
        setMaxAge(1), 以秒为单位, 1小时 = 60 * 60
            表示cookie会保存到本地硬盘中, 关闭浏览器不会消失
        setMaxAge(-1)
            默认情况
        setMaxAge(0)
            表示立即清除cookie
路径问题
  1. 查看路径
    浏览器查看cookie
    cookie.getPath()

  2. cookie路径的特点:
    比如cookie的路径
    /day_1_12/servlet
    第二次访问服务器的路径:
    /day_1_12/CookiePathDemo2
    那么第二次访问访问浏览器, 不会将cookie带给服务器

只有当访问路径包含了Cookie的路径的时候, 浏览器才会将cookie带给服务器

小案例:
获取上次访问的时间
注意:Cookie的value里不能设置非法字符, 如空格
cookie不能跨浏览器.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        // 获取上次访问的时间
        String message = "你是第一次访问该网站";
        Date date = new Date();

//        String time = date.toLocaleString();
        String time = new SimpleDateFormat("yyyy-MM-ddHH:mm:ss").format(date);
        Cookie c = new Cookie("time", time);
        c.setMaxAge(60 * 60);
        response.addCookie(c);

        // 获取cookie
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if ("time".equals(cookie.getName())) {
                    message = "您上次访问该网站的时间是" + cookie.getValue();
                }
            }

        }

        response.getWriter().print(message);
    }

session

HttpSession(非常重要)
什么叫做一次会话?
其中, 包括多次请求. 我们可以理解为打开浏览器, 关闭浏览器看成是一次会话.
一个session对象对应一次会话, 在这个过程中有很多request对象,
但是只有一个session对象.

session依赖cookie保存sessionid:


session依赖cookie保存sessionid.png

HttpSession是一个域对象, 所以肯定有这三个方法:

        setAttribute(name, value)  保存数据
        getAttribute(name)  获取数据
        removeAttribute(name)  删除数据

现在对比三大域对象:
范围:
最大的ServletContext: application
对应于整个项目, 它随着服务器的开启就创建, 服务器关闭就销毁

HttpSession: session
一个session对象伴随着一次会话, 只要浏览器不关闭或者没有超过session最大存活时间, session对象就一直存在.
HttpServletRequest: request
一个request对象对应一次请求, 只有在转发的时候, 才能使用
request作为域对象传输数据

获取session对象
  1. 在jsp页面中, session对象不需要获取, 直接使用即可
  2. 在servlet中, 使用request对象获取
HttpSession session = request.getSession()
HttpSession session = request.getSession(boolean create);

如果create 为true, 那么和不带参数是一样的, 如果没有当前会话并且 create 为 true,则返回一个新会话。
如果b为false, 那么有session就直接获取, 没有session就返回null.

常用API以及配置session存活时间
    getId():  获取session的id号
    long getCreationTime() :
        获取session的创建时间返回一个当前时间的毫秒值
    getLastAccessedTime()
        获取最后的活动时间

     (***)
     int getMaxInactiveInterval()
    获取session的最大不活动时间
      void invalidate()
      销毁session, 一般用来做退出按钮

      setMaxInactiveInterval(int interval)
      设置session的最大不活动时间, 还可以在web.xml文件中
      配置最大不活动时间

       <!--配置session最大不活动时间, 以分钟为单位 -->
         <session-config>
               <session-timeout>60</session-timeout>
         </session-config>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容