(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
这里写图片描述

posted @ 2017-09-11 16:54  测试开发分享站  阅读(365)  评论(0编辑  收藏  举报