简易代码之家

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  157 Posts :: 2 Stories :: 57 Comments :: 0 Trackbacks
validateCode.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>两组验证码</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">
  
</head>
  
  
<body>
    Two Validate Code: 
<br>
    
<img src="vc_1.jsp" />
    
<img src="vc_2.jsp" />
  
</body>
</html>

vc_1.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="com.ysx.system.actions.*"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    
<head>
        
<title>验证码测试</title>
    
</head>

    
<body>
        
<form name="f1" method="post" action="login.jsp">
            
<div>
                
<%
                    Yzm a 
= new Yzm();
                    a.service(request, response);
                    out.clear();
                    out 
= pageContext.pushBody();
                
%>
            
</div>
        
</form>
    
</body>
</html>
vc_2.jsp:
<%@ page
    import
="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%>
<%@ page import="java.io.OutputStream"%>
<%!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);
    }
%>
<%
    try {
        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);
        OutputStream os 
= response.getOutputStream();
        Graphics g 
= image.getGraphics();
        Random random 
= new Random();
        g.setColor(getRandColor(
200250));
        g.fillRect(
00, width, height);

        g.setFont(
new Font("Times New Roman", Font.PLAIN, 18));
        g.setColor(getRandColor(
160200));
        
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 + 616);
        }
        session.setAttribute(
"rand", sRand);
        g.dispose();

        ImageIO.write(image, 
"JPEG", os);
        os.flush();
        os.close();
        os 
= null;
        response.flushBuffer();
        out.clear();
        out 
= pageContext.pushBody();
    } catch (IllegalStateException e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    }
%>

Yzm.java:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;

import javax.servlet.*;
import javax.servlet.http.*;

public class Yzm extends HttpServlet {
    
    
public static final long serialVersionUID = 1L;
    
    
// 验证码图片的宽度。
    private int width = 60;
    
// 验证码图片的高度。
    private int height = 20;

    
protected void service(HttpServletRequest req, HttpServletResponse resp)
            
throws ServletException, java.io.IOException {
        BufferedImage buffImg 
= new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g 
= buffImg.createGraphics();

        
// 创建一个随机数生成器类。
        Random random = new Random();
        g.setColor(Color.WHITE);
        g.fillRect(
00, width, height);

        
// 创建字体,字体的大小应该根据图片的高度来定。
        Font font = new Font("Times New Roman", Font.PLAIN, 18);
        
// 设置字体。
        g.setFont(font);

        
// 画边框。
        g.setColor(Color.BLACK);
        g.drawRect(
00, width - 1, height - 1);

        
// 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。
        g.setColor(Color.GRAY);
        
for (int i = 0; i < 10; 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);
        }


        
// randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
        StringBuffer randomCode = new StringBuffer();
        
int red = 0, green = 0, blue = 0;

        
// 随机产生4位数字的验证码。
        for (int i = 0; i < 4; i++{
            
// 得到随机产生的验证码数字。
            String strRand = String.valueOf(random.nextInt(10));

            
// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
            red = random.nextInt(200);
            green 
= random.nextInt(200);
            blue 
= random.nextInt(200);

            
// 产生随机高度 13至height之间
            float imght = 0;
            
while (imght <= 12{
                imght 
= Float
                        .parseFloat(String.valueOf(random.nextInt(height)));
            }

            
// 用随机产生的颜色将验证码绘制到图像中。
            g.setColor(new Color(red, green, blue));
            g.drawString(strRand, 
13 * i + 6, imght);

            
// 将产生的四个随机数组合在一起。
            randomCode.append(strRand);
        }

        
// 将四位数字的验证码保存到Session中。
        HttpSession session = req.getSession();
        session.setAttribute(
"randomCode", randomCode.toString());

        
// 禁止图像缓存。
        resp.setHeader("Pragma""no-cache");
        resp.setHeader(
"Cache-Control""no-cache");
        resp.setDateHeader(
"Expires"0);

        resp.setContentType(
"image/jpeg");

        
// 将图像输出到Servlet输出流中。
        ServletOutputStream sos = resp.getOutputStream();
        ImageIO.write(buffImg, 
"jpeg", sos);
        sos.close();
    }

}
posted on 2009-09-22 19:45 Jakin.zhou 阅读(183) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: