JSP实现登录功能之添加验证码_JSP编程

jsp登陆验证,网页登陆验证带验证码校验,登录功能之添加验证码

part_1:专门用于生成一个验证码图片的类:VerificationCode.Java

package cn.mike.javase.test;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
import org.junit.Test;
/**
 * @author : Administrator
 * @function : 这是用来测试随机生成验证码图片的类;
 */
public class VerificationCode {
  /**
   * 单元测试,试一下能不能自动生成验证码图片
   */
  // 这个函数是单元测试时使用的,这里private一下外面就调用不到了;
  /* @Test */
  /* public */private void test_fun() {
    VerificationCode vc = new VerificationCode();
    BufferedImage image = vc.getImage();
    try {
      // 生成验证码图片,并保存到指定的路径
      VerificationCode.output(image, new FileOutputStream(new File(
          ".\\image\\vcode_2.jpg")));
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }
    // 将随机生成的文本内容输出到控制台,用于校验
    System.out.println(vc.getText());
  }
  private int w = 70;// 宽
  private int h = 35;// 高
  private String text;// 文本内容(验证码字符串)
  private Random r = new Random();
  private String[] fontNames = { "宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312" };
  // 随机字符集合中不包括0和o,O,1和l,因为这些不易区分
  private String codes = "23456789abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYXZ";
  // 验证码图片的背景色:白色
  private Color bgColor = new Color(255, 255, 255);
  /**
   * 返回一个验证码图片buffer对象:BufferedImage
   */
  public BufferedImage getImage() {
    BufferedImage image = createImage();
    // 获取绘图环境(画笔工具)
    Graphics2D g2 = (Graphics2D) image.getGraphics();
    // sb : 用来保存验证码字符串文本内容
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 4; ++i) {// 随机生成4个字符
      String s = randomChar() + "";
      sb.append(s);
      float x = i * 1.0F * w / 4;
      g2.setFont(randomFont());
      g2.setColor(randomColor());
      g2.drawString(s, x, h - 5);
    }
    this.text = sb.toString();// 记录验证码文本内容
    drawLine(image);// 画干扰线
    return image;
  }
  /**
   * @return 获取验证码文本内容
   */
  public String getText() {
    return text;
  }
  /**
   * @param image
   * @param out
   *      将文本写到指定的输出流。比如本测试中FileOutputStream指定的保存路径
   */
  public static void output(BufferedImage image, OutputStream out) {
    try {
      ImageIO.write(image, "jpeg", out);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  private void drawLine(BufferedImage image) {
    Graphics2D g2 = (Graphics2D) image.getGraphics();
    for (int i = 0; i < 3; ++i) {// 画3条干扰线
      int x1 = r.nextInt(w);
      int y1 = r.nextInt(h);
      int x2 = r.nextInt(w);
      int y2 = r.nextInt(h);
      g2.setColor(Color.BLUE);
      g2.drawLine(x1, y1, x2, y2);
    }
  }
  private Color randomColor() {
    int red = r.nextInt(150);
    int green = r.nextInt(150);
    int blue = r.nextInt(150);
    return new Color(red, green, blue);
  }
  private Font randomFont() {
    int index = r.nextInt(fontNames.length);
    String fontName = fontNames[index];
    int style = r.nextInt(4);
    int size = r.nextInt(5) + 24;
    return new Font(fontName, style, size);
  }
  private char randomChar() {
    int index = r.nextInt(codes.length());
    return codes.charAt(index);
  }
  private BufferedImage createImage() {
    BufferedImage image = new BufferedImage(w, h,
        BufferedImage.TYPE_INT_RGB);
    Graphics2D g2 = (Graphics2D) image.getGraphics();
    g2.setColor(this.bgColor);
    g2.fillRect(0, 0, w, h);
    return image;
  }
}

part_2:登录界面:Login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
  String path = request.getContextPath();
  String basePath = request.getScheme() + "://"
      + request.getServerName() + ":" + request.getServerPort()
      + path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'Login.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
  <link rel="stylesheet" type="text/css" href="styles.css">
  -->
    <script type="text/javascript">
  function _change_verity_code() {
    var imgElem = document.getElementById("img_src");
    //添加一个请求参数a是因为,通常浏览器都有缓存,点击换一张的时候没反应,所以加一个请求参数,获取当前请求时间,可以精确到毫秒,所以每次请求的参数都不同,所以浏览器有缓存也不妨碍;
    imgElem.src = "/ServletDemoProject/servlet/GetVerificationCodeServlet?a="
        + new Date().getTime();
  }
</script>
  </head>
  <%
    String fdbkMsg = (String) request.getAttribute("fdbkMsg");
    if (null == fdbkMsg) {
      fdbkMsg = "";
    }
  %>
  <%
    Boolean logedIn = (Boolean) session.getAttribute("logedIn");
    if (null == logedIn) {
      logedIn = false;
    } else if (logedIn) {
      //如果在本次会话已经登陆,直接重定向到success-page-1
      response
          .sendRedirect("/ServletDemoProject/LOGIN-DEMO/success-page-1.jsp");
    }
  %>
  <%
    String username = "";
    Cookie[] cookies = request.getCookies();
    if ((null != cookies) && (cookies.length > 0)) {
      for (Cookie c : cookies) {
        if ("admin".equals(c.getValue())) {
          username = "admin";
          break;
        }
      }
    }//end if-condition
  %>
  <body>
    <br>
    <div align="center">
      请登录:
      <br>
      <form action="/ServletDemoProject/servlet/LoginVerificationServlet"
        method="post">
        <div>
          用户名:
          <input type="text" name="username" value="<%=username%>" />
          <br>
        </div>
        <div>
          密  码:
          <input type="password" name="password" />
          <br>
        </div>
        <div>
          验证码:
          <input type="text" name="code_text" size="3" />
          <img src="/ServletDemoProject/servlet/GetVerificationCodeServlet"
            id="img_src" />
          <a href="javascript:_change_verity_code()">换一张</a>
          <br>
        </div>
        <div>
          <font color='red'><%=fdbkMsg%></font>
          <br>
        </div>
        <div>
          <input type="submit" value="提交" />
          <br>
        </div>
      </form>
    </div>
  </body>
</html> 

part_3:处理登录校验的servlet :LoginVerificationServlet.java

package cn.mike.servlet.test_1212;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.mike.javase.test.VerificationCode;
public class GetVerificationCodeServlet extends HttpServlet {
  private static final long serialVersionUID = -3520994675366100452L;
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    // 1.新建一个VerificationCode类;
    VerificationCode vc = new VerificationCode();
    // 2.从VerificationCode类中获取BufferedImage对象;
    BufferedImage bufImage = vc.getImage();
    // 3.同时获取验证码中的文本内容,并放到session域中, 用于校验;
    String code_text = vc.getText();
    request.getSession().setAttribute("code_text", code_text);
    // 4.将生成的图片输出到客户端浏览器
    VerificationCode.output(bufImage, response.getOutputStream());
  }// end method-doGet
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    // do same as GET-method :
    doGet(request, response);
  }// end method-doPost
} 

