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 {
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");
HttpSession session = request.getSession();
session.setAttribute("Username", username);
System.out.println(session.getId());
}
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;
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");
HttpSession session = request.getSession();
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();
}
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;
}
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);
HttpSession session = request.getSession();
session.getAttribute("car");
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.setAttribute("car", car);
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");
Book book = new Book();
PrintWriter out = response.getWriter();
HashMap<String, Book> books = BookUtil.getBooks();
for (String key : books.keySet()) {
book = books.get(key);
out.write("<a href='addbook?id="+book.getId()+"'>"+book.getName()+"</a><br/>");
}
out.write("<a href='"+request.getContextPath()+"/ww/showCar'/>查看购物车</a>");
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();
HttpSession session = request.getSession();
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("购物车是空");
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;
public class CodeServlert extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ValidateCode vCode = new ValidateCode(100, 25, 4, 9);
String code = vCode.getCode();
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;
}
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