会话技术之Cookie

1.会话技术

为了实现某一功能,浏览器和服务器之间可能会发生多次的请求和响应,从浏览器访问服务器开始,到最后访问服务器结束为止,期间产生的所有的请求和响应加在一起,称之为一次会话。

2.Cookie

2.1.cookie概述:

cookie是将会话中产生的数据存储在客户端。

过程描述:

浏览器向服务器发送请求,请求中包含需要保存的数据,服务器获取数据,通过set-cookie响应头将数据响应给浏览器,让浏览器自己保存。浏览器再次访问服务器时,在请求中,通过cookie请求头携带保存的数据,服务器可以通过获取cookie请求头获取数据,通过这种形式保存了会话中产生的数据。

2.2.实现Cookie

sun公司提供了一套Cookie的API

Cookie cookie = new Cookie(String name,String value);
//获取cookie的名字
cookie.getName(); 
//获取cookie的value值
cookie.getValue(); 

将cookie添加到response中进行响应,发给浏览器

response.addCookie(cookie)

从请求中获取cookie

//返回的是多个cookie组成的数组
Cookies[] cookies = request.getCookies(); 

注意:如果请求中没有cookie,返回值为null

2.3设置cookie存活时间

cookie默认是会话级别的,即保存在浏览器的内存中,如果浏览器关闭,随着浏览器内存的释放,cookie 也随之丢失

设置cookie存活时间:

//该方法可以设置cookie的存活时间,单位为秒
setMaxAge(int sec);
//单位是秒  60*60*24*30是一个月,下面设置的就是1个小时
cookie.setMaxAge(60*60);

一旦设置了这个方法,cookie就会存储在浏览器对应的磁盘上

2.4设置cookie路径

//设置cookie的路径,通常设置为当前web应用的路径
setPath(String path); 

该路径就是提交cookie时指定的路径,即当访问这个路径及子路径时会携带cookie请求头

2.5删除cookie

没有删除cookie的API,如果想删除cookie,可以向浏览器发送一个同名、同path的cookie,并设置存活时间为0,这样就可以删除cookie,因为同名同path的cookie覆盖了之前的cookie,而由于生存时间为0,会马上删除

2.6cookie中 maxAge设置为负值 和0的区别

setmaxage(-1) :设置为负值的话,则为浏览器进程Cookie(内存中保存),关闭浏览器就失效;如果设置为0,则立即删除该Cookie。

3.代码示例

说明:代码中中英文混杂是为了测试设置的编码格式是否生效。

CookieServlet类实现了将时间加入cookie(即记录访问的时间),设置cookie的存活时间,设置cookie的路径,遍历数组获取上次的访问时间等


@WebServlet(name = "CookieServlet",urlPatterns = "/cookiedemo1")
public class CookieServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置编码 防止中文乱码
        response.setContentType("text/html;charset=utf-8");
        //显示上次的访问时间
        //1.记录本次访问时间
        //获取当前时间 过时的时间,且中间有空格  tomcat8不能正常运行
        //String date = new Date().toLocaleString();

        /日期测试-start
        //方式一
        Date date1 = new Date();
        //重新设置时间
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        String date_time = df.format(date1);
        System.out.println("SimpleDateFormat时间:"+date_time);
        //方式二 此处只是说明 日期的另外一种设置方式,没有其他什么用处
        String format = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
        System.out.println("format:"+format);
        ///日期测试-end

        //将时间加入cookie
        Cookie cookie = new Cookie("time",date_time);

        //设置cookie的存活时间
        //单位是秒  60*60*24*30是一个月,下面设置的就是1个小时
        cookie.setMaxAge(60*60);

        //设置cookie的路径
        cookie.setPath(request.getContextPath()+"/");

        //将cookie添加到response中
        response.addCookie(cookie);

        //2.获取上次的访问时间
        //获取请求头中的cookie
        Cookie[] cookies = request.getCookies();
        boolean flag = true;
        //遍历数组
        if (cookies!=null){
            for (Cookie c: cookies
                 ) {
                //获取cookie的名字
                String name = c.getName();
                if ("time".equals(name)){
                    //如果找到名字为time的cookie,则将时间响应给浏览器
                    response.getWriter().write("最后访问时间(last time):"+c.getValue());
                    flag = false;
                }
            }
        }
        //没有找到名字为time的cookie,说明是第一次访问,没有cookie
        if (flag){
            response.getWriter().write("first come!欢迎!");
        }
    }
}

运行结果如下,通过浏览器可以查询到设置的cookie

ServletCookieDemo2 类 实现了删除cookie的方法

@WebServlet(name = "ServletCookieDemo2",urlPatterns = "/cookiedemo2")
public class ServletCookieDemo2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置编码
        response.setContentType("text/html;charset=utf-8");
        //删除cookie
        Cookie cookie =new Cookie("time","");
        cookie.setPath(request.getContextPath()+"/");
        cookie.setMaxAge(0);
        response.addCookie(cookie);
        response.getWriter().write("cookie已经delete");
    }
}

运行后,通过浏览器,可以检查到,之前设置的cookie 已经被删除

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值