J2EE_servlet笔记_会话技术_第1页
J2EE_servlet笔记_会话技术_第2页
J2EE_servlet笔记_会话技术_第3页
J2EE_servlet笔记_会话技术_第4页
J2EE_servlet笔记_会话技术_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第 36 讲 会话技术介绍 什么是会话 会话是针对一个网站而言的 不是针对多个网站 基本概念 指用户开一个浏览器 访问一个网站 只要不关闭该浏览器 不管该用户点击 多少个超链接 访问多少资源 直到用户关闭浏览器 整个这个过程我们称为一次会话 比如打电话 只要电话不断就算一次电话 至于过程中和多少人说过话 说多长时间 都 算一次 点一次超链接就是一个 request 不可能保存起来 所以要用会话来保存数据 如何保存用户上次登录时间 如何显示用户浏览历史 如何把登录的用户名和密码保存到电脑 下次登录 不需要重新输入 解决之道 cookie Cookie 是客户端技术 服务器把每个用户的数据以 cookie 的形式写给用户各自的浏览器 当用户使用浏览器再去访问服务器中的 web 资源时 就会带着各自的数据去 这样 web 资源处理的就是用户各自的数据了 服务器在客户端保存用户的信息 比如登录名 密码等 就是 cookie 这些信息就像是小甜饼一样 数据量并不大 服务器端在需要的时候可以从客户端读取 保存在客户端的浏览器缓存目录下 Cookie 原理示意图 Cookie 创建是在服务器创建的 存放是在浏览器这头存放的 ClassClass CookieCookie InterfaceInterface HttpServletResponseHttpServletResponse 演示 Cookie 工作 public class CreateCookie extends HttpServlet public void doGet HttpServletRequest request HttpServletResponse response throws ServletException IOException response setContentType text html charset utf 8 response setCharacterEncoding utf 8 PrintWriter out response getWriter 创建 cookie api Cookie cookie new Cookie name mingcheng1 设置 cookie 的生命周期 cookie setMaxAge 3600 把 cookie 信息回写给浏览器 response addCookie cookie 在 ie 访问 http localhost 8888 cookie1 CreateCookie 用 HttpWatch 抓包得到信息 response InterfaceInterface HttpServletRequestHttpServletRequest public class ReadCookie1 extends HttpServlet public void doGet HttpServletRequest request HttpServletResponse response throws ServletException IOException response setContentType text html charset utf 8 response setCharacterEncoding utf 8 PrintWriter out response getWriter 读取所有 cookie 信息 再选中你要的 cookie Cookie cookies request getCookies System out println cookies length 在 ie 访问 http localhost 8888 cookie1 ReadCookie1 用 HttpWatch 抓包得到信息 request 在控制台出现信息 for int i 0 i补讲一个 md5 算法 请大家注意 以后我们的密码都要使用加密存放 在验证密码 的时候 对用户输入密码 进行 md5 加密 然后再到数据库去验证 public class Servlet1 extends HttpServlet public void doGet HttpServletRequest request HttpServletResponse response throws ServletException IOException response setContentType text html charset utf 8 response setCharacterEncoding utf 8 PrintWriter out response getWriter 先获取 cookie 假设我们保存上次登录时间的 cookie lasttime 2011 11 11 12 12 12 这里我们要考虑一个情况 用户第一次登陆 您是第一次登陆 Cookie cookies request getCookies boolean b false 假设没有 lasttime cookie if cookies null 保证有 cookie 才去遍历 for Cookie cookie cookies 取出名 String name cookie getName if lasttime equals name 显示 out println 您上次登录时间是 cookie getValue 更新时间 把当前日期保存 cookie SimpleDateFormat simpleDateFormat new SimpleDateFormat yyyy MM dd HH mm ss String nowTime simpleDateFormat format new java util Date cookie setValue nowTime cookie setMaxAge 7 3600 24 保存一周 response addCookie cookie b true break if b 没有找到 out println 您是第一次登陆 把当前日期保存 cookie SimpleDateFormat simpleDateFormat new SimpleDateFormat yyyy MM dd HH mm ss String nowTime simpleDateFormat format new java util Date Cookie cookie new Cookie lasttime nowTime cookie setMaxAge 7 3600 24 保存一周 response addCookie cookie 打开登录页面的时候 自动填写该用户的用户名和密码 最好单开一个项目 点击登录后再回到 Login 页面点击刷新 用户 id 已自动填写 点一下商品名 就弹窗商品信息 同时在刷新主界面的时候 能显示出看了哪些商品 而 且还要加一个功能 最后看的商品要放到最前面去 当浏览过的商品超过了四个以后 只 保留四个 cookie 的细节 一个浏览器最多放入 300cookie 一个 web 站点 最多 20cookie 而且一个 cookie 大小 限制在 4k cookie 生命周期的再说明 1 cookie 默认生命周期是会话级别 2 通过 setMaxAge 可以设置生命周期 setMaxAge 正数 即多少秒后该 cookie 失效 setMaxAge 0 删除该 cookie cookie 存放中文 怎么处理 存放 String val URLEncoder encode 铭城 utf 8 Cookie cookie new Cookie name val 取出 String val URLDecoder decode cookie getValue utf 8 out println name val 案例 点击刷新后 特别说明 如果该 web 应用只有一个 cookie 则删除该 cookie 后 在浏览器的临时文件夹 下没有该 cookie 文件 如果该 web 应用有多个 cookie 则删除一个 cookie 后 文件还在 只是该 cookie 没有 setMaxAge 负数 相当于该 cookie 生命周期是会话级别 第 39 讲 session 技术 张三和李四他们购买的商品不一样 他们的购物车中的显示的商品也不一样 这是怎么 实现的 另外一个问题 不同的用户登录网站后 不管该用户浏览该网站的哪个页面 都可显示 登录人的名字 同样可以随时去查看自己的购物车中的商品 session 为什么有 问题 1 如何实现在不同的页面 可以去查看信息 比如说购物车 同时还要实现不同 的用户看到的信息是自己 对 session 的说明 1 session 是存放在服务器的内存中 2 一个用户浏览器 独享一个 session 域对象 3 session 的默认生命周期是 30min InterfaceInterface HttpSessionHttpSession InterfaceInterface HttpServletRequestHttpServletRequest F tomcat apache tomcat 8 0 28 conf web xml public class Servlet1 extends HttpServlet public void doGet HttpServletRequest request HttpServletResponse response throws ServletException IOException response setContentType text html charset utf 8 response setCharacterEncoding utf 8 PrintWriter out response getWriter 访问 session 当发现没有 session 时候 就会自动创建 session HttpSession session request getSession 给该 session 放入属性 session setAttribute uname 宋江 session 的生命周期 默认 30min 你也可以修改 out println 创建 session 并放入了一个属性 public class Servlet2 extends HttpServlet public void doGet HttpServletRequest request HttpServletResponse response throws ServletException IOException response setContentType text html charset utf 8 response setCharacterEncoding utf 8 PrintWriter out response getWriter 获取 session HttpSession session request getSession 获取 String uname String session getAttribute uname if uname null out println session 中没有 uname else out println uname uname 先访问 Servlet1 再访问 Servlet2 在搜狗和 ie 浏览器中返回结果不一样 证明了一个用户浏览器 独享一 个 session 域对象 如果同一个用户浏览器 向设置一个属性的时候 如果名字相同了 会出现什么情况 结论 会替换该对象值 演示 public class Servlet3 extends HttpServlet public void doGet HttpServletRequest request HttpServletResponse response throws ServletException IOException response setContentType text html charset utf 8 response setCharacterEncoding utf 8 PrintWriter out response getWriter 访问 session 当发现没有 session 时候 就会自动创建 session HttpSession session request getSession session setAttribute uname 铭城 out println 重新设置 uname 先访问 Servlet3 重新设置 uname 再访问 Servlet2 这是 uname 已经变成铭城了 request getSession true 和不带参数的一样 request getSession false 没有 session 就算了 不再创建新的 public class Servlet4 extends HttpServlet public void doGet HttpServletRequest request HttpServletResponse response throws ServletException IOException response setContentType text html charset utf 8 response setCharacterEncoding utf 8 PrintWriter out response getWriter HttpSession session request getSession session removeAttribute uname out println 删除 uname Servlet2 Servlet4 Servlet2 创建一个对象 User user new User user setName 小猫 user setColor 红色 session setAttribute cat user User user User session getAttribute cat if user null out println 猫的信息是 user getName user getColor Servlet1 Servlet2 session 小结 session 是存在服务器的内存中 一个用户浏览器 独享一个 session 域对象 session 中的属性的默认生命周期是 30min 你可以通过 web xml 来修改 这样修改 1 一个地方是 tomcat conf web xml 对所有的 web 应用生效 2 另外一个地方 就是在单个 web 应用的下去修改 web xml 如果发生冲突 则以自己的 web 应用下为准 3 session setMaxInactiveInterval 20 20s 指的是发呆时间 对 session 生命周期小结 session 中可以存放多个属性 session 可以存放对象 如果 session setAttribute name val 如果名字重复 则会替换该属性 测试 removeAttribute 方法 效果 小作业 防止用户非法登录到某个页面 用户必须登录后 才能操作管理页面 思路 当用户成功登录后 可以把该用户信息存放到 session 然后在需要验证的页面中获取用户 信息 如果为 null 说明用户非法 可以让其重新登录 在之前 LoginServlet 写过的 request getAttribute 接收到错误信息 效果 如果网站有非常多的页面 可以使用下面方法 1 封装成函数 2 使用过滤器 session 的更深入理解 为什么服务器能够为不同的浏览器提供不同 session 抓包来查看 Jsessionid 访问 http localhost 8888 session1 Servlet1 当发现没有 session 时候 就会自动创建 访问 http localhost 8888 session1 Servlet5 现在在服务器内存已有 session 浏览器请求时带上 Cookie 保存有 jsessionid 服务器根 据此 id 来寻找对应浏览器的 session session getId 用来在页面上打印 jsessionid 开源之祖 3 万多个开源项目 电驴 防火墙 杀毒软件 数据库 大型游戏 地图 c 语言 java php net asp 验证码案例 使用 原理是使用到 java 的绘图技术 这里最重要的就是生成验证码的 servlet package com wmc import java awt Color import java awt Font import java awt Graphics import java awt image BufferedImage import java io IOException import java io PrintWriter import java util Random import javax imageio ImageIO import javax servlet ServletException import javax servlet http HttpServlet import javax servlet http HttpServletRequest import javax servlet http HttpServletResponse public class CreateCode extends HttpServlet public void doGet HttpServletRequest request HttpServletResponse response throws ServletException IOException response setContentType text html charset utf 8 response setCharacterEncoding utf 8 PrintWriter out response getWriter 7 禁止浏览器缓存随机图片 response setDateHeader Expires 1 response setHeader Cache Control no cache response setHeader Pragma no cache 6 通知客户机以图片方式打开发送过去的数据 response setHeader Content Type image jpeg 1 在内存中创建一副图片 BufferedImage image new BufferedImage 60 30 BufferedImage TYPE INT RGB 2 向图片上写数据 Graphics g image getGraphics 设背景色 g setColor Color black g fillRect 0 0 60 30 3 设置写入数据的颜色和字体 g setColor Color red g setFont new Font null Font BOLD 20 4 向图片上写数据 String num makeNum 这句话就是把随机生成的数值 保存到 session request getSession setAttribute checkcode num g drawString num 0 20 5 把写好数据的图片输出给浏览器 ImageIO write image jpg response getOutputStream 该函数是随机生成 7 位数字 public String makeNum Random r new Random 9999999 可以生成 7 位 String num r nextInt 9999 StringBuffer sb new StringBuffer 如果不够 4 位 前面补零 for int i 0 i 4 num length i sb append 0 num sb toString num return num public void doPost HttpServletRequest request HttpServletResponse response throws ServletException IOException this doGet request response 图片实质上就是一种文件 我们看的电影都是按文件的流来传输的 所以地址写一个 servlet 然后 servlet 再写会一个图片回来 out println 用户登录 action 应该这样写 web 应用名 Servlet 的 url out println out println 用户 id out println 密 码 out println 验证码 out println out println String err String request getAttribute err if err null out println err 如何使用 Login java 获取用户的 id password 输入的验证码 String id request getParameter id String passwd request getParameter passwd String checkcode request getParameter checkcode 取出 session 中验证码 String checkcode2 String request getSession getAttribute checkcode 1 先验证码 if checkcode equals checkcode2 验证码 ok request getRequestDispatcher Ok forward request response 到数据库去验证 else request setAttribute err 验证码错误 request getRequestDispatcher Login forward request response out println login ok 效果 输入正确验证码 输入错误验证码 练习 把验证码功能加入到用户管理系统 过滤器 过滤器 filter 开发过滤器的步骤 1 创建继承 HttpServlet 同时实现 Filter 接口 2 默认 filter 不生效 需要配置 web xml MyFilter com wmc filter MyFilter MyFilter 3 在 filter 的方法中添加业务逻辑 package com wmc filter import java io IOException import java io PrintWriter import javax servlet Filter import javax servlet FilterChain import javax servlet FilterConfig import javax servlet ServletException import javax servlet ServletRequest import javax servlet ServletResponse import javax servlet http HttpServlet import javax servlet http HttpServletRequest import javax servlet http HttpServletResponse import javax servlet http HttpSession import com wmc domain User public class MyFilter extends HttpServlet implements Filter public void doGet HttpServletRequest request HttpServletResponse response throws ServletException IOException response setContentType text html charset utf 8 response setCharacterEncoding utf 8 PrintWriter out response getWriter public void doPost HttpServletRequest request HttpServletResponse response throws ServletException IOException this doGet request response Override public void doFilter ServletRequest request ServletResponse response FilterChain chain throws IOException ServletException TODO Auto generated method stub 获取 request HttpServletRequest httpServletRequest HttpServletRequest request 看看请求的资源是什么 String uri httpServletRequest getRequestURI if uri startsWith UsersManager3 imgs uri startsWith UsersManager3 servlet Login uri startsWith UsersManager3 servlet CreateCode 如果是请求到登录相关页面以及图片验证码的 uri 直接放行 chain doFilter request response else HttpSession session httpServletRequest getSession User user User session getAttribute loginuser if user null 该用户合法 放行 chain doFilter request response else request setAttribute err 请好好登录 httpServletRequest getRequestDispatcher servlet LoginServlet forwar d request response Override public void init FilterConfig filterConfig throws ServletException TODO Auto generated method stub 过滤器链 实现方式 1 在创建一个过滤器 继承 HttpServlet 同时还要实现 Filter 接口 2 配置过滤器 配置过滤器的顺序就可以决定调用过滤器的顺序 Filter 的执行顺序与在 web xml 配置文件中的配置顺序一致 一般把 Filter 配置在所有的 Servlet 之前 对 session 的销毁时间的讨论 借助一个案例 面试题 应用 关掉 IE 后 再开 IE 上次购买的商品还在 设计到 session 销毁时间 分析 我们的 session 生命周期如果是 30min 该 session 不会随浏览器的关闭 而自动销毁 而会到 30min 后 才会被服务器销毁 我们使用代码来实现该功能 session cookie 结合使用 创建一个 session 并放入一个属性 HttpSession session request getSession session setAttribute username 王铭成 默认 30min 把该 session id 保存 cookie 在保存 id 时 一定要按照 规范命名 这里区分大小写 Cookie cookie new Cookie JSESSIONID session getId cookie setMaxAge 60 30 response addCookie cookie 读取 session 的属性 String uname String request getSession getAttribute username out println uname uname 关闭 ie 后再开 ie 输入 http localhost 8888 session2 Servlet2 能显示出 uname 如何实现 ie 禁用 cookie 后 我们还可以继续使用 session 放到简易购物车那讲解决 第 43 讲 简易购物车 简易购物车的实例 思路 当用户点击购买商品时 我们把该商品保存到 session 中 该 session 的结构是 nameval mybookshashMap 对象 而 hashmap 的结构是 keyval 书号书对象 Book java 类 具体的实现 参看 myCart 项目 总结我们使用到的相关知识 1 java 基础的集合 ArrayList HashMap LinkedHashMap 有序的 2 session 技术 3 servlet 4 单态 5 如何选择不同的集合 list 集合都是有序 map 集合是无序 list 和 map 集合都可以放入 null list 可以放入相同的对象 而 map 也可以放相同对象 但是 key 不能重复 session 中存放的键为 mybooks 值为 HashMap 对象 HashMap 对象中存放的键为书本的 id String 值为 book 对象 public class ShowBook extends HttpServlet public void doGet HttpServletRequest request HttpServletResponse response throws ServletException IOException response setContentType text html charset utf 8 response setCharacterEncoding utf 8 PrintWriter out response getWriter 先死后活 out println 欢迎购买 out println java 书点 击购买 out println oracle 书点击购买 out println c 书点击 购买 public class BuyBookCl extends HttpServlet public void doGet HttpServletRequest request HttpServletResponse response throws ServletException IOException response setContentType text html charset utf 8 response setCharacterEncoding utf 8 PrintWriter out response getWriter String bookname request getParameter name String id request getParameter id HttpSession session request getSession 从 session 中取出 mybooks HashMap hm HashMap session getAttribute mybooks 如果是第一次购物 hm null if hm null hm new HashMap 创建一个 Book 对象 Book book new Book book setId id book setName bookname book setNum 1 hm put id book else 判断 hm 中是否有该书 if hm containsKey id 表示书购买过一次 取出 Book book hm get id int bookNum book getNum book setNum bookNum 1 else Book book new Book book setId id book setName bookname book setNum 1 hm put id book 更新 session setAttribute mybooks hm request getRequestDispatcher ShowMyCart forward request response public class ShowMyCart extends HttpServlet public void doGet HttpServletRequest request HttpServletResponse response throws ServletException IOException response setContentType text html charset utf 8 response setCharacterEncoding utf 8 PrintWriter out response getWriter 从 session 中取出看购买的数 HashMap myBooks HashMap request getSession getAttribute mybooks out println 你的购物车有以下书籍 遍历 HashMap Iterator it myBooks keySet iterator while it hasNext String key String it next Book book myBooks get key out println 书名 book getName 数量 book getNum out println 返回购物大厅 效果 用 ArrayList 模拟一个内存数据库 package com wmc import java util ArrayList 用 arrayList 模拟一个内存数据库 final public class DB private static ArrayList al null private DB static al new ArrayList Book book1 new Book book1 setId 1 book1 setName java Book book2 new Book book2 setId 2 book2 setName oracle Book book3 new Book book3 setId 3 book3 setName c Book book4 new Book book4 setId 4 book4 setName linux al add book1 al add book2 al add book3 al add book4 public static ArrayList getDB return al public static Book getBookById String id Book book null for int i 0 i al size i book Book al get i if book getId equals id return book return null 要在购物车中显示每类书总共的价格和所有书的总价 效果 该方法的实现机制为 先判断当前的 Web 组件是否启用 Session 如果没有启用 Session 直接返回参数 url 再判断客户端浏览器是否支持 Cookie 如果支持 Cookie 直接返回参数 url 如果 不支持 Cookie 就在参数 url 中加入 Session ID 信息 然后返回修改后的 url cookie vs session 存在的位置 cookie 存在客户端的 临时文件夹 session 存在服务器的内存中 一个 session 域对象为一个用户浏览器服务 安全性 cookie 是以明文方式存放在客户端的 安全弱 可以通过加密 md5 再存放 session 是存放在服务器的内存中 所以安全性好 网络传输量 cookie 会传递信息 给服务器 session 的属性值不会给客户端 生命周期 cookie 的生命周期是累计时间 即如果我们给 cookie 设置 setMaxAge 30 则 30s 后 失效 session 的生命周期是间隔时间 如 我们设置 session 20min 指在 20min 内 如果 没有访问 session 则 session 失效 含义是指无法取出 session 属性 在以下情况 session 也会失效 1 关闭 tomcat 2 reload web 应用 3 时间到 4 invalidate 也会让 session 失效 使用原则 因为 session 会占用服务器的内存 因此不要向 session 存放过多 过大的对象 会 影响性能 第 45 讲 ServletContext 1 为什么需要 servletContext 需求 1 需求 2 解决之道 ServletContext 原理图 快速入门 ServletContext 1 ServletContext 是在服务器 2 ServletContext 是被所有客户端共享 3 ServletContext 是当 web 应用启动的时候 自动创建 4 ServletContext 当 web 应用关闭 tomcat 关闭 对 web 应用 reload 会造成 servletContext 销 毁 public class Servlet1 extends HttpServlet public void doGet HttpServletRequest request HttpServletResponse response throws ServletException IOException response setContentType text html charset utf 8 response setCharacterEncoding utf 8 PrintWriter out response getWriter 获取 ServletContext 对象引用 1 通过 this 直接获取 ServletContext servletContext this getServletContext 2 通过 ServletConfig 获取 ServletContext servletContext2 this getServletConfig getServletContext servletContext setAttribute uname 王铭成 out println 写入一个属性到 servletContext public void doGet HttpServletRequest request HttpServletResponse response throws ServletException IOException response setContentType text html charset utf 8 response setCharacterEncoding utf 8 PrintWriter out response getWriter 取出 ServletContext 的某个属性 1 首先获取到 ServletContext ServletContext servletContext this getServletContext 2 取出属性 这个属性的值 对应什么类型就应当转成什么类型 String val String servletContext getAttribute uname out println val val 结果 访问 http localhost 8888 serContext Servlet1 后 再用另外的浏览器如搜狗 百度 浏览器 访问 MyEclipse 自带浏览器 搜狗浏览器 百度浏览器 对 ServletContext 的用法小结 获取 this getServletContext this getServletConfig getServletContext 添加属性 servletContext setAttribute string object 取出属性 servletContext getAttribute 属性名 删除 servletContext removeAttribute 属性名 ServletContext 的应用 1 获取 WEB 应用的初始化参数 在 web xml 中 username scott 如何获取 String val this getServletContext getInitParameter username 只能给单个 servlet 访问参数的配置方法 2 使用 ServletContext 实现跳转 目前我们跳转到下一个页面 1 response sendRedirect web 应用名 资源名 2 request getRequestDispatcher 资源名 forward request response 区别 1 getRequestDispatcher 跳转发生在 web 服务器 sendRedirect 发生在浏览器 2 如果 request setAttribute name wmc 希望下一个页 面可以使用 name 属性值 则使用 getRequestDispatcher 3 如果 session setAttribute name2 wmc2 希望下一个 页面可以使用 name2 属性值 则两个方法均可使用 但是建议使用 getRequestDispatcher 4 如果我们希望跳转到本 web 应用外的一个 url 应使用 sendRedirect 3 这种方法和 2 一样 this getServletContext getRequestDispatcher 资源 url forward request response 3 利用 ServletContext 对象读取资源文件 在 WebRoot 下建立一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论