• JSP EL Cookie Session 商品购物车案例


    Servlet 通过 response.getWriter 动态打印HTML 源码
    * HTML 除了HTML代码外,还存在CSS代码,JavaScript代码 ---- Servlet也需要动态输出CSS、JavaScript
    * 问题 Java工程师 通过Servlet生成网页,美工人员、网页工程师 不便于进行修改和维护

    * ASP、PHP都是支持HTML语法,sun意识到Servlet很难和ASP、PHP 竞争,sun参考ASP语法,制作JSP技术规范

    JSP技术 功能和Servlet一样,在服务器执行,生成动态网页的
    * JSP本身支持HTML语法,比Servlet更便于生成网页
    * JavaEE5 (Servlet2.5 / JSP2.0 ) ----- tomcat5.5以上环境 (tomcat6)

    JSP快速编写入门
    1、JSP直接存放WebRoot目录下,和HTML一样
    2、修改MyEclipse JSP默认编辑器
    window- preferences - general - editors - file associations 将JSP默认编辑器设置为JSP Editor
    3、JSP文件默认编码集 ISO-8859-1 , 修改MyEclipse中JSP 默认编码
    window - preferences 搜索JSP 修改编码集为utf-8

    JSP比HTML 多了一句
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    在JSP中通过<% %> 嵌入任意Java代码

    JSP运行原理分析
    客户端访问服务器端JSP文件,服务器会读取JSP内容,将其翻译为一个Servlet,执行JSP过程实际上执行Servlet过程,返回给客户端页面由Servlet程序生成的 。
    * 翻译后Servlet 保存tomcat/work 目录中
    hello.jsp ------ hello_jsp.java
    1.jsp ------- _1_jsp.java

    JSP生命周期三个方法: _jspInit() _jspService _jspDestroy()
    翻译规则:JSP中HTML代码 <%%>中java代码 ---- 翻译为 _jspService方法内部局部代码

    Servlet 含有少量HTML的Java程序, JSP 含有少量Java的HTML程序
    JSP中三种脚本元素
    1、<%! %> JSP声明脚本 翻译成员变量、成员方法、内部类
    2、<%= %> JSP脚本表达式 输出表达式值到HTML源代码 ------ 会被翻译为 out.print
    * out 是 JSP内置对象,用于生成HTML源代码

    3、<% %> JSP程序脚本代码 ,可以嵌入任意Java代码

    EL 表达式语言是 JSP2.0新特性 ,主要用来对JSP中各种数据范围的对象 进行取值访问 !!!
    <%=request.getAttribute(“name”);>
    等价于
    ${requestScope.name}
    区别:如果name不存在时 ,<%=request.getAttribute(“name”);>会在页面上显示 null,${requestScope.name} 会显示""

    ===================================================================================================================
    什么是会话?用户打开浏览器,访问一个网站进行一系列操作,关闭浏览器离开,完整过程 就是会话

    Cookie : 一种将用户信息保存在客户端技术 ,客户端会将cookie信息自动发送给服务器
    Session :一种将用户信息保存在服务器端技术 ,客户端会持有Session信息对应key,通过key找到session信息
    * Session 占用服务器空间,安全性更高 ,Cookie节省服务器资源,安全性差一些

    记录上次访问时间案例
    1、第一次访问VisitServlet
    请求中没有cookie信息
    响应中 Set-Cookie: lastvisit=1350615153109
    * Cookie信息保存浏览器缓存中

    2、第二次访问VisitServlet
    请求中 Cookie: lastvisit=1350615153109
    响应中 Set-Cookie: lastvisit=1350615241359

    默认cookie都是浏览器内存中进行缓存的 ,当浏览器关闭,会话结束,内存释放

    * 从request请求中查找 指定name的cookie信息
    public Cookie findCookie(Cookie[] cookies, String name) {
    if (cookies == null) {
    // 不存在任何cookie
    return null;
    } else {
    // 存在cookie,查找指定cookie
    for (Cookie cookie : cookies) {
    if (cookie.getName().equals(name)) {
    // 找到了
    return cookie;
    }
    }

    // 没有找到
    return null;
    }
    }
    * 服务器端向客户端写出一个新的cookie
    Cookie newLastVisitCookie = new Cookie("lastvisit", System.currentTimeMillis()+ "");
    response.addCookie(newLastVisitCookie);

    ==================================================================================================

    Cookie API 详解
    1 读取cookie
    request.getCookies() 返回Cookie[]
    首先判断cookies数组是否存在 cookies == null,如果cookies存在,根据cookie的name去查找指定cookie
    * 参见 上面findCookie 方法

    2、服务器向客户端发送cookie
    cookie对象创建 new Cookie(name,value)
    response.addCookie(cookie) 将cookie发送客户端

    * cookie有name和value,提供三个方法 getName getValue setValue

    3、cookie从持久性上分为两类 会话cookie和持久cookie
    会话cookie 保存在浏览器内存中cookie,当会话结束浏览器关闭,会话cookie信息就是丢失
    持久cookie 保存在浏览器临时文件缓存区中cookie (硬盘上) ,当关闭浏览器结束会话,持久cookie不会被删除
    * 持久cookie存在过期时间,过期后会自动删除
    持久cookie 需要设置cookie 有效期 setMaxAge

    Set-Cookie: lastvisit=1350617047968; Expires=Fri, 19-Oct-2012 04:24:07 GMT

    4、cookie访问有效路径
    携带cookie 必须path一致
    默认 http://localhost/day7/visit 生成cookie ---- 默认path 就是/day7/ (visit资源所在目录就是默认path)
    * 只有在访问 http://localhost/day7/ 目录和子目录情况下 才会携带cookie 信息

    path也可以手动指定 setPath
    newLastVisitCookie.setPath("/abc");
    抓取信息:
    Set-Cookie: lastvisit=1350617427109; Expires=Fri, 19-Oct-2012 04:30:27 GMT; Path=/abc
    再次访问 :http://localhost/day7/visit 不会携带cookie信息,因为path 不符合

    最简单方案:setPath("/");
    Set-Cookie: lastvisit=1350617644468; Expires=Fri, 19-Oct-2012 04:34:04 GMT; Path=/

    5、cookie有效域名
    setDomain 设置cookie有效域名 ---- 例如:setDomain(".itcast.cn"); 传智播客网站的cookie
    * 不需要记这个
    访问A 网站 ,生成 B网站 Cookie ----- 第三方cookie (恶意cookie)
    访问A 网站, 生成A 网站Cookie ----- 第一方Cookie(安全cookie )

    6、删除持久cookie
    删除持久cookie,可以将cookie最大时效设为0,注意,删除cookie时,path必须一致,否则不会删除

    ===========================================================================================================
    Cookie应用:显示商品浏览记录

    Session 将用户相关信息保存服务器端,服务器会为每个浏览器创建单独Session对象,每个用户各自数据 保存各自浏览器对应Session对象中。不同用户 获取到各自浏览器对应Session 保存数据。

    Session对象创建 : request.getSession();

    服务器端会为每个浏览器创建单独Session对象,如何做到的? Session的原理
    * Session 通过cookie 传输 jsessionid 用来在服务器端查找对应Session对象

    问题:如何实现关掉浏览器后,再开浏览器,上次购买的商品还在。
    1、第一次访问 响应 Set-Cookie: JSESSIONID=7B67782D880A07ADADA64A312ED23D72; Path=/day7
    2、第二次访问 请求 Cookie: JSESSIONID=7B67782D880A07ADADA64A312ED23D72
    关闭浏览器重新打开
    3、直接访问 session2 : 无法访问刚才Session信息

    解决方案:将jsessionid 信息保存 持久Cookie
    Cookie cookie = new Cookie("JSESSIONID", session.getId());
    cookie.setMaxAge(60 * 60 * 24);
    cookie.setPath("/");
    response.addCookie(cookie);
    抓取响应
    Set-Cookie: JSESSIONID=4E14F3FD831BDAD3C532C13568EEA358; Path=/day7
    Set-Cookie: JSESSIONID=4E14F3FD831BDAD3C532C13568EEA358; Expires=Sat, 20-Oct-2012 06:37:50 GMT; Path=/

    浏览器禁用Cookie之后,Session还能否使用 ? 可以的
    * 浏览器无法保存cookie中jsession id ,无法完成Session追踪

    SESSIONID=985E0B491708994C0039BEFC0B277056; Path=/day7
    第二次请求服务器 http://localhost/day7/session2;jsessionid=985E0B491708994C0039BEFC0B277056

    通过程序生成URL (携带jsessionid的URL ) : URL重写

    使用URL重写,必须该网站所有路径都使用URL重写 ,实际应用中很少采用

    Session的生命周期
    1、Session对象创建 : request.getSession() 执行时 (当前会话第一次执行)
    2、session对象何时销毁?
    浏览器如果关闭后,Session对象是不是就销毁了?
    答案:不是,Session保存在服务器端,和浏览器是否关闭没有关系 ,关闭浏览器时删除会话cookie,丢失jsessionid,没有jsession无法找到服务器端对应Session

    三种销毁Session对象情况:1、不正常关闭服务器(正常关闭服务器Session信息会被序列化到硬盘中 保存tomcat/work目录)
    2、Session过期 默认过期时间在tomcat/conf/web.xml 配置
    <session-config>
    <session-timeout>30</session-timeout>
    </session-config>
    * 默认Session对象过期时间30分钟 (连续不使用Session对象时间)
    * 也可以手动设置 setMaxInactiveInterval(int interval)
    3、在程序中执行 session.invalidate() 手动销毁Session对象

    问题:session.removeAttribute 和 session.invalidate区别 ?
    session.removeAttribute 删除当前Session对象中一个属性值
    session.invalidate 销毁当前Session对象,删除所有属性

    Session综合案例:采用一次性验证码用户登录
    * 一次性验证码,当验证码生成后,只使用一次,不管成功或者失败,验证码都将失效

    ==================================================================================================================
    day5 ServletContext 每个web工程对应唯一对象,全局的Servlet上下文对象,允许将数据保存ServletContext --- 所有Servlet共享
    day6 HttpServletRequest 每次请求产生一个HttpServletRequest对象,允许将数据保存request对象中,结合请求转发一起使用
    * 当请求结束后,数据就会删除
    day7 HttpSession 服务器会为每个客户端创建单独Session对象,允许将数据保存session中 ,session保存的是每个用户各自的数据
    * 用户之间没有影响 (用户购物车、用户登录信息 )

    Servlet三种数据访问范围:ServletContext 、HttpSession、HttpServletRequest
    1、保存ServletContext数据 ,在服务器关闭时才会删除,生命周期最长,全局都可以访问 (最少使用)
    * 网站访问次数、全局数据库连接池 需要保存ServletContext
    2、保存HttpSession数据 ,三种情况下丢失 ,主要保存用户相关数据 (不建议存放大规模数据)
    * 用户登录信息、购物信息 保存HttpSession
    3、保存HttpServletRequest,当前请求发生时产生,响应结束数据立刻释放 (生命周期最短,最建议使用)
    * Servlet获得数据处理结果,通过请求转发 传递信息给JSP显示

    三种数据范围提供相同几个方法
    setAttribute
    getAttribute
    removeAttribute

    ======================================================================================================
    内容小结:
    1、Cookie和Session区别 ?
    Cookie保存会话信息在客户端,Session保存会话信息在服务器端,Session基于Cookie实现的

    2、Session安全吗?相对Cookie安全,不是绝对安全 ,jsessionid 可以伪装
    * 二次验证必要性

    3、浏览器关闭后,是不是Session对象就销毁了 ?
    不是,Session保存在服务器端,关闭浏览器丢失jsessionid,无法找到服务器对应Session对象了,需要等到Session过期后才会销毁

    4、禁用浏览器cookie后,Session还能否使用?
    可以,URL重写

    5、会话cookie和持久cookie区别 ?
    会话cookie 保存浏览器内存缓存区中,关闭浏览器后,会话cookie就会删除
    持久cookie 保存浏览器临时文件区 硬盘上,存在过期时间,当过期后会自动删除,通过设置maxage为0删除持久cookie

    6、session的三种销毁原因?
    服务器非正常关闭、session过期、invalidate

    7、如何实现关闭浏览器再次打开,Session仍然可以访问?
    将jsessionid 对应cookie 持久化

    代码练习:记录站点上次访问时间、商品浏览记录、商品购物车、一次性验证码登陆

  • 相关阅读:
    12月12日学习日志
    12月11日学习日志
    12月10日学习日志
    linux下安装git
    ubuntu上安装mysql
    扩展虚拟机容量
    【linux】你需要以 root 身份执行此命令
    Ubuntu新建Django工程错误:ModuleNotFoundError: No module named 'distutils.core'
    LeetCode26. 删除排序数组中的重复项
    LeetCode27. 移除元素
  • 原文地址:https://www.cnblogs.com/vaer/p/3913424.html
Copyright © 2020-2023  润新知