学习笔记-会话技术Cookie&Session

本文深入探讨了会话技术,包括客户端会话技术Cookie和服务器端会话技术Session的工作原理、使用步骤、细节处理以及应用场景。重点讲解了Cookie的创建、发送、接收过程,以及Session在一次会话中共享数据的机制。

会话技术

会话:一次会话中包含多次请求和响应
一次会话:浏览器第一次给服务器资源发送请求会话建立,直到有一方断开会话结束

功能:在一次会话的范围内的多次请求间共享数据

方式:
1.客户端会话技术Cookie
2.服务器端会话技术Session

Cookie

概念:客户端会话技术,将数据保存到客户端

使用步骤:
1.创建Cookie对象,绑定数据
new Cookie(String name ,String value)
2.发送Cookie对象
response.addCookie(Cookie cookie)
3.获取Cookie,接收数据
Cookie[] request.getCookies()

原理
服务器第一次创建cookie并发送给浏览器是通过set-Cookie响应头将数据发送给浏览器并保存,服务器从浏览器获取Cookie是通过将请求头Cookie发给服务器。

细节
1.一次可以发送多个cookie,使用response调用多次addCookie方法即可
2.Cookie的保存时间
1.默认情况下当浏览器关闭后,Cookie被销毁
2.持久化存储:setMaxAge(int seconds)
参数的取值:

  1. 整数:代表将Cookie数据写到硬盘的文件中持久化存储,参数代表Cookie的存储时间,到时间后会自动删除Cookie
  2. 负数:代表默认值,即关闭浏览器Cookie被销毁
  3. 零:代表删除Cookie消息

3.在tomcat8版本之前Cookie不能直接存储中文数据(解决:将中文数据转码,一般采用URL编码),但是在tomcat8版本之后Cookie可以直接存储中文数据,一些特殊字符还是不支持
建议:使用URL编码存储Cookie,使用URL解码解析Cookie
使用URLEncoder.encode(String value,String charset)编码
使用URLDecoder.decode(String value,String charset)解码

4.Cookie共享问题

  1. 在一个tomcat下部署了多个web项目默认情况下Cookie不能共享
  2. setPath(String path):设置Cookie的获取范围,默认情况下设置当前项目的虚拟目录
  3. 若设置cookie.setPath("/")(斜杠代表当前项目的根路径),则服务器中的多个web项目可以共享Cookie
  4. 不同tomcat服务器间cookie共享
    若设置cookie.setdomain(“一级域名”),则一级域名相同的多个服务器可以共享Cookie
    例:teiba,baidu.com和news.baidu.com若设置cookie.setdomain(".baidu.com")则可以共享Cookie,一级域名:".baidu.com",二级域名:"teiba"和”news“

特点
1.cookie存储数据在客户端浏览器
2.浏览器对于单个cookie的大小有限制(4kb),以及对同一个域名下的cookie数量有限制(20)
作用
1.cookie一般用于存储少量不太敏感的数据
2.在不登陆的情况下完成服务器对客户端的身份识别

案例
需求:
1.访问一个servlet,如果是第一次访问则提示:您好,欢迎您首次访问
2.如果不是第一次访问,则提示:欢迎回来,您上次的访问时间为:显示时间字符串
分析:
1.采用Cookie来完成
2.在服务器中的Servlet判断是否有一个名为lastTime的cookie
1.有,不是第一次访问

  1. 响应数据:欢迎回来,您上次的访问时间为:显示时间字符串
  2. 写回当前时间给cookie

