day09-cookie&sessionの代码学习1
来源:互联网 发布:淘宝宝贝下架怎么上架 编辑:程序博客网 时间:2024/05/21 11:10
day09-cookie&sessionの代码学习1
1.定义两个实体类和两个模拟数据库存储数据的类
Book.java
package com.itheima.domain;import java.io.Serializable;/** * * @author wangli * */public class Book implements Serializable { private int id; private String name; private String author; private int price; private String description; public Book() { super(); // TODO Auto-generated constructor stub } public Book(int id, String name, String author, int price, String description) { super(); this.id = id; this.name = name; this.author = author; this.price = price; this.description = description; } @Override public String toString() { return "Book [id=" + id + ", name=" + name + ", author=" + author + ", price=" + price + ", description=" + description + "]"; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; }}
BookDB.java(Book实体类的模拟数据库存储数据)
package com.itheima.domain;import java.util.HashMap;import java.util.Map;public class BookDB { public static Map<String,Book> books = new HashMap<String, Book>(); static{ books.put("1", new Book(1, "金瓶梅", "吴永发", 5, "古典爱情小说")); books.put("2", new Book(2, "葵花宝典", "胡海强", 5, "欲练此功,必须练好基本功")); books.put("3", new Book(3, "辟邪剑法", "郭培峰", 5, "欲练此功,必须练好基本功")); books.put("4", new Book(4, "玉女心经", "陈壮", 10, "男子不要练")); books.put("5", new Book(5, "厚脸皮是什么炼成的", "张冰", 5, "不要练小说")); } public static Map<String,Book> getAllBooks(){ return books; } public static Book getBookById(String key){ return books.get(key); }}
User.java
package com.itheima.domain;public class User { private String username; private String password; private String nickName;//昵称 public User() { super(); } public User(String username, String password, String nickName) { super(); this.username = username; this.password = password; this.nickName = nickName; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; }}
UserDB.java(User.java模拟数据库存放数据)
package com.itheima.domain;import java.util.ArrayList;import java.util.List;import com.itheima.domain.User;public class UserDB { private static List<User> list = new ArrayList<User>(); static{ list.add(new User("why","what","祝梦")); list.add(new User("why2","what2","祝梦2")); list.add(new User("why3","what3","祝梦3")); } public static User login(String username,String password){ for(User user :list){ if(username.equals(user.getUsername()) && password.equals(user.getPassword())){ return user; } } return null; }}
工具类
Md5Util.java用来加密的工具类
package com.itheima.test;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import org.junit.Test;import sun.misc.BASE64Encoder;/** * md5加密 * @author wangli * */public class Md5Util { //加密 public static String encode(String str){ //1.得到MessageDigest对象 //123 4354354345434gtrytyrtytrrtytr RSA try { MessageDigest md5 =MessageDigest.getInstance("md5"); byte afterMd5[] = md5.digest(str.getBytes());//加密 //System.out.println(new String(afterMd5)); //将一个非ascii码转成ascii码-------------base64编码 (64个字符构成) 就是将三个字节转成四个字节 // 8%3 3 3 2+1 = 1+2 == BASE64Encoder b64 = new BASE64Encoder(); return b64.encode(afterMd5); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); throw new RuntimeException(e); } } @Test public void testMd5(){ for (int i = 0; i < 20; i++) { String md5= Md5Util.encode("bbbb"+i); System.out.println(md5); } }}
练习1:通过用户名和密码及验证码登录和注销的功能实现
login.html登录界面
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>login.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"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> </head> <body> <table width="100%" border="0" cellspacing="0" cellpadding="4"> <tr> <td bgcolor="#000099"> <table width="100%" border="0" cellspacing="0" cellpadding="4"> <tr> <td bgcolor="#FFFFFF"> <b>*</b> </td> <td width="100%"><font color="#CCCCCC"> <font color="#FFFFFF">Title</font></font></td> </tr> </table></td> </tr> <tr> <td width="100%" bgcolor="#EAEAEA" colspan="2"> <form action="/day09_01_session/servlet/LoginServletDemo1" method="post"><p> <label for="textfield">Field 1</label> <br> <input type="text" name="username"> </p> <p> <label for="textfield2">Field 2</label> <br> <input type="password" name="password" > </p> <p> <label for="textfield2">验证码</label> <br> <input type="text" name="authCode" ><img src="/day09_01_session/authcode.jpg" id="mycode"/><a href="javascript:myclick()">看不清,换一张</a> </p> <p> <input type="submit" value="GO"> </p> <p> </p> </form> </td> </tr></table><script> function myclick(){ document.getElementById("mycode").src="/day09_01_session/authcode.jpg?time="+new Date().getTime(); }</script> </body></html>
AuthCodeServletDemo5.java实现验证码的生成
package com.itheima.web.app1;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;/** * 验证码输出 * @author wangli * */public class AuthCodeServletDemo5 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int height=25,width=120; //1.得到一个图像缓冲区 BufferedImage BufferedImage bimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //2.得到一只画笔 Graphics Graphics g = bimage.getGraphics(); //3.画矩形,填背景色 画干扰线条 画字符串 //3.1画矩形框时,可以先调画笔颜色 g.setColor(Color.BLUE);//先调画笔颜色 g.drawRect(0, 0 , width, height); //3.2填充背景 g.setColor(Color.YELLOW);//调画笔颜色 g.fillRect(1,1, width-2, height-2); //3.3画干扰线条 g.setColor(Color.GRAY);//调画笔颜色为灰色 Random random = new Random();//因为要画随机线条,引入随机数 for (int i = 0; i < 20; i++) { //random.nextInt(width)因为要确定x坐标不能超范围 g.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height)); } //3.4画随机字符串 先要控制字符颜色,及字体大小 g.setColor(Color.RED); // Font.BOLD|Font.ITALIC 两种类型做迭加 g.setFont(new Font("黑体",Font.BOLD|Font.ITALIC,20)); //补充加入Session HttpSession session = request.getSession();//如果 没有就创建一个新的session对象 有就直接返回 StringBuffer sb = new StringBuffer(); for (int i = 0; i < 4; i++) { String str =random.nextInt(9)+""; sb.append(str);//加入到StringBuffer中的字符串,跟发送到客户端的验证一样 g.drawString(str,20+(i*20), 20); } //补充加入Session 在session中放入key-value session.setAttribute("code", sb.toString()); //4.将画好的缓冲区的图像写入到浏览器中 //4.1服务器要通过响应消息头,告知客户端,给它写的内容是一个一幅图片 response.setHeader("Content-Type", "image/jpeg"); //为了更好的让验证码,在客户端不要缓存,设置响应头,告诉客户端不要缓存 response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.setHeader("Expires", "-1"); //4.2 写数据到浏览器 ImageIO ImageIO.write(bimage, "jpg", response.getOutputStream()); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}
LoginServletDemo1.java登录验证的servlet
package com.itheima.web.app1;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;import com.itheima.domain.User;import com.itheima.domain.UserDB;/** * 登录验证 * @author wangli * */public class LoginServletDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.解决post提交过来的数据乱码问题 request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession();//得到session对象 //2.获取参数 String username = request.getParameter("username"); String password = request.getParameter("password"); String authCode = request.getParameter("authCode"); //3.判断 验证码是否正确,如果验证码正确,再验证用户名和密码 String serverCode = (String)session.getAttribute("code"); if(serverCode.equals(authCode)){ //说明验证码输入正确 //3.1进一步验证用户名及密码 User u = UserDB.login(username, password); if(u!=null){ //说明登录成功 //4.将登录成功的用户信息存入session中 session.setAttribute("loginedUser", u); //5.定位到系统主界面 response.sendRedirect(request.getContextPath()+"/servlet/IndexServlet"); }else{ //说明登录失败 out.write("登录失败,用户名或密码错误,请重新登录"); response.setHeader("Refresh", "1;URL="+request.getContextPath()+"/login.html"); } }else{ //验证码输入错误 out.write("你有病,验证码没看清吗?1 秒后重新登录"); response.setHeader("Refresh", "1;URL="+request.getContextPath()+"/login.html"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}
IndexServlet.java当用户名或密码错误时,跳转到此servlet进行处理
package com.itheima.web.app1;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;import com.itheima.domain.User;//主页面public class IndexServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession();//得到session对象 User u = (User)session.getAttribute("loginedUser");//获取用户的登录信息 if(u!=null){ //说明登录过了 out.write("欢迎您,"+u.getNickName()+" <a href='"+request.getContextPath()+"/servlet/LogoutServlet'>注销</a>"); }else{ //没登录 out.write("你有病,现在还没有权限,请先登录"); response.setHeader("Refresh", "1;URL="+request.getContextPath()+"/login.html"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}
LogoutServlet 当点击注销时,进入此servlet处理
package com.itheima.web.app1;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 注销用户登录信息 * @author wangli * */public class LogoutServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getSession().removeAttribute("loginedUser");//注销,就是将登录信息清空 response.setHeader("Refresh", "1;URL="+request.getContextPath()+"/login.html"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}
避免重复提交信息的例子
RepeatLoginServletDemo1.java登录页面
package com.itheima.web.app2;import java.io.IOException;import java.io.PrintWriter;import java.math.BigInteger;import java.util.Random;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class RepeatLoginServletDemo1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.解决post提交过来的数据乱码问题 request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); //2.服务器端如何生成一个唯一的字符串 //2.1时间+随机数 (SimpleDateFormat (yyyyMMddhhmmss)+ new Random().nextInt() //2.2网卡Mac址址+随机数 ///String id = UUID.randomUUID().toString(); //2.3Md5 加密可以生成一个 唯一的密文 //2.4可以查看struts2源码 s:token 2^128-1 toString(36)是指36进制 (26个字母+10个数字 ) String id= new BigInteger(128, new Random()).toString(36).toUpperCase(); //将这个id同时存入session中 request.getSession().setAttribute("Token", id); out.write("<form action='"+request.getContextPath()+"/servlet/TokenServletDemo2' method='get'>"); out.write("用户名:<input type='text' name='username' /><br/>"); out.write("<input type='hidden' name='token' value='"+id+"' /><br/>"); out.write("<input type='submit' value='登录'/><br/>"); out.write("</form>"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}
TokenServletDemo2.java重复刷新页面提交时,交给此servlet处理
package com.itheima.web.app2;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 TokenServletDemo2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); //1.取出两个token值进行比较 String token = request.getParameter("token"); String username = request.getParameter("username"); HttpSession session = request.getSession(); String Token = (String) session.getAttribute("Token"); //2.如果相同,说明第一次提交 ------------此时就将这个id从session中删除 if(token.equals(Token)){ session.removeAttribute("Token");//清除 response.getWriter().write("username="+username); }else{ //3.如果不相同,提示,请不要重复提交表单 response.getWriter().write("请不要重复提交表单"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}
购物车实现例子
ShowAllBooks.java显示所有书籍和显示加入购物车中的书籍
package com.itheima.web.app3;import java.io.IOException;import java.io.PrintWriter;import java.util.List;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;import com.itheima.domain.Book;import com.itheima.domain.BookDB;/** * 显示所的有书籍,显示购物车中的所有商品 * @author wangli * */public class ShowAllBooks extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 显示所的有书籍 response.setContentType("text/html;charset=UTF-8");//字符流乱码 PrintWriter out = response.getWriter(); //1.得到所有书籍列表 out.write("本站提供以下奇葩书籍:<br>"); Map<String,Book> map = BookDB.getAllBooks(); for(Map.Entry<String,Book> entry: map.entrySet()){ //取到每一本书 Book book = entry.getValue(); //?id=book.getId()&name=book.getName()---->get数据发送给服务器 String url = request.getContextPath()+"/servlet/DetailServlet?id="+book.getId(); url = response.encodeURL(url);//重写url,就要重写这个站点所有的url out.write(book.getName()+"<a href='"+url+"'>查看详情</a><br>"); } //2.显示购物车中的所有商品 out.write("<br>购物车中的商品如下:<br>"); HttpSession session = request.getSession();//得到session对象 List<Book> list = (List<Book>)session.getAttribute("cart");// 假定购物车的名字是cart //2.1遍历 if(list!=null && list.size()>0){ //说明购物车中有商品 for(Book cartbook :list){ out.write(cartbook.getName()+"<br>"); } } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}
DetailServlet.java物品详情
package com.itheima.web.app3;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 com.itheima.domain.Book;import com.itheima.domain.BookDB;/** * 查看详情 * @author wangli * */public class DetailServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8");//字符流乱码 PrintWriter out = response.getWriter(); //1.得到书的id String id = request.getParameter("id"); //2.根据id,得到book对象 Book book = BookDB.getBookById(id); //3.显示到浏览器 out.write(book.toString()); //4.提供一个购买链接 String url = request.getContextPath()+"/servlet/BuyServlet?id="+id; url = response.encodeURL(url);//重写url,就要重写这个站点所有的url out.write("<a href='"+url+"'>购买</a>"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}
BuyServlet.java 点击购买时进行的操作
package com.itheima.web.app3;import java.io.IOException;import java.io.PrintWriter;import java.util.ArrayList;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import com.itheima.domain.Book;import com.itheima.domain.BookDB;/** * 购买 * @author wangli * */public class BuyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8");//字符流乱码 PrintWriter out = response.getWriter(); //1.得到书的id String id = request.getParameter("id"); //2.根据id,得到book对象 Book book = BookDB.getBookById(id); //3. 购物车代码 HttpSession session = request.getSession(); List<Book> list = (List<Book>) session.getAttribute("cart");//取车子 if(list==null){ //说明你刚进入超市 list = new ArrayList<Book>(); session.setAttribute("cart",list);//第一次进入超市 时,将这个车子绑定到session中 } list.add(book);//车子中加入了一本书 //4.提供返回的链接 String url = request.getContextPath()+"/servlet/ShowAllBooks"; url = response.encodeURL(url);//重写url,就要重写这个站点所有的url out.write("<a href='"+url+"'>继续购买</a>"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}
web.xml各种servlet的配置详情
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>AuthCodeServletDemo5</servlet-name> <servlet-class>com.itheima.web.app1.AuthCodeServletDemo5</servlet-class> </servlet> <servlet> <servlet-name>LoginServletDemo1</servlet-name> <servlet-class>com.itheima.web.app1.LoginServletDemo1</servlet-class> </servlet> <servlet> <servlet-name>IndexServlet</servlet-name> <servlet-class>com.itheima.web.app1.IndexServlet</servlet-class> </servlet> <servlet> <servlet-name>LogoutServlet</servlet-name> <servlet-class>com.itheima.web.app1.LogoutServlet</servlet-class> </servlet> <servlet> <servlet-name>RepeatLoginServletDemo1</servlet-name> <servlet-class>com.itheima.web.app2.RepeatLoginServletDemo1</servlet-class> </servlet> <servlet> <servlet-name>TokenServletDemo2</servlet-name> <servlet-class>com.itheima.web.app2.TokenServletDemo2</servlet-class> </servlet> <servlet> <servlet-name>ShowAllBooks</servlet-name> <servlet-class>com.itheima.web.app3.ShowAllBooks</servlet-class> </servlet> <servlet> <servlet-name>DetailServlet</servlet-name> <servlet-class>com.itheima.web.app3.DetailServlet</servlet-class> </servlet> <servlet> <servlet-name>BuyServlet</servlet-name> <servlet-class>com.itheima.web.app3.BuyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DetailServlet</servlet-name> <url-pattern>/servlet/DetailServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>BuyServlet</servlet-name> <url-pattern>/servlet/BuyServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AuthCodeServletDemo5</servlet-name> <url-pattern>/authcode.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>LoginServletDemo1</servlet-name> <url-pattern>/servlet/LoginServletDemo1</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>IndexServlet</servlet-name> <url-pattern>/servlet/IndexServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>LogoutServlet</servlet-name> <url-pattern>/servlet/LogoutServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>RepeatLoginServletDemo1</servlet-name> <url-pattern>/servlet/RepeatLoginServletDemo1</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>TokenServletDemo2</servlet-name> <url-pattern>/servlet/TokenServletDemo2</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ShowAllBooks</servlet-name> <url-pattern>/servlet/ShowAllBooks</url-pattern> </servlet-mapping> </web-app>
0 0
- day09-cookie&sessionの代码学习1
- day09-cookie&sessionの代码学习
- day09-cookie&sessionのPPT学习
- cookie,session,token学习
- cookie和session学习
- Cookie和Session学习
- cookie、session学习笔记
- Cookie与Session学习
- session和cookie学习
- java基础学习day09
- C++学习笔记 day09
- Java学习day09
- java学习day09
- day09-工作--没有学习
- session和cookie学习笔记
- Cookie 与 session 学习笔记
- cookie和session'的学习
- cookie 与 session深入学习
- vim窗口的高度和宽度
- C++Primer学习笔记(9)顺序容器
- leetcode 日经贴,Cpp code -Path Sum II
- httpclient的一些学习心得
- Linux以百万兆字节显示内存大小
- day09-cookie&sessionの代码学习1
- dba_dependencies视图的查询结果
- 从注册表中获取BeyondCompare安装路径
- iOS UICollectionView 入门 05 创建自定义UICollectionViewCell
- 最大的数
- 图片的拉伸问题
- python中的list列表
- C# 类动态添加属性、方法
- poj3667 Hotel