Session实现一次性验证码(十)

来源:互联网 发布:云计算培训班 编辑:程序博客网 时间:2024/04/30 05:08

(一)创建登录界面

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>验证码演示W</title></head><body><form action="/Project01/LoginServlet"  method="post">  用户名:<input  name="username" type="text"><br/>  密      码:<input name="password" type="password"><br/>  验证码 :<input name="check_code"  type="text">       <img  src="/Project01/CheckServlet"> <input  type="submit"  value="提交"></form></body></html>

(二)验证提交的表单数据

package com.Test;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;//此类处理login.html表单提交public class LoginServlet extends HttpServlet {    private static final long serialVersionUID = 1L;    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        response.setContentType("text/html;charset=utf-8");        String username=request.getParameter("username");        String password=request.getParameter("password");        String checkcode=request.getParameter("check_code");        String  saveCode=(String) request.getSession().getAttribute("check_code");        PrintWriter out=response.getWriter();        //1.把账号、密码分别设置为root、123        if(username.equals("root")&&password.equals("123")&&checkcode.equals(saveCode)){            //2.创建User对象保存账号、密码            User user=new User();            user.setUsername(username);            user.setPassword(password);            //3.创建Session对象保存User对象            request.getSession().setAttribute("user", user);            //4.登陆成功跳转指定页面            response.sendRedirect("/Project01/IndexServlet");        }         else if(checkcode.equals(saveCode)){            out.println("账号或密码错误,请从新输入....");        }else{            out.println("验证码输入错误,请从新输入....");        }    }    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        doGet(request, response);    }}

(三)跳转页面

package com.Test;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;//1.创建IndexServlet显示网站的首界面 public class IndexServlet extends HttpServlet {    private static final long serialVersionUID = 1L;    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        //2.response解决乱码问题        response.setContentType("text/html;charset=utf-8");        //3.创建Session对象保存用户信息        HttpSession session=request.getSession();        //4.方法体中的参数要与setAttribute()键一致        User user=(User) session.getAttribute("user");        if(user==null){            response.getWriter().print("您还未登陆,请<a href='/Project01/login.html'>登陆</a>");        }else{            response.getWriter().print("您已登陆,欢迎您 "+user.getUsername());            response.getWriter().print("<a href='/Project01/LogoutServlet'>退出</a>");            //5.创建Cookie对象用来保存Session的id            Cookie cookie=new Cookie("JSESSIONID",session.getId());            cookie.setMaxAge(30*60);            cookie.setPath("/Project01");            response.addCookie(cookie);        }    }    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        doGet(request, response);    }}

(四)验证码生成

package com.Test;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.io.IOException;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class CheckServlet extends HttpServlet {    private static final long serialVersionUID = 1L;    private static int WIDTH = 60;// 验证码图片的宽度    private static int HEIGHT = 20;// 验证码图片的高度    protected void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        HttpSession session = request.getSession();        // 1.设置响应消息体的类型        response.setContentType("image/jpeg");        // 2.创建ServletOutputStream打印图片        ServletOutputStream sos = response.getOutputStream();        // 3.告知浏览器不要缓存此图片        response.setHeader("Pragma", "No-cache");        response.setHeader("Cache-Control", "No-cache");        response.setDateHeader("Expires", 0);        // 4.创建内存图片并获得图像上下文        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);        Graphics g = image.getGraphics();        // 5.产生随机验证码        char[] rands = generateCheckCode();        // 6绘制图像        drawBackground(g);        drawRands(g, rands);        // 7.绘制完毕,完成图像        g.dispose();        // 8.将图片打印到浏览器上        ByteArrayOutputStream bos = new ByteArrayOutputStream();        ImageIO.write(image, "JPEG", bos);        byte[] buf = bos.toByteArray();        response.setContentLength(buf.length);        sos.write(buf);        bos.close();        sos.close();        // 9.将验证码存入到Session中        session.setAttribute("check_code", new String(rands));    }    private void drawRands(Graphics g, char[] rands) {        g.setColor(Color.BLACK);        g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));        // 10在不同高度上输入验证码的每一个字符        g.drawString("" + rands[0], 1, 17);        g.drawString("" + rands[1], 16, 15);        g.drawString("" + rands[2], 31, 18);        g.drawString("" + rands[3], 46, 16);    }    private void drawBackground(Graphics g) {        // 11.绘制背景        g.setColor(new Color(0xDCDCDC));        g.fillRect(0, 0, WIDTH, HEIGHT);        // 12.产生120个干扰点        for (int i = 0; i < 120; i++) {            int x = (int) (Math.random() * WIDTH);            int y = (int) (Math.random() * HEIGHT);            int red = (int) (Math.random() * 255);            int blue = (int) (Math.random() * 255);            int green = (int) (Math.random() * 255);            g.setColor(new Color(red, green, blue));            g.drawOval(x, y, 1, 0);        }    }    private char[] generateCheckCode() {        String chars = "0123456789abcdefghijklmnopqrstuvwxyz";        char[] rands = new char[4];        for (int i = 0; i < 4; i++) {            int rand = (int) (Math.random() * 36);            rands[i] = chars.charAt(rand);        }        return rands;    }    protected void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doGet(request, response);    }}

(五)用户实体类

package com.Test;public class User {    private String username;    private String password;    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;    }}

(六)配置Servlet

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  <display-name>Project01</display-name>  <welcome-file-list>    <welcome-file>login.html</welcome-file>  </welcome-file-list>  <servlet>    <description></description>    <display-name>IndexServlet</display-name>    <servlet-name>IndexServlet</servlet-name>    <servlet-class>com.Test.IndexServlet</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>IndexServlet</servlet-name>    <url-pattern>/IndexServlet</url-pattern>  </servlet-mapping>  <servlet>    <description></description>    <display-name>LoginServlet</display-name>    <servlet-name>LoginServlet</servlet-name>    <servlet-class>com.Test.LoginServlet</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>LoginServlet</servlet-name>    <url-pattern>/LoginServlet</url-pattern>  </servlet-mapping>  <servlet>    <description></description>    <display-name>LogoutServlet</display-name>    <servlet-name>LogoutServlet</servlet-name>    <servlet-class>com.Test.LogoutServlet</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>LogoutServlet</servlet-name>    <url-pattern>/LogoutServlet</url-pattern>  </servlet-mapping>  <servlet>    <description></description>    <display-name>CheckServlet</display-name>    <servlet-name>CheckServlet</servlet-name>    <servlet-class>com.Test.CheckServlet</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>CheckServlet</servlet-name>    <url-pattern>/CheckServlet</url-pattern>  </servlet-mapping></web-app>

结果:

这里写图片描述


这里写图片描述

原创粉丝点击