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;
    }
}

    

  

原文地址:https://www.cnblogs.com/FlySheep/p/3634655.html