part_4:成功登陆后的提示界面1:success-page-1.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
  String path = request.getContextPath();
  String basePath = request.getScheme() + "://"
      + request.getServerName() + ":" + request.getServerPort()
      + path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'success-page-1.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
  <link rel="stylesheet" type="text/css" href="styles.css">
  -->
  </head>
  <%
    String username = (String) session.getAttribute("username");
    if (null == username) {
      //如果username为空值,说明不是通过正常渠道来的,转发到Login页面;
      request.setAttribute("fdbkMsg", "别想走后门进来,赶紧登录!");
      request.getRequestDispatcher("/LOGIN-DEMO/Login.jsp").forward(
          request, response);
    }
  %>
  <body>
    <br>
    <%=username%>已经成功登陆。
    <br>
    <font>您可以选择浏览:</font>
    <br>
    <a href="/ServletDemoProject/LOGIN-DEMO/success-page-2.jsp">点这儿有精彩.</a>
    <br>
    <a href="/ServletDemoProject/LOGIN-DEMO/success-page-2.jsp">点这儿更精彩.</a>
    <br />
    <a href="/ServletDemoProject/LOGIN-DEMO/success-page-2.jsp">你敢点这儿吗.</a>
    <br />
  </body>
</html> 

part_5:成功登陆后的提示界面1:success-page-2.jsp

<%@ page language="java" import="java.util.Date" pageEncoding="UTF-8"%>
<%@ page language="java" import="java.text.SimpleDateFormat"%>
<%
  String path = request.getContextPath();
  String basePath = request.getScheme() + "://"
      + request.getServerName() + ":" + request.getServerPort()
      + path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'success-page-2.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
  <link rel="stylesheet" type="text/css" href="styles.css">
  -->
  </head>
  <%
    String username = (String) session.getAttribute("username");
    if (null == username) {
      request.setAttribute("fdbkMsg", "呵呵嗒,这里是你来的地方吗?快登陆!");
      //转发到登录界面:
      request.getRequestDispatcher("/LOGIN-DEMO/Login.jsp").forward(
          request, response);
    }
    SimpleDateFormat sDateFormat = new SimpleDateFormat("a");
    Date today = new Date();
    String am_pm_str = sDateFormat.format(today);
    String am_pm_str_in_chinese = "";
    if ("am".equalsIgnoreCase(am_pm_str)) {
      am_pm_str_in_chinese = "上午";
    } else
      am_pm_str_in_chinese = "下午";
    // set null;
    sDateFormat = null;
    today = null;
    am_pm_str = null;
  %>
  <body>
    <br />
    <font><b><%=username%><%=am_pm_str_in_chinese%>好,能来到页面2真不简单.</b>
    </font>
  </body>
