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">&nbsp;<b>*</b>&nbsp;</td>                        <td width="100%"><font color="#CCCCCC">&nbsp; <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>&nbsp; </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
原创粉丝点击