zoukankan      html  css  js  c++  java
  • Java Web总结八Session

    一、Session

      1、每个客户端都有各自的Session对象,以SessionId标识。

      2、Session技术实际上是借助Cookie技术实现的。在创建Session时,会将该Session的ID以Cookie:JSESSIONID=sessionId的形式写给客户端。

      3、Session默认30分钟后失效。

      4、在web.xml文件中配置Session的失效时间:在根元素中增加:

        <session-config>

          <session-timeout>1</session-timeout><!--单位为分钟-->

        </session-config>

      5、客户端禁用了Cookie的解决方法:URL重写。以下两个方法可以实现重写,要对该站所有的URL都进行重写。

        response.encodeRedirectURL(java.lang.String url):针对重定向的地址进行重写。

        response.encodeURL(java.lang.String url):其他地址进行重写。

      6、Session开发中遇到的问题:

        1)内存中的Session非常多,怎么办?

        2)用户在购物中。服务器停掉了该Web应用(或者重新启动了),那么用户购物车中的东西怎么办?

        解决办法:将内存中的所有Session进行持久化

      7、何时Session会被搁置(具体是根据服务器的实现定的。对用户来说是完全透明的)

        1)当服务器停止当前Web应用。

        2)内存中的Session对象太多。

        3)Session长时间没有活动(并没有被销毁)

      8、何时会被激活?

        1)当前Web应用又启动了。

        2)用户又开始使用了(鼠标键盘又开始活动了)。

    二、Session应用——记住验证码

      效果图:

      1、HtML登录页面(SessionLogin.html)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>SessionLogin.html</title>
        
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="this is my page">
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        
        <script type="text/javascript">
            function change(){
                //得到img对象
                var imgObj=document.getElementById("codeImg");
                //重新赋值src
                imgObj.src="/day08/GenerateCode?"+new Date().getTime();
            }
        </script>
        
      </head>
      
      <body>
        <form action="/day08/SessionLoginServlet" method="post">
            <table border="1">
                <tr>
                    <td>用户名:</td>
                    <td><input type="text" name="username"/></td>
                </tr>
                
                <tr>
                    <td>密码:</td>
                    <td><input type="password" name="password"/></td>
                </tr>
                
                <tr>
                    <td>验证码:</td>
                    <td>
                        <input type="text" name="code"/>
                        <img id="codeImg" alt="验证码" src="/day08/GenerateCode"/>
                        <a href="">看不清,换一张</a>
                    </td>
                </tr>
                
                <tr>
                    <td colspan="2"><input type="submit" value="提交"/></td>
                </tr>
            </table>
        </form>
      </body>
    </html>

      2、生成验证码并把验证码存储到Session页面(GenerateCode.java)

    package com.gnnuit.session.app4;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    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;
    import javax.servlet.http.HttpSession;
    
    //生成验证码图片
    public class GenerateCode extends HttpServlet {
    
        private static final long serialVersionUID = 1L;
        private static int WIDTH = 65;
        private static int HEIGHT = 25;
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 设置客户端不要缓存
            response.setHeader("Expires", "-1");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            // 1、创建内存图片,BufferedImage
            BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
                    BufferedImage.TYPE_INT_RGB);
            // 2、通过图片获得画笔Graphics
            Graphics g = image.getGraphics();
            // 2.1画边框
            g.setColor(Color.BLUE);
            g.drawRect(0, 0, WIDTH, HEIGHT);
            // 2.2画背景颜色
            g.setColor(Color.GRAY);
            g.fillRect(1, 1, WIDTH - 2, HEIGHT - 2);
            // 2.3画干扰线9条
            g.setColor(Color.YELLOW);
            Random r = new Random();
            for (int i = 0; i < 9; i++) {
                g.drawLine(r.nextInt(WIDTH), r.nextInt(HEIGHT), r.nextInt(WIDTH),
                        r.nextInt(HEIGHT));
            }
            // 2.4画验证码数字4个
            StringBuffer sb=new StringBuffer();
            g.setColor(Color.RED);
            g.setFont(new Font("宋体", Font.BOLD, 20));
            int x = 7;
            for (int i = 0; i < 4; i++) {
                String number=r.nextInt(9) + "";
                g.drawString(number, x, 20);
                x = x + 15;
                sb.append(number);
            }
            //把验证码存储到Session
            HttpSession session=request.getSession();
            session.setAttribute("code", MD5Encoder.getMD5Value(sb.toString()));
            // 3、输出内存图像到客户端ImageIO
            ImageIO.write(image, "jpeg", response.getOutputStream());
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
    }

    3、判断验证码是否正确页面(SessionLoginServlet.java)

    package com.gnnuit.session.app4;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    //判断验证码是否正确
    public class SessionLoginServlet extends HttpServlet {
    
        private static final long serialVersionUID = 1L;
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
    
            String formCode = request.getParameter("code");
            HttpSession session = request.getSession();
            String sessionCode = (String) session.getAttribute("code");
            if (MD5Encoder.getMD5Value(formCode).equals(sessionCode)) {
                out.write("验证码输入正确");
            } else {
                out.write("验证码错误");
            }
    
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
    }

    4、MD5加密工具类(MD5Encoder.java)

    package com.gnnuit.session.app4;
    
    import java.security.MessageDigest;
    import sun.misc.BASE64Encoder;
    
    //对MD5进行编码
    public class MD5Encoder {
        public static String getMD5Value(String str) {
            String result = null;
            try {
                MessageDigest md = MessageDigest.getInstance("md5");
                byte[] bytes= md.digest(str.getBytes());
                BASE64Encoder be=new  BASE64Encoder();
                result= be.encode(bytes);
            } catch (Exception e) {
                throw new RuntimeException();
            }
            return result;
        }
    }

        

      

  • 相关阅读:
    css 讲浮动,haslayout,BFC的文章
    css 给inline和inline-block元素设置margin和padding
    css inline元素和inline-block元素之间缝隙产生原因和解决办法
    js 匿名函数立即执行问题
    css 解决图片下小空隙问题
    css BFC布局及用处
    css 单行/多行文字垂直居中问题
    js柯里化
    js 回调函数理解与应用
    js 四种调用模式和this的关系总结
  • 原文地址:https://www.cnblogs.com/FlySheep/p/3634655.html
Copyright © 2011-2022 走看看