2.没有,第一次访问

  1. 响应数据:您好,欢迎您首次访问

  2. 写回当前时间给cookie
    例:

     package com.fengqi.web.instance;
    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;
    
    
    /**
     * @Author: NieFengQi
     * @Date: 2019/8/1 19:58
     * @Decription:
     */
    @WebServlet("/cookieTest")
    public class CookieTest extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //设置响应数据字符集
            response.setContentType("text/html;charset=utf-8");
            //没有cookie为lastTime
            boolean flag = false;
            //获取cookie
            Cookie[] cookies = request.getCookies();
            if (cookies != null && cookies.length != 0){
                //遍历cookie
                for (Cookie cookie : cookies) {
                    //若存在lastTime的cookie
                    if ("lastTime".equals(cookie.getName())){
                        flag = true;//存在lastTime则标记为true
    
                    //响应数据到页面
                    String value = cookie.getValue();
                    value = URLDecoder.decode(value,"utf-8");
    
                    response.getWriter().write("<h1>欢迎回来,您上次的访问时间为:"+value+"</h1>");
    
    
                    //获取当前时间,并设置本地格式
                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                    String str_date = sdf.format(date);
                    //使用URL编码str_date
                    str_date = URLEncoder.encode(str_date, "utf-8");
                    //将编码后的时间字符串写回cookie
                    cookie.setValue(str_date);
                    //设置cookie存活时间,并响应回去
                    cookie.setMaxAge(60 * 60 * 24 * 30);
                    response.addCookie(cookie);
                    //跳出循环
                    break;
                }
            }
        }
        if (cookies == null || cookies.length == 0 || flag == false){
    
            //获取当前时间,并设置本地格式
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd天 HH:mm:ss");
            String str_date = sdf.format(date);
            //使用URL编码str_date
            str_date = URLEncoder.encode(str_date, "utf-8");
            //创建名为lastTime的Cookie
            Cookie cookie = new Cookie("lastTime", str_date);
            //设置cookie存活时间,并响应回去
            cookie.setMaxAge(60 * 60 * 24 * 30);
            response.addCookie(cookie);
    
            //响应数据到页面
            response.getWriter().write("<h1>您好,欢迎您首次访问</h1>");
            
        }
       }        
       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
        }
     }
    

JSP入门

jsp:java server page java服务器端页面
一个特殊的页面,其中既可以定义java代码,也可以直接定义html标签
用于简化书写

原理:JSP本质就是一个Servlet

jsp的脚本:定义java代码的方式
1.<% java代码 %>:定义的java代码在service方法中,service方法中可以定义什么该脚本就可以定义什么
2.<%! java代码 %>:定义的java代码在jsp转换后的java类的成员位置,可以定义成员变量和成员方法以及代码块(使用较少)
3.<%= java代码 %>:这个脚本相当于输出语句,会将java代码输出到页面,输出语句可以定义什么,该脚本就可以定义什么

jsp的内置对象:在jsp页面不需要获取和创建就可以直接使用的对象
jsp一共有九个内置对象:request、response、out(字符输出流对象)等
out:out.writer类似于response.getWriter(),两者区别:在tomcat响应数据到页面之前,会先找response的缓冲区,再找out的缓冲区;因此response.getWriter()输出的数据永远在out.writer之前

Session

服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象(HttpSession)中

HttpSession对象的常用方法:

Object  getAttribute(String name)
void  setAttributte(String name,Object value)
void  removeAttribute(String name)

原理
session是依赖于cookie的,当一次获取session时响应头中会包含一个set-cookie,set-cookie中包含了一个JSESSIONID的键值对,它可以确保session的唯一性,当第二次获取session时请求头cookie中也包含了JSESSIONID的键值对

细节
1.当客户端关闭后服务器不关闭,两次获取的session默认情况下不是同一个,因为客户端关闭后一次会话已经结束;如果需要相同则可以创建Cookie,键设置为JSESSIONID,值设置为session.getId(),并设置Cookie的存活时间,这样在Cookie的存活时间内,可以让两次获取为同一个sesson
2.客户端不关闭服务器关闭后,两次获取的session默认情况下不是同一个,因为服务器关闭后一次会话已经结束
服务器关闭后为确保数据不会丢失:
session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上
session的活化:在服务器启动后,将session文件转化为内存中的session对象
tomcat会自动完成session的钝化(session对象的序列化)和session的活化(session对象的反序列化),并将session文件存在work目录下,这样就可以确保数据不会丢失;而idea编辑器关闭服务器后也会创建session文件存在work目录下,但是重新启动后会把work目录删除并创建新的work目录,这样session中数据就丢失了
3.销毁session的方式

  1. 服务器关闭
  2. 调用invalidate()方法
  3. session的默认失效时间为30分钟(可以在tomcat的web.xml文件中配置session-config设置session的默认失效时间,tomcat的web.xml文件为所有项目的父文件,或者在当前项目的web.xml中配置)

特点
1.用于存储一次会话多次请求间的数据,存在服务器端
2.session可以存储任意类型任意大小的数据

session与cookie的区别
1.session存储数据在服务器端,cookie存储数据在客户端
2.session没有数据类型,数据大小的限制,而cookie有
3.session数据安全,而cookie相对于不安全

验证码案例
需求:
1.访问带有验证码的登录页面login.jsp
2.用户输入用户名、密码及验证码
如果用户名和密码输入有误,则跳转到登陆页面,提示:用户名或密码错误
如果验证码输入有误,则跳转到登陆页面,提示:验证码错误
如果全部输入正确,则跳转到主页success.jsp,显示用户名,欢迎您

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值