Cookie Session简单入门

为什么会有cookie和session?

由于客户端访问web页面一般分为三步:
1、客户端发起请求
2、服务器接收请求返回响应
3、客户端接收响应
由于http协议,各个请求响应之间的数据不能相互传递,所以就有了cookie和session用来在浏览器访问服务器的进程中保存数据和传输数据。

Cookie

1、cookie原理及细节

原理

Cookie基于响应头set-cookie和请求头cookie实现
例如bilibili:
在这里插入图片描述

在这里插入图片描述
我们可以看到在网页中cookie数据传输是利用“name=value”键值对方式实现的
相当于每次请求和响应都会带着cookie中这些键值对信息,方便前后端根据name调用cookie中value值。

细节

cookie存储中文数据:在tomcat8之后,cookie可以存储中文数据
如果想要一次存储多个cookie,需要设置多个cookie对象,使用response调用多次addcookie方法发送cookie
Cookie存储数据在客户端浏览器
浏览器对于单个cookie的大小有限制(4kb)以及对同一个域名下的总cookie数量也有限制(20个)
作用:
Cookie一般用于存储少量的不太敏感的数据
在不登陆的情况下,完成服务器对客户端的身份识别

2、cookie代码简单实现

package com.example.cookieandsession;

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;

@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie c = new Cookie("msg","hello");
        resp.addCookie(c);

    }
}

上面展示了如何创建一个新的cookie并且发送cookie的代码

3、cookie方法解析

获得cookie:

package com.example.cookieandsession;

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;

@WebServlet("/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie []cs = req.getCookies();
        if(cs!=null){
            for (Cookie c : cs) {
                String name = c.getName();
                String value = c.getValue();
                System.out.println(name+":"+value);//从cookie中获取键值对并打印
            }
        }
    }
}

设置cookie存活时间:

package com.example.cookieandsession;

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;

@WebServlet("/CookieDemo3")
public class CookieDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie c1 = new Cookie("msg","setMaxAge");
        c1.setMaxAge(30);//设置时间为30秒
        resp.addCookie(c1);
    }
}

调用setMaxAge方法设置cookie的存活时间,单位是秒。该方法会使cookie存储到硬盘中,即使浏览器关闭也会持久性保存
如果设置为负值(默认值)cookie寿命与浏览器相同
如果设置为0,则销毁该cookie

设置cookie作用范围:
假设在一个服务器中部署了多个web项目,要想在这些web项目中共用同一个cookie,可以调用setPath(String path):设置cookie的获取范围,如果要共享,可以将path设置为“/”。

4、基于cookie实现用户自动登录以及显示用户上次登录时间

自动登录案例:

package servlet;

import dao.UserDao;
import domain.User;

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;

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        //获取参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String auto = req.getParameter("auto");//接收参数看用户是否选择了自动登录选项
        if(auto!=null&&auto.equals("yes")){
        //如果选择,则在cookie中添加username
            Cookie cookieuser = new Cookie("username",username);
            cookieuser.setMaxAge(60*60*24*7);//七天
            resp.addCookie(cookieuser);
        }else{
        //如果选择了否,则清理cookie
            Cookie cookie = new Cookie("username",username);
            cookie.setMaxAge(0);
        }

    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }
}

用于接收cookie的代码:

Cookie []cookies = request.getCookies();//获取cookie
String username = null;
    for (Cookie cookie : cookies) {
    //如果用户选择了自动登录,则会生成一个寿命为一周,name为username的cookie
        if(cookie.getName().equals("username")){
            username = cookie.getValue();
        }
    }
    if(username!=null){
    //如果接收到了username,则重定向到已经登陆的页面
        response.sendRedirect("/image/home.jsp?username="+username);
    }else{
    //如果没有,则重定向到未登陆的页面
        response.sendRedirect("/image/notlogin.jsp");
    }

登陆页面弹出上次登录时间案例:

package com.example.cookieandsession;

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.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet("/CookieTest")
public class CookieTest extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie []cookies = req.getCookies();
        boolean flag = false;
        if(cookies!=null&&cookies.length>0){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                if("lastTime".equals(name)){
                    resp.setContentType("text/html;charset=utf-8");
                    //有cookie,说明不是第一次访问
                    //获取cookie的事件并输出(网页输出)
                    String value = cookie.getValue();
                    //解码
                    value = URLDecoder.decode(value,"utf-8");

                    resp.getWriter().write("<h1>欢迎回来!你上次访问的时间为:"+value+"</h1>");
                    flag = true;
                    //设置Cookie的value
                    //获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                    //URL编码

                    String str_date = sdf.format(date);
                    str_date = URLEncoder.encode(str_date,"utf-8");
                    //重新设置cookie的value
                    cookie.setValue(str_date);
                    //设置cookie的存活时间
                    cookie.setMaxAge(60*60*24*30);
                    //重新发送cookie
                    resp.addCookie(cookie);


                    break;
                }


            }
        }
        if(cookies==null||cookies.length==0||flag==false){
            //没有,第一次访问
            //有cookie,说明不是第一次访问
            resp.setContentType("text/html;charset=utf-8");
            //设置Cookie的value
            //获取当前时间的字符串,重新设置Cookie的值,重新发送cookie

            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");

            String str_date = sdf.format(date);
            Cookie cookie = new Cookie("lastTime",str_date);
            str_date = URLEncoder.encode(str_date,"utf-8");
            cookie.setValue(str_date);

            //设置cookie的存活时间
            cookie.setMaxAge(60*60*24*30);
            resp.addCookie(cookie);
            String value = cookie.getValue();
            //解码
            value= URLDecoder.decode(value,"utf-8");
            resp.getWriter().write("<h1>您好!欢迎您首次访问!"+value+"</h1>");

        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }
}

Session

1、session原理及细节

原理:session是依赖于cookie的,当客户端访问服务器时,服务器会生成一个session对象,同时在cookie中添加一个JSSIONID,也就是session名,服务器底端会通过这个ID查找到服务器中对应的session对象以及数据。
细节:
session的默认失效时间是三十分钟, 如果想要设置session的失效时间,可以在tomcat的conf\web.xml中设置

<session-config>
	<session-timeout>30</session-timeout>
<session-config>

更改sessiontime中的值就行。

2、session代码简单实现

package Session;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取Session
        HttpSession session = req.getSession();
        //存储数据
        session.setAttribute("msg","hello,session");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }
}

cookie与session的区别

session存储数据在服务器端,cookie在客户端
1、session存储数据在服务器端,cookie在客户端
2、session没有数据大小限制,cookie有
3、session数据安全,cookie相对于没有那么安全

尾言:四月计划安排

这阶段任务很赶很繁重,而且蓝桥杯考完第二天小组就要考核,虽说学习任务紧赶慢赶学完了,但是算法落下不少,所以四月份打算在算法上多分配一些时间,争取明年冲个省一,其次就是每天按时睡觉作息规律一些,这阶段差点累死我。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值