验证码

3种验证码
1: servlet方式:
login.jsp
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %> 
<%@ page language="java" import="java.sql.*" errorPage="" %> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
<title>用户登录</title> 
<script language="javascript"> 
function loadimage(){ 
document.getElementById("randImage").src = "http://localhost/yanzheng/yan?"+Math.random(); 

</script> 
</head> 
<body> 
<form action="validate.jsp" method="post" name="loginForm"> 
<table width="256" border="0" cellpadding="0" cellspacing="0">

<tr> 
<td width="118" height="22" valign="middle" align="center"><input type="text" name="rand" size="15"></td> 
<td width="138" valign="middle" align="center"><img alt="code..." name="randImage" id="randImage" src="http://localhost/yanzheng/yan" width="90" height="40" border="1" ></td> 
</tr> 
<tr> 
<td height="36" colspan="2" align="center" valign="middle"><a href="javascript:loadimage();"><font class=pt95>看不清点我</font></a></td> 
</tr> 
<tr> 
<td height="36" colspan="2" align="center" valign="middle"><input type="submit" name="login" value="提交"></td> 
</tr> 
</table> 
</form>
</body> 
</html>
web.xml:
<?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">
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>yanzheng</servlet-name>
    <servlet-class>com.li.cn.yanzheng</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>yanzheng</servlet-name>
    <url-pattern>/yan</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>


yanzheng.java:
package com.li.cn;
import java.io.IOException;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class yanzheng extends HttpServlet {
 /**
  * 
  */
 private static final long serialVersionUID = 1L;
 /**
  * Constructor of the object.
  */
 public yanzheng() {
  super();
 }
 /**
  * Destruction of the servlet. <br>
  */
 public void destroy() {
  super.destroy(); // Just puts "destroy" string in log
  // Put your code here
 }

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  
  StringBuffer code = new StringBuffer();
  response.setContentType("image/jpeg");
  BufferedImage image = new BufferedImage(160, 30, BufferedImage.TYPE_INT_RGB);
  String[] fontNames = { "华文行楷", "方正姚体", "方正舒体", "幼圆", "楷体", "隶体", "华文新魏" };
  Graphics g = image.getGraphics();
  
  g.fillRect(0, 0, 180, 40);
  g.setColor(Color.orange);
  int x = 10;
  for (int n = 0; n <4; n++) {
   Font f = new Font(fontNames[((int) (Math.random() * 1000)) % fontNames.length], (((((int) (Math.random() * 1000)) % 2 + 1) == 1) ? Font.BOLD : Font.ITALIC),
           ((int) (Math.random() * 1000)) % 20 + 20);
   g.setFont(f);
   g.setColor(new Color(((int) (Math.random() * 1000)) % 256, ((int) (Math.random() * 1000)) % 256, ((int) (Math.random() * 1000)) % 256));
   int randNumber = ((((int) (Math.random() * 1000)) % 2 == 0) ? (((int) (Math.random() * 1000)) % 26 + 97) : (((int) (Math.random() * 1000)) % 26 + 65));
   char c = (randNumber % 2 != 1) ? (char) randNumber : (randNumber % 10 + "").charAt(0);
   code.append(c);
   g.drawString(String.valueOf(c), x, 30);
   x += 20;
  }
  
  for (int n = 0; n < 10; n++) {
   g.setColor(new Color(((int) (Math.random() * 1000)) % 256, ((int) (Math.random() * 1000)) % 256, ((int) (Math.random() * 1000)) % 256));
   int startx = ((int) (Math.random() * 1000)) % 200;
   int starty = ((int) (Math.random() * 1000)) % 28;
   g.fillOval(startx, starty, 2, 2);
  }
  
  request.getSession().setAttribute("rand", code.toString());
  ImageIO.write(image, "jpg", response.getOutputStream());
  
  
 }
 /**
  * Initialization of the servlet. <br>
  *
  * @throws ServletException if an error occurs
  */
 public void init() throws ServletException {
  // Put your code here
 }
}
validate.jsp:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %> 
<% 
String rand = (String)session.getAttribute("rand"); 
String input = request.getParameter("rand"); 
if(rand.equals(input)){ 
out.print("<script>alert('验证通过!');</script>"); 
} else{ 
out.print("<script>alert('请输入正确的验证码!');location.href='login.jsp';</script>"); 

%> 

2:jsp方式:
index.jsp:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %> 
<%@ page language="java" import="java.sql.*" errorPage="" %> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
<title>用户登录</title> 
<script language="javascript"> 
function loadimage(){ 
document.getElementById("randImage").src = "image.jsp?"+Math.random(); 

</script> 
</head> 
<body> 
<form action="validate.jsp" method="post" name="loginForm"> 
<table width="256" border="0" cellpadding="0" cellspacing="0">

<tr> 
<td width="118" height="22" valign="middle" align="center"><input type="text" name="rand" size="15"></td> 
<td width="138" valign="middle" align="center"><img alt="code..." name="randImage" id="randImage" src="image.jsp" width="90" height="40" border="1" ></td> 
</tr> 
<tr> 
<td height="36" colspan="2" align="center" valign="middle"><a href="javascript:loadimage();"><font class=pt95>看不清点我</font></a></td> 
</tr> 
<tr> 
<td height="36" colspan="2" align="center" valign="middle"><input type="submit" name="login" value="提交"></td> 
</tr> 
</table> 
</form>
</body> 
</html>
image.jsp:

<%@ page language="java"  pageEncoding="GBK"%> 
<%@ page contentType="image/jpeg" import="java.awt.*, 
java.awt.image.*,java.util.*,javax.imageio.*" %> 
<%! 
Color getRandColor(int fc,int bc) 

Random random = new Random(); 
if(fc>255) fc=255; 
if(bc>255) bc=255; 
int r=fc+random.nextInt(bc-fc); 
int g=fc+random.nextInt(bc-fc); 
int b=fc+random.nextInt(bc-fc); 
return new Color(r,g,b); 

%>
<%
response.setHeader("Pragma","No-cache"); 
response.setHeader("Cache-Control","no-cache"); 
response.setDateHeader("Expires", 0); 
int width=60, height=20; 
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
Graphics g = image.getGraphics(); 
Random random = new Random();
g.fillRect(0, 0, width, height); //画一个矩形
g.setFont(new Font("Times New Roman",Font.PLAIN,18)); 
g.setColor(getRandColor(160,200)); 
for (int i=0;i<155;i++) 

int x = random.nextInt(width); 
int y = random.nextInt(height); 
int xl = random.nextInt(12); 
int yl = random.nextInt(12); 
g.drawLine(x,y,x+xl,y+yl); 

String sRand=""; 
for (int i=0;i<4;i++){ 
String rand=String.valueOf(random.nextInt(10)); 
sRand+=rand; 
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110))); 
g.drawString(rand,13*i+6,16); 

