HttpSession服务端的会话技术

本文介绍如何使用HttpSession实现简单的购物车功能和登录验证流程。通过创建Book类及其实例,将其添加到用户的会话中实现购物车功能;同时,通过生成验证码并在登录时进行校验,实现基本的安全验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HttpSession服务端的会话技术

1.HttpSession原理
1.当用户第一次访问Servlet时 服务器会给该用户创建一个独立的Session(用于储存浏览信息,储存在服务器) 并生成一个SessionId,(这个id号被储存在cookie中)
2.这个Session在响应浏览器的时候 会被装进cookie中.
3.当用户再一次访问Servlet的时候,请求中会携带着这个SessionId去查看是否有对应的Session
有就拿出来使用没有就新创一个Session(相当于第一次访问)
4.域的作用范围
 Context域(全局只创建一次) > Session域(一个用户创建一个独立的) > Request域(一个窗口创建一个)
5.session域只要会话不结束就会存在
但是session有默认存活时间30分钟
2.利用Httpsession模拟购物功能
1.前提构思
 大概需要几个页面 几个Servlet 需要几个类
2.需求结果
  1.书类:id bookName
  2.map集合 HashMap<String,Book>
  3.根据Id,获取对应的书

2.1关于内容方法

1.HttpSession类它提供了setAttribute()getAttribute()方法存储和检索对象。

2.2测试session储存情况

public class Demo01 extends HttpServlet {
//  http://10.80.8.49:8080/sh-web-servlet04/demo01?username=ww
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          response.setContentType("text/html;charset=UTF-8");
          response.setCharacterEncoding("UTF-8");
          //获取参数
          String username = request.getParameter("username");//获取浏览器提交的username的value值
          //获取session对象
          HttpSession session = request.getSession();//获取服务器中储存session对象信息(对象可以储存一组数据),有就使用没有就创建
          //保存数据
          session.setAttribute("Username", username);//将username储存在session中以"username"标识(服务器中)
          System.out.println(session.getId());//储存在cookie中
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/*
 * 获取session域中的数据
 */
public class Demo02 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          response.setContentType("text/html;charset=UTF-8");
          response.setCharacterEncoding("UTF-8");
          //获取用户session域中的数据没有就创建一个
          HttpSession session = request.getSession();
          //cookie中的session中有id,根据sessionId检索服务器中Username
          String username= (String) session.getAttribute("Username");
          //打印检索到的内容
          System.out.println(username);
          //响应到网页上
          response.getWriter().write(username + ""+session.getId());

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
3.模拟购物车
1.创建Book对象
public class Book implements Serializable {
    private String id;
    private String name;
    public Book() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Book(String id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    @Override
    public String toString() {
        return "Book [id=" + id + ", name=" + name + "]";
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
创建Book储存容器并储存数据
package com.lanou3g.car;
/*
 * 模拟假数据
 */

import java.util.HashMap;

public class BookUtil {
     //声明一个保存书的容器
    private static HashMap<String, Book> books = new HashMap<>();
    //添加数据
    static {
        books.put("1",new Book("1","葵花宝典"));
        books.put("2",new Book("2","九阴真经"));
        books.put("3",new Book("3","辟邪剑谱"));
        books.put("4",new Book("4","如来神掌"));
    }
    //获取容器的

    public static HashMap<String, Book> getBooks(){
        return books;
    }
    //按id查找对应书的方法
    public static Book findBookById(String id) {
        return books.get(id);
    }

}
3.向Book中储存数据

import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;

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 AddBook extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
        //获取点击是那一本书(获取参数)
        String id = request.getParameter("id");
        Book book = BookUtil.findBookById(id);
        //创建一个容器(相当于购物车 保存买的书)
        //两种情况 1.已经存过书了 2.没存过
        HttpSession session = request.getSession();
        session.getAttribute("car");
        //把这个容器添加到session中
        ArrayList<Book> car = (ArrayList<Book>) session.getAttribute("car");
        if (car == null) {
            //相当于第一次访问 创建容器
            car = new ArrayList<>();
        }
        //把书添加到容器中
        boolean add = car.add(book);
        System.out.println(book);
        System.out.println(add);
        //把容器添加到容器中session中
        session.setAttribute("car", car);
        //显示添加成功
        //1秒后返回商品列表页
         Map<String, String[]> map = request.getParameterMap();

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
4.展示商品
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
 * 展示商品列表
 */
public class ShowAllBooks extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
        /*
         * 1.获取所有书
         * 2.遍历输出 书名到网页上
         * 3.需要给书名添加一个连接(a标签)
         * 4.还需要点击书名的时候 能知道点的是哪本
         */
        Book book = new Book();
        PrintWriter out = response.getWriter();
//      Map<String, String[]> map = request.getParameterMap();
        HashMap<String, Book> books = BookUtil.getBooks();
        for (String key : books.keySet()) {
            book = books.get(key);
//          request.getContextPath();
            //响应到网页上
            out.write("<a href='addbook?id="+book.getId()+"'>"+book.getName()+"</a><br/>");
        }
        //添加链接购物车的的连接
        out.write("<a href='"+request.getContextPath()+"/ww/showCar'/>查看购物车</a>");
           //设置session有效时间
        request.getSession().setMaxInactiveInterval(1);
    }


    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
4.展示购物车
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;

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 ShowCar extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();
        // 获取session对象
        HttpSession session = request.getSession();
        // 判断session保存数据是否是空
        ArrayList<Book> car = (ArrayList<Book>) session.getAttribute("car");
        if (car != null) {
                  //遍历输出
            for (Book book : car) {
                out.write(book + "<br/>");
                System.out.println(123);
            }

        }else {
            System.out.println("555");
            out.write("购物车是空");
            //2秒跳回 商品页面
            response.setHeader("refresh", "3;url="+ request.getContextPath()+"");
        }

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

3.登录页面

3.1二维码
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 cn.dsna.util.images.ValidateCode;

/* 包名 ValidateCode.jar
 * 人类与计算机的图灵测试(验证码)
 * 
 */
public class CodeServlert extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //使用jar生产验证码
        //fun(response);
        ValidateCode vCode  = new ValidateCode(100, 25, 4, 9);
        //获取生成的验证码字符串
        String code = vCode.getCode();
        //传值方式1.拼接网址字符串 2.使用域对象
        //使用session来储存验证码
        request.getSession().setAttribute("Wcode", code);
        System.out.println(code+"1");
        //写到网页上(通过 响应中的字节流 写回网页)
        vCode.write(response.getOutputStream());
    }

