Cookie-JSP-Session

Cookie-Session:会话技术

会话:客户端和服务器端的对话,一次会话中包含多次请求和响应。

    *一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到一方断开为止。

    *会话用于在一次会话过程中共享数据

共享数据的方式

1.客户端会话技术:Cookie

2.服务器端会话技术:Session

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

Cookie原理

基于相同头set-cookie和请求头cookie实现

响应中设置响应头,浏览器将头中的数据保存在浏览器上。

第二次请求中浏览器自动将请求头cookie发送,服务器利用api直接获取数据,不需要再单独对请求头操作简化开发

使用步骤

1.创建Cookie对象,绑定数据

new Cookie(String name,String value)

2.发送Cookie对象

response.addCookie(Cookie cookie)

3.获取Cookie对象,拿到数据

request.getCookie() 返回一个Cookie数组,拿到所有的Cookie

@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie c = new Cookie("msg","hello");
        //2.发送Cookie
        response.addCookie(c);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //3. 获取Cookie
        Cookie[] cs = request.getCookies();
        //获取数据,遍历Cookies
        if(cs != null){
            for (Cookie c : cs) {
                String name = c.getName();
                String value = c.getValue();
                System.out.println(name+":"+value);
            }
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

cookie的细节

1.一次可不可以发送多个cookie?

@WebServlet("/cookieDemo3")
public class CookieDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建Cookie对象,创建多个即可
        Cookie c1 = new Cookie("msg","hello");
        Cookie c2 = new Cookie("name","zhangsan");
        //2.发送Cookie
        response.addCookie(c1);
        response.addCookie(c2);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

2.cookie在浏览器中保存多久?

1.默认情况下,浏览器关闭即被销毁。

2.设置进行持久化处理 Cookie对象的方法:setMaxAge(int seconds)

@WebServlet("/cookieDemo4")
public class CookieDemo4 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie c1 = new Cookie("msg","setMaxAge");
        //2.设置cookie的存活时间
        //c1.setMaxAge(30);//将cookie持久化到硬盘,30秒后会自动删除cookie文件
        //c1.setMaxAge(-1);//默认值
        //c1.setMaxAge(300);
        c1.setMaxAge(0);//删除Cookie信息
        //3.发送Cookie
        response.addCookie(c1);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

3.cookie可不可以使用中文?

tomcat8之前不可,8后可以。

4.cookie获取范围多大?

若tomcat中部署了多个项目,在不同项目中是获取不到对方的cookie信息的(默认情况)。

setPath(String path):设置cookie的范围,默认是设置当前的虚拟目录,若要共享则将path设置为“/”

@WebServlet("/cookieDemo5")
public class CookieDemo5 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie c1 = new Cookie("msg","你好");
        //设置path,让当前服务器下部署的所有项目共享Cookie信息
        c1.setPath("/");

        //3.发送Cookie
        response.addCookie(c1);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

不同的tomcat间的共享问题

     调用setDomain(String path)设置域名,如果设置一级域名相同则多个服务器之间的cookie可以共享。

Cookie特点和作用

1.cookie存储数据在客户端浏览器

2.浏览器对单个cookie的大小有限制,以及对同一个域名下的cookie数量也有限制

作用

1.用于少量不敏感的数据

2.在不登录的情况下,完成服务器对客户端的身份识别(比如浏览百度页面设置字体这些,没登陆下一次搜索也会是改后的情况)。

Cookie案例

记住上一次访问的时间

需求:

1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。

2. 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串

分析:

1. 可以采用Cookie来完成

2. 在服务器中的Servlet判断是否有一个名为lastTime的cookie

         *1. 有:不是第一次访问
                    1. 响应数据:欢迎回来,您上次访问时间为:2021年04月10日11:50:20
                    2. 写回Cookie:lastTime=2021年04月10日11:50:01

         *2. 没有:是第一次访问
                    1. 响应数据:您好,欢迎您首次访问
                    2. 写回Cookie:lastTime=2021年04月10日11:50:01

package cn.itcast.cookie;

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;

/**
 在服务器中的Servlet判断是否有一个名为lastTime的cookie
 1. 有:不是第一次访问
     1. 响应数据:欢迎回来,您上次访问时间为:2018年6月10日11:50:20
     2. 写回Cookie:lastTime=2018年6月10日11:50:01
 2. 没有:是第一次访问
     1. 响应数据:您好,欢迎您首次访问
     2. 写回Cookie:lastTime=2018年6月10日11:50:01

 */

@WebServlet("/cookieTest")
public class CookieTest extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应的消息体的数据格式以及编码
        response.setContentType("text/html;charset=utf-8");

        //1.获取所有Cookie
        Cookie[] cookies = request.getCookies();
        boolean flag = false;//没有cookie为lastTime
        //2.遍历cookie数组
        if(cookies != null && cookies.length > 0){
            for (Cookie cookie : cookies) {
                //3.获取cookie的名称
                String name = cookie.getName();
                //4.判断名称是否是:lastTime
                if("lastTime".equals(name)){
                    //有该Cookie,不是第一次访问

                    flag = true;//有lastTime的cookie

                    //设置Cookie的value
                    //获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
                    Date date  = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                    String str_date = sdf.format(date);
                    System.out.println("编码前:"+str_date);
                    //URL编码 解决tomcat对特殊字符造成的错误
                    str_date = URLEncoder.encode(str_date,"utf-8");
                    System.out.println("编码后:"+str_date);
                    cookie.setValue(str_date);
                    //设置cookie的存活时间 持久化存储
                    cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
                    response.addCookie(cookie);


                    //响应数据
                    //获取Cookie的value,时间
                    String value = cookie.getValue();
                    System.out.println("解码前:"+value);
                    //URL解码: 因为前面编码了,所以得对应接嘛否则读取不到
                    value = URLDecoder.decode(value,"utf-8");
                    System.out.println("解码后:"+value);
                    response.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+value+"</h1>");


                    break;

                }
            }
        }


        if(cookies == null || cookies.length == 0 || flag == false){
            //没有,第一次访问

            //设置Cookie的value
            //获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
            Date date  = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String str_date = sdf.format(date);
            System.out.println("编码前:"+str_date);
            //URL编码 解决tomcat对特殊字符造成的错误
            str_date = URLEncoder.encode(str_date,"utf-8");
            System.out.println("编码后:"+str_date);

            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

概念:JAVA服务器端页面,可以理解为一个特殊的页面。其中既可以定义jsp标签又可以编写JAVA代码。用于简化书写。

原理:本质上是一个Servlet(只有Servlet的JAVA内容能被外界知晓)。

JSP的脚本:JSP定义JAVA代码的方式

1.<% 代码 %>:定义的代码在service中,可以定义service中可以定义的东西。

2.<%! 代码 %>:定义的JAVA代码在JSP转换后的JAVA类的成员位置(成员变量,成员方法)。

3.<%= 代码 %>:输出语句,会把代码的值输出到页面上。输出语句中可以定义什么,脚本中就可以定义什么

JSP的内置对象:在JSP页面中不需要创建和获取,可以直接使用的对象。

1.request

2.response

3.out:可以将数据输出到页面上。和response.getWriter()类似。

     *response定义的输出会先于Out输出。

Session

概念:服务器端会话技术,在一次会话(关闭浏览器就没了)的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession。

快速入门:

1.获取HttpSession对象:

      HttpSession session = request.getSession();

2.HttpSession对象

      Object getAttribute(String name)

      void setAttribute(String name,Object value)

      void removeAttribute(String name)

@WebServlet("/sessionDemo1")
public class SessionDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用session共享数据

        //1.获取session
        HttpSession session = request.getSession();
        //2.存储数据
        session.setAttribute("msg","hello session");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}
@WebServlet("/sessionDemo2")
public class SessionDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用session获取数据

        //1.获取session
        HttpSession session = request.getSession();
        //2.获取数据
        Object msg = session.getAttribute("msg");
        System.out.println(msg);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

Session原理

Session是依赖于Cookie的。服务器通过Cookie确保Session对象是同一个(用ID)

Session的细节

1.当客户端关闭后,服务器不关闭,两次关闭的session不是同一个

默认情况下不是,客户端关闭默认会话结束,所以不是同一个。

若想要客户端关闭后session也能一样,可以创建一个cookie(JSESSIONID,session.getId());然后设置cookie的存活时间,最后response.addCookie()即可。

2.客户端不关闭,服务器关闭后,两次获取的session

不是同一个,因为服务器关闭后内存中的session被销毁了。要确保数据不丢失可以使用钝化和活化(tomcat自动解决)。

session的钝化:在服务器关闭前将session对象系列化到硬盘上

session的活化:在服务器启动后,将session文件转化到内存中的session对象即可。

3.session的失效时间

1.服务器关闭

2.session对象调用invalidate()自杀。

3.session默认失效时间30min。tomcat中可以配置。

session的特点

1.session用于存储一次会话的多次请求的数据,存在服务器端。

2.session可以存储任意类型,任意大小的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值