// 将认证码存入SESSION 
session.setAttribute("rand",sRand); 
g.dispose(); 
ImageIO.write(image, "JPEG", response.getOutputStream()); 
out.clear();
out=pageContext.pushBody(); 
%>
validate.jsp:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %> 
<% 
String rand = (String)session.getAttribute("rand"); 
String input = request.getParameter("rand"); 
if(rand.equals(input)){ 
out.print("<script>alert('验证通过!');</script>"); 
} else{ 
out.print("<script>alert('请输入正确的验证码!');location.href='login.jsp';</script>"); 

%> 
3:struts 方式:
index.jsp
<%@ page language="java" import="java.util.*"  pageEncoding="gbk"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
  <title>用户注册</title>
  <script type="text/javascript">
     function shuaxin(obj) {
        var shijian = new Date().getTime();
        obj.src="imageAction.action?d="+shijian;
     }
  </script>
 </head>
 <body>
  <h1 align="center">
   用户注册
  </h1>
  <div align="center">
   <s:fielderror cssStyle="color:red"></s:fielderror>
   <s:actionerror cssStyle="color:red"></s:actionerror>
   <br>
   <s:form action="register" theme="simple" method="post">
    <table width="50%" border="0" style="width: 501px; height: 342px;">
     <tr>
      <td align="right">
       账号:
      </td>
      <td width=20>
       <s:textfield name="username"></s:textfield>
      </td>
      <td>
       <font color="red" align="left">
        <h6>
         *必填
        </h6>
       </font>
      </td>
     </tr>
     <tr>
      <td align="right">
       密码:
      </td>
      <td>
       <s:password name="password"></s:password>
      </td>
      <td>
       <font color="red" align="left"><h6>
         *必填
        </h6>
       </font>
      </td>
     </tr>
 
     <tr>
      <td align="right">
       重复密码:
      </td>
      <td>
       <s:password name="repassword"></s:password>
      </td>
      <td>
       <font color="red" align="left"><h6>
         *必填
        </h6>
       </font>
      </td>
     </tr>
     <tr>
      <td align="right">
       性别:
      </td>
      <td>
       <input type="radio" name="sex" value="0" checked />
       男
       <input type="radio" name="sex" value="1" />
       女
      </td>
     </tr>
     <tr>
      <td align="right">
       电子邮箱:
      </td>
      <td>
       <s:textfield name="email"></s:textfield>
      </td>
      <td>
       <font color="red" align="left"><h6>
         *必填
        </h6>
       </font>
      </td>
     </tr>
     <tr>
      <td align="right">
       验证码:
      </td>
      <td>
       <s:textfield name="validate"></s:textfield>
      </td>
      <td>
       <img src="imageAction" align="left" alt="点击图片"
        onClick="shuaxin(this)" />
      </td>
     </tr>
     <tr>
      <td>
      </td>
      <td>
       <s:submit value="提交"></s:submit>
       <s:reset value="重置"></s:reset>
      </td>
     </tr>
    </table>
   </s:form>
  </div>
 </body>
</html>
struts.xml:
<action name="imageAction" class="action.ImageAction">
   <result type="stream">
    <param name="contentType">image/jpeg</param>
    <param name="inputName">inputStream</param>
   </result>
  </action> 
imageAction.java
package action;
import java.io.*;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import java.awt.*;
import java.awt.image.BufferedImage;
public class ImageAction extends ActionSupport {
 private static final long serialVersionUID = 1L;
 private ByteArrayInputStream inputStream;
 // 产生四个0~9的随机数,放在一个字符串里
 public String createRandomString() {
  String str = "";
  for (int i = 0; i < 4; i++) {
   str += Integer
     .toString((new Double(Math.random() * 10)).intValue());
  }
  return str;
 }
 // 随机产生一个颜色
 public Color createsRandomColor() {
  int r = (new Double(Math.random() * 256)).intValue();
  int g = (new Double(Math.random() * 256)).intValue();
  int b = (new Double(Math.random() * 256)).intValue();
  return new Color(r, g, b);
 }
 // 生成一个内存图片,将四个随机数写在图片上
 public BufferedImage createImage(String str) {
  int width = 60;
  int height = 22;
  BufferedImage image = new BufferedImage(width, height,
    BufferedImage.TYPE_INT_RGB);
  // 获取图形上下文
  Graphics g = image.getGraphics();
  // 设定背景色
  g.setColor(Color.WHITE);
  g.fillRect(0, 0, width, height);
  // 画边框
  g.setColor(Color.black);
  g.drawRect(0, 0, width - 1, height - 1);
  // 将认证码显示到图象中
  g.setFont(new Font("Atlantic Inline", Font.PLAIN, 18));
  // 使用随机颜色
  g.setColor(this.createsRandomColor());
  // 将随机字符串的每个数字分别写到图片上
  g.drawString(Character.toString(str.charAt(0)), 8, 17);
  g.drawString(Character.toString(str.charAt(1)), 20, 17);
  g.drawString(Character.toString(str.charAt(2)), 33, 17);
  g.drawString(Character.toString(str.charAt(3)), 45, 17);
  // 图象生效
  g.dispose();
  return image;
 }
 // 将图片的以字节形式写到InputStream里
 public ByteArrayInputStream createInputStream() throws Exception {
  // 获取随机字符串
  String str = this.createRandomString();
  BufferedImage image = this.createImage(str);
  // 将产生的字符串写入session,供校验时使用
  ActionContext actionContext = ActionContext.getContext();
  Map session = actionContext.getSession();
  session.put("random", str);
  ByteArrayOutputStream output = new ByteArrayOutputStream();
  ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);
  ImageIO.write(image, "JPEG", imageOut);
  imageOut.close();
  ByteArrayInputStream input = new ByteArrayInputStream(output
    .toByteArray());
  output.close();
  return input;
 }
 @Override
 public String execute() throws Exception {
  setInputStream(createInputStream());
  return SUCCESS;
 }
 public ByteArrayInputStream getInputStream() {
  return inputStream;
 }
 public void setInputStream(ByteArrayInputStream inputStream) {
  this.inputStream = inputStream;
 }
}
register.java
package action;
import java.util.Map;
import biz.Users;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import dao.DbService;

