JavaWeb中Cookie和Session的讲解

Posted ascto

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb中Cookie和Session的讲解相关的知识,希望对你有一定的参考价值。

Cookie

什么是cookie?

cookie是服务器通知客户端保存键值对的一种技术。客户端有了cookie之后,每次

请求都发送给服务器。每个cookie的大小不可以超过4kb

如何创建cookie?

package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CookieServlet extends BaseServlet 

    protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 

        //1.创建cookie对象
        Cookie cookie=new Cookie("key1","value1");
        //2.通知客户端保存Cookie
        resp.addCookie(cookie);
        resp.getWriter().write("Cookie创建成功");
    

服务器如何获取cookie呢?

服务器获取客户端的cookie只需要一行代码:req.getCookies():Cookie[]

protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 

        Cookie[] cookies= req.getCookies();
        for (Cookie cookie : cookies) 
            //名=值
            resp.getWriter().write("cookie["+cookie.getName()+"="+cookie.getValue()+" ] <br/>" );
        
        Cookie iWantCookie=null;
        for (Cookie cookie : cookies) 
            if ("key1".equals(cookie.getName()))
                iWantCookie=cookie;
                break;
            
        
        //如果不等于null,说明赋值过,找到了指定的cookie
        if (iWantCookie!=null)
            resp.getWriter().write("找到了需要的cookie");
        

    

如何修改cookie的值?

方案一:

1.先创建一个要修改的同名的cookie对象

2.在构造器中同时赋予新的cookie值

3.调用response.addCookie(Cookie);

protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
//        1.先创建一个要修改的同名的cookie对象,在构造器中同时赋予新的cookie值
        Cookie cookie=new Cookie("key1","newValue1");

//        3.调用response.addCookie(Cookie);
        resp.addCookie(cookie);
        resp.getWriter().write("值修改了");
    

方案二:

1.先查询到需要修改的cookie对象。

2.调用setValue()方法赋予新的Cookie值。

3.调用response.addCookie()通知客户端保存修改

  Cookie cookie=CookieUtils.findCookie("key1",req.getCookies());
        if (cookie!=null)
             cookie.setValue("new2Value");
             resp.addCookie(cookie);
        

对于Version 0 cookie,值不应包含空格、方括号、圆括号、等号、逗号、双引号、斜杠、问号、at符号、冒号和分号。空值
在所有浏览器上的行为不一定相同。

cookie的生命控制:

cookie的生命控制指的是如何管理cookie什么时候被销毁(删除)

用到的方法setMaxAge();(设置cookie的最大生存时间)正数表示在指定秒数后过期。负数(默认)表示浏览器关闭就会删除。0表示马上删除cookie。

protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 


        Cookie cookie=new Cookie("life3600","life3600");
        cookie.setMaxAge(60*60);//设置cookie一小时后被删除,无效
        resp.addCookie(cookie);
        resp.getWriter().write("创建了一个存活一小时的cookie");
    

cookie有效路径Path的设置

Cookie的path属性可以有效的过滤哪写cookie可以发送给服务器,哪写不发。

path属性是通过请求的地址来进行有效的过滤

Cookie A path =/工程路径

Cookie B path =/工程路径/abc

请求地址如下:http://ip:port/工程路径/a.html 这个情况下Cookie A 发送 而 B不发送

http://ip:port/工程路径/abc/a.html 这个情况下 A B都发送

protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 

        Cookie cookie=new Cookie("path1","path1");
        //getContextPath得到工程路径
        cookie.setPath(req.getContextPath()+"/abc");//==>/工程路径/abc
        resp.addCookie(cookie);
        resp.getWriter().write("创建了一个带有path的cookie");
    

Session

什么是session?

session就是一个接口(HttpSession),Session就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。

每个客户端都有自己的一个Session会话。Session会话中,我们经常用来保护用户登录之后的信息。

如何创建Session和获取(id号,是否为新)

如何创建和获取session?

他们的API都是一样的:request.getSession()

第一次调用是:创建Session会话,之后调用都是:获取前面创建好的Session会话对象。

isNew();判断到底是不是刚创建出来的(新的)。true表示刚创建。false表示获取之前创建。

每个会话都有一个唯一的id。getId得到Session的会话id

protected void createOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
       //创建和获取session会话对象
        HttpSession session=req.getSession();
        //判断当前Session会话,是否是新创建出来的
        boolean isNew=session.isNew();
        //获取唯一标识id
        String id= session.getId();
        resp.getWriter().write("得到的session的id是"+"<br/>"+id+"<br/>");
        resp.getWriter().write("这个session是否是新创建的"+isNew +"<br/>");
    

Session域数据的存取

 /*往session中保存数据*/
    protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        req.getSession().setAttribute("key1","value1");

    
    /*获取session域中数据*/
    protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
        Object attribute= req.getSession().getAttribute("key1");
        resp.getWriter().write("从session中获取出key1的数据是:"+attribute);
    

Session生命周期控制

public void setMaxInactiveInterval(int interval)设置session的超时时间(以秒为单位)超过指定的时长session就会被销毁。

public int getMaxInactiveInterval()获取Session的超时时间

Session默认的超时时长是多少?

protected void defaultLive(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
       //获取session默认超时时长
        int maxInactiveInterval= req.getSession().getMaxInactiveInterval();
        resp.getWriter().write("默认超时时长为"+maxInactiveInterval+"秒");
    

打印结果显示为1800s

如果你希望你的web工程,默认的session的超时时长为其他时长。你可以在你自己的web.xml配置文件中做配置,就可以修改。

<session-config><session-timeout>20<session-timeout><session-config>表示默认是20分钟

如果你想只修改个别的session超时时长。就可以使用上面的API。setMaxInactiveInterval(int interval)来进行单独的设置。

session超时的概念介绍:

值为正数时为超时时长,负数表示永不超时。

如何设置马上超时?public void invalidate()让当前session对话马上超时,无效。

浏览器和Session之间关联的技术内幕

以上是关于JavaWeb中Cookie和Session的讲解的主要内容,如果未能解决你的问题,请参考以下文章

《遇见狂神说》Javaweb之cookie和session

JavaWeb基于session和cookie的数据共享

JavaWeb:Cookie和Session

JavaWeb 笔记总结

javaWeb核心技术第八篇之Cookie和Session

javaWeb中的session