Cookie&Session

目录

快速入门步骤

cookie的细节

Cookie的特点

Session

快速入门

session的细节

session的特点

Cookie&Session的区别

EL

语法

获取值

从指定域获取

获取对象、List集合、Map集合的值

动态获取虚拟目录

JSTL

导包指令

常用标签

if

choose

foreach

MVC

三层架构


快速入门步骤

1. 创建Cookie对象,绑定数据
            * new Cookie(String name, String value) 
        2. 发送Cookie对象
            * response.addCookie(Cookie cookie) 
        3. 获取Cookie,拿到数据
            * Cookie[]  request.getCookies()  

cookie的细节

1. 一次可不可以发送多个cookie?
        * 可以
        * 可以创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可。
    2. cookie在浏览器中保存多长时间?
        1. 默认情况下,当浏览器关闭后,Cookie数据被销毁
        2. 持久化存储:
            * setMaxAge(int seconds)
                1. 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效
                2. 负数:默认值
                3. 零:删除cookie信息
    3. cookie能不能存中文?
        * 在tomcat 8 之前 cookie中不能直接存储中文数据。
            * 需要将中文数据转码---一般采用URL编码(%E3)
        * 在tomcat 8 之后,cookie支持中文数据。特殊字符还是不支持,建议使用URL编码存储,URL解码解析
    4. cookie共享问题?
        1. 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
            * 默认情况下cookie不能共享

            * setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
                * 如果要共享,则可以将path设置为"/"

Cookie的特点

1. cookie存储数据在客户端浏览器
    2. 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)

    * 作用:
        1. cookie一般用于存出少量的不太敏感的数据
        2. 在不登录的情况下,完成服务器对客户端的身份识别

Session

快速入门

1. 获取HttpSession对象:
        HttpSession session = request.getSession();
    2. 使用HttpSession对象:
        Object getAttribute(String name)  
        void setAttribute(String name, Object value)
        void removeAttribute(String name)  

session的细节

1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个? ​ * 默认情况下。不是。 ​ * 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。 ​ Cookie c = new Cookie("JSESSIONID",session.getId()); ​ c.setMaxAge(60*60); ​ response.addCookie(c); ​ ​ 2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗? ​ * 不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作 ​ * session的钝化: ​ * 在服务器正常关闭之前,将session对象系列化到硬盘上 ​ * session的活化: ​ * 在服务器启动后,将session文件转化为内存中的session对象即可。 ​

  1. session什么时候被销毁?

    1. 服务器关闭

      1. session对象调用invalidate() 。

        1. session默认失效时间 30分钟 选择性配置修改 <session-config> <session-timeout>30</session-timeout> </session-config>

session的特点

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

Cookie&Session的区别

区别CookieSession

存储位置

cookie的数据信息存放在客户端浏览器上。session的数据信息存放在服务器上。

存储容量

单个cookie保存的数据<=4KB,一个站点最多保存20个Cookie。对于session来说并没有上限,但出于对服务器端的性能考虑,session内不要存放过多的东西,并且设置session删除机制。

存储方式

cookie中只能保管ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据。session中能够存储任何类型的数据,包括且不限于string,integer,list,map等。

隐私策略

cookie对客户端是可见的,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它是不安全的。session存储在服务器上,对客户端是透明对,不存在敏感信息泄漏的风险。

有效期

开发可以通过设置cookie的属性,达到使cookie长期有效的效果。session依赖于名为JSESSIONID的cookie,而cookie JSESSIONID的过期时间默认为-1,只需关闭窗口该session就会失效,因而session不能达到长期有效的效果。

服务器压力

cookie保管在客户端,不占用服务器资源。对于并发用户十分多的网站,cookie是很好的选择。session是保管在服务器端的,每个用户都会产生一个session。假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存。

跨域支持上

cookie支持跨域名访问。session不支持跨域名访问。

 

EL

语法

${表达式}

获取值

从指定域获取

${域名称.键名}:从指定域中获取指定键的值
                * 域名称:
                    1. pageScope        --> pageContext
                    2. requestScope     --> request
                    3. sessionScope     --> session
                    4. applicationScope --> application(ServletContext)
                * 举例:在request域中存储了name=张三
                * 获取:${requestScope.name}

${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。

获取对象、List集合、Map集合的值

1. 对象:${域名称.键名.属性名}
                    * 本质上会去调用对象的getter方法

                2. List集合:${域名称.键名[索引]}

                3. Map集合:
                    * ${域名称.键名.key名称}
                    * ${域名称.键名["key名称"]}

动态获取虚拟目录

${pageContext.request.contextPath}

JSTL

导包指令

2. 引入标签库:taglib指令:  <%@ taglib %>

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

常用标签

if

1. 属性:
            * test 必须属性,接受boolean表达式
                * 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
                * 一般情况下,test属性值会结合el表达式一起使用
            2. 注意:
                * c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签


    <%
        //判断request域中的一个list集合是否为空,如果不为null则显示遍历集合

        List list = new ArrayList();
        list.add("aaaa");
        request.setAttribute("list",list);

        request.setAttribute("number",4);

    %>

    <c:if test="${not empty list}">
        遍历集合...

    </c:if>
    <br>

    <c:if test="${number % 2 != 0}">

            ${number}为奇数

    </c:if>

    <c:if test="${number % 2 == 0}">

        ${number}为偶数

    </c:if>

choose

1. 使用choose标签声明                     相当于switch声明
        2. 使用when标签做判断                     相当于case
        3. 使用otherwise标签做其他情况的声明        相当于default

    <%
        request.setAttribute("number",51);
    %>

    <c:choose>
        <c:when test="${number == 1}">星期一</c:when>
        <c:when test="${number == 2}">星期二</c:when>
        <c:when test="${number == 3}">星期三</c:when>
        <c:when test="${number == 4}">星期四</c:when>
        <c:when test="${number == 5}">星期五</c:when>
        <c:when test="${number == 6}">星期六</c:when>
        <c:when test="${number == 7}">星期天</c:when>

        <c:otherwise>数字输入有误</c:otherwise>
    </c:choose>

foreach

foreach:相当于java代码的for语句

    <%
        List list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");

        request.setAttribute("list",list);


    %>

    <c:forEach items="${list}" var="str" varStatus="s">

            ${s.index} ${s.count} ${str}<br>

    </c:forEach>

MVC

 

三层架构

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值