public class RegisterAction extends ActionSupport  
{
 private static final long serialVersionUID = 1L;
 private String username;
 private String password;
 private String  repassword;
 private String sex;
 private String email;
 private String validate;
 
 
 
 public String getValidate()
 {
  return validate;
 }
 public void setValidate(String validate)
 {
  this.validate = validate;
 }
 public String getRepassword()
 {
  return repassword;
 }
 public void setRepassword(String repassword)
 {
  this.repassword = repassword;
 }
 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 getSex()
 {
  return sex;
 }
 public void setSex(String sex)
 {
  this.sex = sex;
 }
 public String getEmail()
 {
  return email;
 }
 public void setEmail(String email)
 {
  this.email = email;
 }
 public String execute() throws Exception
 {
  int sex1=Integer.parseInt(sex);
  Users user = new Users();
  user.setUsername(username);
  user.setEmail(email);
  user.setPassword(password);
  user.setSex(sex1);
  DbService dbservice = new DbService();
  if(dbservice.hasSameName(username))
  {
   this.addFieldError(username, "用户名已存在");
   return INPUT;
  }
  else {
   dbservice.addUser(user);
  }
   return SUCCESS; 
 }
 @Override
 public void validate()
 {
   ActionContext actionContext = ActionContext.getContext();   
         
         Map session = actionContext.getSession();  
  if( !repassword.equals(password) )
  {
   this.addFieldError(repassword, "重复密码不一致");
  }
  if (!session.get("random").equals(validate))
  {
       this.addFieldError(validate, "验证码错误");
  }
  
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值