</html> 

以上所述是小编给大家介绍的JSP实现登录功能之添加验证码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索jsp登录验证码
jsp添加验证码
jsp登录验证码实现、jsp验证码的实现、jsp 实现图片验证码、jsp实现验证码、jsp登录验证码,以便于您获取更多的相关知识。

时间: 2024-10-12 09:38:13

JSP实现登录功能之添加验证码_JSP编程的相关文章

JBuilder2005实战JSP之登录页面实现代码[图]_JSP编程

通过File->New...->Web->双击JSP图标,弹出创建JSP向导的对话框,如下图所示: 图 3 通过向导创建login.jsp ·Web module:如果一个工程下有多个Web模块,你可以通过这儿指定JSP所要加入到的Web模块,因为我们的工程中只有一个webModule,所以是向导将默认设置为webModule. ·Name :键入JSP文件名,你可以键入.jsp后缀,也可以不写后缀,直接键入login就可以了. Generate sample bean选项勾选后JBui

JSP使用MVC模式完成删除和修改功能实例详解_JSP编程

本文实例讲述了JSP使用MVC模式完成删除和修改功能的方法.分享给大家供大家参考.具体如下: 目标: ① 进一步理解MVC模式: ② 掌握删除功能的基本实现过程: ③ 掌握修改功能的基本实现过程. 主要内容: ① 使用MVC完成删除功能: ② 使用MVC模式完成信息更新功能. 1.如何使用MVC模式完成删除功能 根据MVC模式的特点,分别考虑MVC的3个部分. ① 首先考虑V部分: 输入:通常删除功能是在查询的基础上完成的,所以在用户信息列表界面上可以添加删除的超链. 输出:提示用户删除是否成功

jsp登录会话的简单实现_JSP编程

jsp登录会话的简单实现 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd&

JSP+Servlet+JavaBean实现登录网页实例详解_JSP编程

本文实例讲述了JSP+Servlet+JavaBean实现登录网页的方法.分享给大家供大家参考.具体如下: 这里涉及到四个文件: 1. 登录页面:login.html 2. 登录成功欢迎页面:login_success.jsp 3. 登录失败页面:login_failure.jsp 4. Servlet处理文件:LoginServlet.java 其实还涉及到一个文件:web.xml,这个后面再说: 下面分别介绍这几个文件: 1. 登录页面:login.html <!-- 该Login页面是一个

JSP模板应用指南(上)_JSP编程

Window 工具包提供了一种典型的布局机制,比如说在一个容器中确定部件元素的位置.在AWT 和 Swing都有布局管理器,而在VisualWorks Smalltalk中有wrapper.本文将介绍一种JSP模板机制,它允许布局被封装和重新利用.JSP模板最小化了布局改变所造成的影响,这里我们将鼓励大家采用封装模块化设计. 尽管 Web开发工具的改进非常迅速,但是它们仍然落后于图形用户界面(GUI)工具包(Swing 和 VisualWorks Smalltalk).例如,在传统的GUI工具包

JSP实现的简单分页显示效果代码_JSP编程

本文实例讲述了JSP实现的简单分页显示效果代码.分享给大家供大家参考,具体如下: <%@ page contentType="text/html;charset=gb2312" %> <%@ page language="java" import="java.sql.*" %> <script language="javascript"> function newwin(url) { var

JSP+EXt2.0实现分页的方法_JSP编程

本文实例讲述了JSP+EXt2.0实现分页的方法.分享给大家供大家参考.具体如下: JavaScript代码: Ext.onReady(function(){ var sm = new Ext.grid.CheckboxSelectionModel(); var cm = new Ext.grid.ColumnModel([ new Ext.grid.RowNumberer(), sm, {header:'编号',dataIndex:'id',sortable:true}, {header:'名

JSP彩色验证码_JSP编程

    生成有4个随机数字和杂乱背景的图片,数字和背景颜色会改变,服务器端刷新(用history.go(-1)也会变)原型参考ALIBABA  http://china.alibaba.com/member/showimage 产生验证码图片的文件-----image.jsp <%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*&

JSP中 Session和作用域的使用_JSP编程

几乎所有的Web开发语言都支持Session功能,Servlet也不例外. Servlet/JSP中的Session功能是通过作用域(scope)这个概念来实现的. 作用域分为四种,分别为: page 在当前页面有效(仅用于JSP中) request 在当前请求中有效 session 在当前会话中有效 application 在所有应用程序中有效 是不是看不太明白?page因为仅用于JSP中,这里只讲述其他三种作用域. 首先要声明的一点,所谓"作用域"就是"信息共享的范围&q