3.cookie&session

Cookie&Session

1 Cookie

1 什么是Cookie?
  • Cookie是servlet发送给浏览器保存键值对的一种技术。
  • 每个Cookie的大小限定在4kb中。
  • 客户端有了Cookie后,每次请求都会发送给服务器。
2 cookie的基本操作

1 如何创建Cookie对象

1)图解在这里插入图片描述
2)代码实现:

protected void createCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Cookie cookie1 = new Cookie("key1","value1");
    response.addCookie(cookie1);
    Cookie cookie2 = new Cookie("key2","value2");
    response.addCookie(cookie2);
    Cookie cookie3 = new Cookie("key3","value3");
    response.addCookie(cookie3);
    response.getWriter().write("cookie创建成功");
}

2 服务端如何获取Cookie

代码实现:

//获取cookie
protected void getCookies(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Cookie[] cookies = request.getCookies();
    Cookie key1 = CookieUtils.findCookie("key1", cookies);
    System.out.println(key1);
  	response.getWriter().write(key1.getName()+"=="+key1.getValue()+"<br />");
}
//CookieUtils的实现
public class CookieUtils {
    public static Cookie findCookie(String name,Cookie[] cookies){
        if (name==null||cookies==null||cookies.length==0){
            return null;
        }
        for (Cookie cookie :
                cookies) {
            if (name.equals(cookie.getName())){
                return cookie;
            }
        }
        return null;
    }
}

3 如何修改Cookie的值

方案一:

  • 创建一个与要修改的同名的Cookie对象。
  • 在构造器中,同时赋予新的Cookie值。
  • 调用response.addCookie(cookie)让客户端保存cookie。
protected void updateCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Cookie cookie3 = new Cookie("key1","valueReplace");
    response.addCookie(cookie3);
    response.getWriter().write("cookie修改成功");
}

方案二:

  • 遍历找到需要修改的Cookie对象。
  • 调用setValue方法赋予新的Cookie值。
  • 调用response.addCookie()来通知客户端保存修改。
protected void updateCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Cookie[] cookies = request.getCookies();
    Cookie key1 = CookieUtils.findCookie("key1", cookies);
    if (key1!=null){
        key1.setValue("replaceValue");
        response.addCookie(key1);
    }
}

注意:该方案修改Cookie的值,不可以包含空格,方括号,圆括号,等号,逗号等,如果需要使用这些符号,应先对其进行base64编码。

3 Cookie的生命周期

setMaxAge();设置cookie的最大生存时间,单位是秒。

  • 正数:指定的秒数后删除。
  • 负数:浏览器一关闭,cookie就被删除(默认-1)。
  • 0:表示马上删除cookie
protected void defaultLife(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Cookie cookie = new Cookie("keyn","valuen");
    //设置存活时间:浏览器关闭则销毁
    cookie.setMaxAge(-1);
    response.addCookie(cookie);
}
protected void zeroLife(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Cookie[] cookies = request.getCookies();
    Cookie key1 = CookieUtils.findCookie("key1", cookies);
    //设置存活时间:立即删除
    key1.setMaxAge(0);
    response.addCookie(key1);
}
protected void timeLife(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Cookie[] cookies = request.getCookies();
    Cookie key1 = CookieUtils.findCookie("key2", cookies);
    //设置存活时间:一个小时
    key1.setMaxAge(60*60);
    response.addCookie(key1);
}
4 Cookie有效路径Path的设置

作用:可以用来有效地过滤哪些Cookie可以发送给服务器,哪些不发送。path属性通过请求的地址来进行有效的过滤。

  • CookieA path=/工程路径
  • CookieB path=/工程路径/abc

请求地址如下:

  • http://ip:port/工程路径/a.html
  • CookieA 发送
  • CookieB 不发送
  • http://ip:port/工程路径/abc/a.html
  • CookieA 发送
  • CookieB 发送

注意:如果不设置cookie,则默认路径为项目下。

5 免用户名登陆实现

