day_1_12 JavaWeb系列学习总结之cookie&session

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

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

在浏览器与服务器中间的执行过程:
day_1_12 JavaWeb系列学习总结之cookie&session_第1张图片

在服务器中如何创建一个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" %>

<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:
day_1_12 JavaWeb系列学习总结之cookie&session_第2张图片
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-config>
               <session-timeout>60session-timeout>
         session-config>
完整代码地址

https://github.com/menglanyingfei/Java/tree/master/JavaWebTrain

你可能感兴趣的:(JavaWeb,JavaWeb基础系列学习总结)