(15)session原理,应用(防止用户非法登录、验证码、关闭浏览器再开启浏览器还能访问之前的session)
当用户打开浏览器,访问某个网站时操作session时,服务器就会在服务器的内存为该浏览器分一个session对象,该session对象呗这个浏览器独占。
这个session对象也可以看做是一个容器,session对象默认存在时间为30min,也可以修改。
A:服务器分配给A客户端的session对象……
如何理解session:
①session可以看做一个容器类似于HashMap,有两列,每一行就是session 的一个属性。每个属性都包含两个部分,一个是该属性的名字,另外一个是它的值(Object)
②Q:如果同一个用户浏览器,向session设置一个属性的时候,如果名字相同,会出现的情况是?
ans:会替换该对象的值。
session小结
①session是存在服务器的内存中
②一个用户浏览器独享一个session域对象
③session中的属性的默认声明周期是30分钟,可以通过web.xml来修改
方法一:在tomcat6.0的conf文件的web.xml文档中,搜索Session,<session-timeout>30</session-timeout>
可以把所有web应用都生效。
方法二:在单个的web应用下修改web.xml
<!-- 设置session存在时间,若在总的web.xml中也修改,则以项目的web.xml为准 -->
<session-config>
<session-timeout>10</session-timeout>
</session-config>
方法三:
④session可以存放对象
⑤如果session中可以存放多个属性
⑥如果session.setAttribute(“name”,value),若名字重复,则会替换该属性
session生命周期和cookie生命周期对比
session周期是发呆时间,如果我们设置session是10秒,是指:在10s内,没有操作,则此session中的所有属性失效。
如果在9秒时候,你访问session,则重新计时.若重启Tomcat、reload web或者关机,则session会失效。
我们也可以通过函数,使session失效。invalidate()该方法通常用于安全退出,是让session所有属性失效。
若希望某个session某个属性失效,session.removeAttribute(java.lang.String name);
cookie的生命周期是指累计时间,不管用户是否访问过该cookie
工作原理图
切换到新的浏览器,创建新的session属性。
不同浏览器创建新的session,session不能被不同浏览器共享。
session更深层次理解:为什么服务器能够为不同的浏览器提供不同的session?
当访问servlet1时,请求端没有没有带sessionid,那么响应端会回复一个set-Cookie:JSESSION=…..。这个cookie在客户端保存起来。当访问servlet2时,就会将此cookie发给服务器,所以服务器能够取到此sessionid,从而服务器知道有session,这个发请求的浏览器是曾经创建过session的。
应用一:防止用户非法登录到某个页面
实际例子:在UserManager2中的LoginClServlet中写用户对象session,然后在MainFrame中获取用户对象session,若为空,则为非法登录。
应用二:用户登录时验证输入的验证码是否正确
原理:使用Java的绘图技术。
这里最重要的是生成验证码的servlet
public class CreateCode extends HttpServlet {
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//7.进制浏览器缓存随机图片
response.setDateHeader("Expires", -1);
response.setHeader("Cache-Control", "no-chache");
response.setHeader("Pragma", "no-cache");
//6.通知客户机以图片形式打开发送过去的数据
response.setHeader("Content-type", "image/jpg");
//1.在内存中创建一个图片
BufferedImage image=new BufferedImage(80,30,BufferedImage.TYPE_INT_RGB);
//2.向图片上写数据
Graphics g=image.getGraphics();
//设置颜色
g.setColor(Color.BLACK);
g.fillRect(0, 0, 80, 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();
String num=r.nextInt(9999999)+"";
StringBuffer sb=new StringBuffer();
for(int i=0;i<7-num.length();i++){
sb.append("0");//随机生成1-7位数,若随机生成的位数不够,则前面用0补。
}
num=sb.toString()+num;
return num;
}
如何使用:<img src='/myCheckCode/CreateCode'/>
例如:
<img src='/myCheckCode/CreateCode'/>
对session的销毁时间的讨论–借助一个案例:
面试题:(应用:关闭IE,再打开IE,上次购买的商品还在–》涉及到session的销毁时间)
分析:我们的session生命周期如果是30min,该session不会虽浏览器的关闭,而自动销毁。
我们使用代码来实现该功能(session+cookie)
实例:session2