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

下载本文档

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

文档简介

第36讲(会话技术介绍)u 什么是会话?(会话是针对一个网站而言的,不是针对多个网站。)基本概念:指用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,整个这个过程我们称为一次会话。比如打电话,只要电话不断就算一次电话,至于过程中和多少人说过话,说多长时间,都算一次。点一次超链接就是一个request,不可能保存起来。所以要用会话来保存数据。/如何保存用户上次登录时间如何显示用户浏览历史如何把登录的用户名和密码保存到电脑,下次登录,不需要重新输入u 解决之道cookieCookie是客户端技术,服务器把每个用户的数据以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信息,再选中你要的cookieCookie 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 cookieif(cookies != null)/保证有cookie,才去遍历for(Cookie cookie:cookies)/取出名String name=cookie.getName();if(lasttime.equals(name)/显示out.println(您上次登录时间是:+cookie.getValue();/更新时间/把当前日期保存cookieSimpleDateFormat 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(您是第一次登陆.);/把当前日期保存cookieSimpleDateFormat 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大小限制在4kcookie生命周期的再说明:1.cookie默认生命周期是会话级别2.通过setMaxAge() 可以设置生命周期setMaxAge(正数),即多少秒后该cookie失效setMaxAge(0),删除该cookiecookie存放中文,怎么处理存放: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的默认生命周期是30minInterface HttpSession/Interface HttpServletRequestF:tomcatapache-tomcat-8.0.28confweb.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时候,就会自动创建sessionHttpSession 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();/获取sessionHttpSession session=request.getSession();/获取String uname=(String) session.getAttribute(uname);if(uname=null)out.println(session 中没有uname);elseout.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时候,就会自动创建sessionHttpSession 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()用来在页面上打印 开源之祖 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();/这句话就是把随机生成的数值,保存到sessionrequest.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;i4-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的urlout.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)/验证码okrequest.getRequestDispatcher(/Ok).forward(request, response);/到数据库去验证elserequest.setAttribute(err, 验证码错误);request.getRequestDispatcher(/Login).forward(request, response);/out.println(login ok);/效果:输入正确验证码:输入错误验证码:练习,把验证码功能加入到用户管理系统。/过滤器u 过滤器(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 Filterpublic 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);Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException / TODO Auto-generated method stub/获取requestHttpServletRequest 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);elseHttpSession session=httpServletRequest.getSession();User user=(User) session.getAttribute(loginuser);if(user!=null)/该用户合法,放行chain.doFilter(request, response);elserequest.setAttribute(err, 请好好登录);httpServletRequest.getRequestDispatcher(/servlet/LoginServlet).forward(request, response);Overridepublic void init(FilterConfig filterConfig) throws ServletException / TODO Auto-generated method stubu 过滤器链实现方式:1. 在创建一个过滤器(继承HttpServlet同时还要实现Filter接口)2. 配置过滤器配置过滤器的顺序就可以决定调用过滤器的顺序.Filter的执行顺序与在web.xml配置文件中的配置顺序一致,一般把Filter配置在所有的Servlet之前。/对session的销毁时间的讨论-借助一个案例面试题:(应用:关掉IE后,再开IE,上次购买的商品还在,-设计到session销毁时间)分析l 我们的session生命周期如果是30min,该session不会随浏览器的关闭,而自动销毁,而会到30min后,才会被服务器销毁.l 我们使用代码来实现该功能(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讲(简

温馨提示

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

评论

0/150

提交评论