在这里插入图片描述
前端代码实现:

用户名:
密码:

后台代码实现:


protected void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    if ("admin".equals(username)&&"admin".equals(password)){
        Cookie username1 = new Cookie("username", username);
        username1.setMaxAge(60*60*24*7);
        response.addCookie(username1);
        Cookie password1 = new Cookie("password", password);
        password1.setMaxAge(60*60*24*7);
        response.addCookie(password1);
        System.out.println("登陆成功!!!");
    }else {
        System.out.println("登陆失败!!!");
    }
}

2.Session会话

1 什么是Session会话?
  • session是一个接口(HttpSession)。
  • session就是会话,用来维护一个客户端和服务器关联的一种技术。
  • 每个客户端都有自己的一个Session会话。
  • Session我们经常用来保存用户登陆之后的信息。

注意:cookie是在客户端,session则是在服务器端。

2 如何创建Session和获取
  • 获取和创建Session

    request.getSession():第一次调用是创建,之后是获取。为了得知当前Session是新创建的还是以前创建的,可以使用isNew()来进行判断。

注意:每个会话都有一个SessionId,而且id值是唯一的。使用getId()来获取Session的id。

3 Session域对象
  • request.getSession().setAttribute(“key1”,“value1”);
  • Object key1 = request.getSession().getAttribute(“key1”);
  • response.getWriter().write(“从Session中获取的值为:”+key1);
4 Session的生命周期
  • public void setMaxInactiveInterval(int interval):设置 Session 的超时时间(以秒为单位),超过指定的时长,Session就会被销毁。

    • 值为正数时,设定Session的超时时长。
    • 值为负数,表示用不超时(极少使用)。
  • public int getMaxInactiveInterval():获取 Session 的超时时间

  • public void invalidate():让当前 Session 会话无效,然后解除绑定到他的任何对象。

注意:因为在Tomcat服务器的配置文件web.xml中默认有以下的配置,它就表示配置了当前Tomcat服务器下所有的Session超时配置默认时长为:30 分钟。

30

我们可以通过自己web.xml文件来修改所有的Session默认时长。使用上面的API可以用来设置个别Session的时长。
在这里插入图片描述

protected void deleteNow(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    HttpSession session = request.getSession();
    //session立即无效
    session.invalidate();
    response.getWriter().write("当前session立即无效:"+session.getMaxInactiveInterval());
}
protected void life3(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    HttpSession session = request.getSession();
    //设置该session3秒后超时
    session.setMaxInactiveInterval(3);
    //session立即无效
    session.invalidate();
    response.getWriter().write("当前session已经设置为3s后超时:"+session.getMaxInactiveInterval());
}
protected void defaultLife(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    HttpSession session = request.getSession();
    //1800s==30分钟
    response.getWriter().write("默认的超时时长为:"+session.getMaxInactiveInterval());
}
5 浏览器和Session之间关联的技术内幕

在这里插入图片描述

拓展

1 cookie的区别

都是为了解决http的无状态的特性的。

区别:

  • cookie是保存在客户端,session保存在服务器端。
  • 默认情况下:cookie在浏览器关闭的时候被销毁,session的默认生命时间是30分钟。

2 Base64编码

package com.atguigu.test;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.io.IOException;

public class Base64Test {
    public static void main(String[] args) throws IOException {
        String content="这是base64编码的内容";
        //创建一个Base64的编码器
        BASE64Encoder base64Encoder = new BASE64Encoder();
        //执行base64的编码操作
        String encode = base64Encoder.encode(content.getBytes());
        //6L+Z5pivYmFzZTY057yW56CB55qE5YaF5a65
        System.out.println("编码之后:"+encode);
        //创建base64解码器
        BASE64Decoder base64Decoder = new BASE64Decoder();
        //执行解码操作
        byte[] bytes = base64Decoder.decodeBuffer(encode);
        String decode = new String(bytes,"utf-8");
        System.out.println("译码之后:"+decode);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值