收藏 分销(赏)

重点笔记会话关键技术.doc

上传人:精*** 文档编号:3000274 上传时间:2024-06-12 格式:DOC 页数:83 大小:6.81MB
下载 相关 举报
重点笔记会话关键技术.doc_第1页
第1页 / 共83页
重点笔记会话关键技术.doc_第2页
第2页 / 共83页
点击查看更多>>
资源描述
第36讲(会话技术简介) u 什么是会话? (会话是针对一种网站而言,不是针对各种网站。) 基本概念:指顾客开一种浏览器,访问一种网站,只要不关闭该浏览器,不论该顾客点击多少个超链接,访问多少资源,直到顾客关闭浏览器,整个这个过程咱们称为一次会话。 例如打电话,只要电话不断就算一次电话,至于过程中和多少人说过话,说多长时间,都算一次。 点一次超链接就是一种request,不也许保存起来。 因此要用会话来保存数据。 //—————————————————————————————————————— 如何保存顾客上次登录时间 如何显示顾客浏览历史 如何把登录顾客名和密码保存到电脑,下次登录,不需要重新输入 u 解决之道——cookie Cookie是客户端技术,服务器把每个顾客数据以cookie形式写给顾客各自浏览器。当顾客使用浏览器再去访问服务器中web资源时,就会带着各自数据去。这样,web资源解决就是顾客各自数据了。 服务器在客户端保存顾客信息,例如登录名,密码等...就是cookie, 这些信息就像是小甜饼同样,数据量并不大,服务器端在需要时候可以从客户端读取,保存在客户端浏览器缓存目录下。 Cookie原理示意图 Cookie创立是在服务器创立,存储是在浏览器这头存储。 Class Cookie //—————————————————————————————————————— Interface HttpServletResponse //—————————————————————————————————————— 演示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): Interface HttpServletRequest //—————————————————————————————————————— 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<cookies.length;i++) { Cookie cookie=cookies[i]; out.println("cookie 信息 名字="+cookie.getName()+" value="+cookie.getValue()); } } //—————————————————————————————————————— u cookie原理图 u cookie可以用来做什么 1) 保存上次登录时间等信息 2) 保存顾客名、密码,在一定期间不用重新登录 3) 记录顾客访问网站喜好(例如有无背景音乐、网页背景色是什么) 4) 网站个性化,例如定制网站服务,内容。 u cookie小结 ①  cookie是在服务器创立 ②  cookie是保存在浏览器这端 ③  cookie生命周期可以通过 cookie.setMaxAge(); ☞如果不设立setMaxAge则该cookie生命周期当浏览器关闭时,就消灭. ④  cookie可以被各种浏览器共享 ⑤  怎么理解 咱们可以把cookie想成一张表 ?如果cookie重名会有什么问题? 如果重名就会替代存在cookie值. ⑥  一种web应用可以保存各种cookie(各种cookie存储在一种文献里,无论生命周期相似不相似) ⑦  cookie存储时候是以明文方式存储,因而安全较低,咱们可以通过加密后保存. ->补讲一种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" "-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已自动填写: //—————————————————————————————————————— 点一下商品名,就弹窗商品信息,同步在刷新主界面时候,能显示出看了哪些商品,并且还要加一种功能,最后看商品要放到最前面去,当浏览过商品超过了四个后来,只保存四个。 //—————————————————————————————————————— u 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技术)========================================================= ☞张三和李四她们购买商品不同样,她们购物车中显示商品也不同样,这是怎么实现? ☞此外一种问题,不同顾客登录网站后,不论该顾客浏览该网站哪个页面,都可显示登录人名字,同样可以随时去查看自己购物车中商品。 u session为什么有? 问题1:如何实当前不同页面,可以去查看信息(例如说购物车),同步还要实现不同顾客看到信息是自己. 对session阐明: 1. session是存储在服务器内存中 2. 一种顾客浏览器,独享一种session域对象 3. session默认生命周期是30min Interface HttpSession //—————————————————————————————————————— Interface HttpServletRequest 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。 .net [开源之祖] 3万各种开源项目 电驴、防火墙、杀毒软件、数据库、大型游戏、地图 c语言、java、php、.net、asp //—————————————————————————————————————— u 验证码案例 使用(原理是使用到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("<h1>顾客登录</h1>"); //action 应当这样写 /web应用名/Servleturl out.println("<form action='/mycheckcode/LoginCl' method='post'>"); out.println("顾客id:<input type='text' name='id' /><br/>"); out.println("密 码:<input type='password' name='password'/><br/>"); out.println("验证码:<input type='text' name='checkcode'/> <img src='/mycheckcode/CreateCode'> <br/>"); out.println("<input type='submit' value='登录'/><br/>"); out.println("</form>"); String err=(String) request.getAttribute("err"); if(err != null) { out.println(err); } 如何使用: Login.java <img src=”/验证码url” /> //—————————————————————————————————————— //获取顾客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"); //———————————————————————————————————— 效果: 输入对的验证码: 输入错误验证码: 练习,把验证码功能加入到顾客管理系统。 //过滤器——————————————————————————————————— u 过滤器(filter) ①开发过滤器环节: 1. 创立继承HttpServlet同步实现Filter接口 2. 默认filter不生效,需要配备. web.xml: <!-- 自己配备一种filter /*表达对该WEB所有网页都过滤--> <filter> <filter-name>MyFilter</filter-name> <filter-class>com.wmc.filter.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 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.h
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服