整容说文库 > 程序代码 > 教育资讯

如何实现验证码图片的验证

来源:学生作业帮助网 编辑:整容说文库 时间:2020/08/09 22:22:59 程序代码
如何实现验证码图片的验证程序代码
四位验证图片已经写成了,如何在Action中进行验证
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;

import com.sunyang.po.Pair;

/**
 * 生成四位验证码图片
 * 
 */
public class ImageOut {
private static final int WIDTH = 62;   
    private static final int HEIGHT = 20; 
    private static Color getRandomColor() {   
        Random random = new Random();   
        return new Color(50 + random.nextInt(100), 50 + random.nextInt(100),   
                50 + random.nextInt(100));   
    }   
  
    private static int getRandomBgInt() {   
        Random random = new Random();   
        return 180 + random.nextInt(60);   
    }   
  
    private static Font getRandomFont() {   
        Random random = new Random();   
        return new Font("Times New Roman", Font.PLAIN, 10 + random.nextInt(8));   
    }   
  
    public static char getRandomChar() {   
        Random random = new Random();   
        if (random.nextInt(5) < 3) {   
            return (char) (65 + random.nextInt(26));   
        }   
        return (char) (97 + random.nextInt(26));   
  
    }   
  
    public static Pair<String, BufferedImage> getImage() {   
  
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT,   
                BufferedImage.TYPE_INT_RGB);   
        Graphics2D g = image.createGraphics();   
        g.setColor(new Color(255, getRandomBgInt(), 255));   
        g.fillRect(0, 0, WIDTH, HEIGHT);   
        StringBuilder s = new StringBuilder();   
        for (int i = 0; i < 4; i++) {   
            String t = String.valueOf(getRandomChar());   
            s.append(t);   
            g.setColor(getRandomColor());   
            g.setFont(getRandomFont());   
            g.drawString(t, 3 + 16 * i, 18);   
        }   
        g.dispose();   
        return new Pair<String, BufferedImage>(s.toString(), image);   
    }   

}
在线等
Pair.java
public class Pair<K, E> {
private K key;   
private E value;   
  
public Pair() {   
}   
public Pair(K key, E value) {   
    this.key = key;   
    this.value = value;   
}
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public E getValue() {
return value;
}
public void setValue(E value) {
this.value = value;
}   
你的四位验证码图片肯定是基于一个随机的四位数生成的,你可以把这个随机的四位数放到一个隐藏域中,传递到action中,把这个四位数跟用户输入的验证码进行比较,相同的话就是验证成功了。
ValidateImage.jsp
<%@ page language="java" pageEncoding="utf-8"%>
<%@page import="java.awt.image.BufferedImage,javax.imageio.ImageIO" %>   
<%@page import="com.sunyang.po.Pair,com.sunyang.util.ImageOut" %> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%   
            response.setContentType("image/jpeg");   
            response.setHeader("Pragma", "No-cache");   
            response.setHeader("Cache-Control", "no-cache");   
            response.setDateHeader("Expires", 0);   
            Pair<String, BufferedImage> p = ImageOut.getImage();   
            ImageIO.write(p.getValue(), "JPEG", response.getOutputStream());   
            session.setAttribute("valid", p.getKey());   
%> 
具体代码写个看看……我是个初学者
主要这个是图片,怎么把这个传入action中
在action中调用这个方法比如:
HttpSession session = request.getSession();
session.setAttribute("imagevalid", sRand);
g.dispose();
ImageIO.write(image, "JPEG", response.getOutputStream());

你是先有了字符串然后在画图的,所以你先保存字符
mark
1, 生成随机数, 存在session中;
2, 根据这个随机数, 在页面中生成验证码图片;
3, 用户看到图片, 输入验证码;
4, 取出session中保存的数字, 与用户的输入值相比较.

够清楚了吧?
刚看到别人的帖子:http://www.blogjava.net/hufoking/archive/2009/11/27/java_verifycode.html
你要传的不是图片,传的是图片里面的内容,
9楼把流程说的很清楚了
引用 6 楼 cenfan327 的回复:
主要这个是图片,怎么把这个传入action中
这是我登陆的Action,你们看该怎么加进去
public ActionForward userLogin(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
UserForm userForm = (UserForm) form;
String username = userForm.getUsername();//取得用户名
String password = userForm.getPassword();//取得密码
List list = userFacade.findByUsername(username);
User user = new User();
if (list.size() == 0) {
return mapping.findForward("error");
}
List list2 = userFacade.findByPassword(password);
request.setAttribute("pswerror", "密码输入不正确");
if (list2.size() == 0) {
return mapping.findForward("error");
}

user.setUsername(username);
user.setPassword(password);
HttpSession session = request.getSession(true);
session.setAttribute("user", user);// 追踪会话
return mapping.findForward("succ");
}
顶起
希望好心人给个答案……
生成登陆页面时:


String s = 得到随机数;
session.setAttribute("validNum", s);
//根据随机数生成图片, 显示, 略




登陆后:
在验证完用户名密码之后加入:



String str = session.getAttribute("validNum");
String s = request.getParameter("validNum");
if(s!=null && s.equals(str)){
    //验证验正确.
}



非给出代码你才会吗?
听别人说的流程就不会了?
JAVA高级技术讨论群 96844306
我写的一个简单的例子,你可以参考下
	public ActionForward login(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws IOException {

ActionMessages msgs = new ActionMessages();
ActionForward forward = new ActionForward();
LoginForm loginForm = (LoginForm) form;
boolean imageFlag = false;

try {

String username = request.getParameter("username");
String password = request.getParameter("password");

HttpSession session = request.getSession();

String sRand = (String) session.getAttribute("imagevalid");
                        //这是系统产生的验证码
String inputRand = request.getParameter("imageRand");
                        //这是用户输入的验证码
imageFlag = sRand.equalsIgnoreCase(inputRand);
boolean isValid = valid(loginForm);

if (isValid && imageFlag) {
session.setAttribute(Constant.USERNAME_KEY, username);
session.setAttribute(Constant.PASSWORD_KEY, password);
} else {
msgs.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
"login.message.failed"));
}

} catch (Exception e) {
msgs.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
"login.message.failed"));
e.printStackTrace();
}

