资源描述
第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
展开阅读全文