    private void fun(HttpServletResponse response) throws IOException {
        int width = 110;
        int height = 25;
        // 在内存中创建一个画布
        BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        // 创建一个画笔
        Graphics g = img.getGraphics();

        // 给图片添加背景色
        g.setColor(Color.PINK);// 设置一个颜色
        g.fillRect(1, 1, width - 2, height - 2);// 填充颜色

        // 给边框一个色
        g.setColor(Color.RED);
        g.drawRect(0, 0, width - 1, height - 1);// 设置边框的显示坐标

        // 设置文本样式
        g.setColor(Color.BLUE);
        g.setFont(new Font("宋体", Font.BOLD | Font.ITALIC, 15));

        // 给图片添加文本
        Random rand = new Random();
        int position = 20;
        for (int i = 0; i < 4; i++) {
            g.drawString(rand.nextInt(10) + "", position, 20);// 给图片填充文本
            position += 20;
        }

        // 添加9条干扰线
        for (int i = 0; i < 9; i++) {
            g.drawLine(rand.nextInt(width), rand.nextInt(height), rand.nextInt(width), rand.nextInt(height));
        }
        // 将图片对象以流的方式输出的客户端
        ImageIO.write(img, "jpg", response.getOutputStream());
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
3.2数据接收与判断

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 DoLogin extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
        //获取到请求过来的参数(表单提交过来的参数)
        String userName = request.getParameter("userName");
        String pwd = request.getParameter("pwd");
        String code = request.getParameter("code");

        //wangl 123
        PrintWriter out = response.getWriter();
        if ("wanglong".equals(userName) && pwd.equals("123")) {
            HttpSession session = request.getSession();
            String wcode = (String) session.getAttribute("Wcode");
            System.out.println(code+"2");
            System.out.println(wcode+"3");
            //判断验证码(忽略大小写)
           System.out.println(code.equalsIgnoreCase(wcode));
            if (code.equalsIgnoreCase(wcode)) {
                out.write("欢迎登录");
                 System.out.println("33333");
            }else {
                 System.out.println("444444");
                //把错误信息 从dolongin页面传送1.jsp
                //使用Request域 保存 验证码的错误信息
                request.setAttribute("msg", "验证码错误");
                //请求转发
                request.getRequestDispatcher("/1.jsp").forward(request, response);
            }
        }else {
            //提示登录失败
            //2秒回登录页面
            out.write("验证码或密码错误");
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
3.3jsp页面展示
</head>
<body>
     <%
         // 书写java代码
         // 获取request域中的数据
         String msg = (String)request.getAttribute("msg");
     if(msg != null){
           out.write(msg);
     }

     %>
    <form action="/sh-web-servlet04/DoLogin" method="post">
        用户名:<input type="text" name="userName"/><br>
        密码:<input type="password" name="pwd"/><br>
        验证码:<input type="text" name="code"/>
        <img src="/sh-web-servlet04/code" onclick="changeCode()"/>
        <a href="javascript:changeCode()">看不清换一张</a>
        <br>
        <input type="submit" value="登录"/><br>
    </form>
</body>
</html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值