if (msgs.isEmpty() && imageFlag) {
forward = mapping.findForward(Constant.SUCCESS_KEY);
} else {
saveErrors(request, msgs);
forward = mapping.findForward(Constant.FAILURE_KEY);
}
return forward;

}


页面的代码,我用的是servlet,其实你也可以吧代码写入action,没什么区别

function refresh(){
document.getElementById("imageValid").src="imageValid?now="+new Date();
}
<tr>
<td>
验证码
</td>
<td>
<input type="text" name="imageRand" size="10" class="text1" />
</td>
</tr>
<tr>
<td>
<img src="imageValid" id="imageValid" />
</td>
<td>
看不清?
<a href="#" onclick="refresh();">单击此处刷新</a>
</td>
</tr>



这个产生的验证码也就是你生成的随即数字串吧,你先放入这个字符串到session
引用 9 楼 liuyar 的回复:
1, 生成随机数, 存在session中;
2, 根据这个随机数, 在页面中生成验证码图片;
3, 用户看到图片, 输入验证码;
4, 取出session中保存的数字, 与用户的输入值相比较.

够清楚了吧?


就这样
呵呵……这不就是新手……这个代码我知道这么写,但是加到Action里是会有错误
我知道写到Servlet中可以实现……
<%@ page contentType="image/jpeg" %>
<%@ page import="java.awt.*, java.awt.image.*" %>
<%@ page import="java.util.*, javax.imageio.*" %>

<%!
//产生随机颜色函数getRandColor
Color getRandColor(int fc, int bc)
{
Random r=new Random();
if(fc>255) fc=255;
if(bc>255) bc=255;
int red=fc+r.nextInt(bc-fc);
int green=fc+r.nextInt(bc-fc);
int blue=fc+r.nextInt(bc-fc);
return new Color(red,green,blue);
}
%>

<%
//设置页面不缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);

//创建随机类
Random r=new Random();

//创建图像
int width=60, height=20;
BufferedImage pic=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

Graphics gc=pic.getGraphics();

gc.setColor(getRandColor(200,250));
gc.fillRect(0, 0, width, height);

gc.setFont(new Font("Times New Roman", Font.PLAIN, 18));

gc.setColor(getRandColor(160,200));
for(int i=0;i<200;i++)
{
int x1=r.nextInt(width);
int y1=r.nextInt(height);
int x2=r.nextInt(15);
int y2=r.nextInt(15);
gc.drawLine(x1, y1, x1+x2, y1+y2);
}

gc.setColor(getRandColor(120,240));
for(int i=0;i<200;i++)
{
int x=r.nextInt(width);
int y=r.nextInt(height);
gc.drawOval(x, y, 0, 0);
}

String RS="";
String rn="";
for(int i=0;i<4;i++)
{
rn=String.valueOf(r.nextInt(10));
RS+=rn;
gc.setColor(new Color(20+r.nextInt(110),20+r.nextInt(110),20+r.nextInt(110)));
gc.drawString(rn, 13*i+6,16);
}

//释放图形上下文环境
gc.dispose();

//将认证码RS存入session中共享
request.getSession().setAttribute("VERIFY_CODE",RS);

//输出生成后的验证码图像到页面
ImageIO.write(pic, "JPEG", response.getOutputStream());
out.clear();
out = pageContext.pushBody();
%>

这个是生成验证码的必存在session里面的

/* String verifycode = request.getParameter("lograndom");

//验证码判断
String vc = (String)session.getAttribute("VERIFY_CODE");
if(verifycode==null || !vc.equals(verifycode.trim())){
request.setAttribute("message", "验证码错误");
     rd = request.getRequestDispatcher("/member/login.jsp");
     rd.forward(request, response);
     return;
servlet中验证的!!
希望对你有帮助!

谢谢……很感谢……也感谢这么多好心人……
分太少了……都不知道怎么给了……平分了
帮顶
程序代码