验证码图片生成及刷新方法2(JSP生成)

来源:互联网 发布:雅思背单词软件 编辑:程序博客网 时间:2024/05/17 10:07

 生成图片的类代码如下:

package com.lqh.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.servlet.http.HttpServletResponse;

import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class RandImageCreater {
 
 HttpServletResponse response ;
 public static final int WIDTH = 60;
 public static final int HEIGHT = 20;
 public static Random random = new Random();
 
 public RandImageCreater(HttpServletResponse response) {
  this.response = response;
 }
 
 public String createImage() {
 
  char[] codes = createCodes();
  
  try {
   BufferedImage bi = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
   Graphics g = bi.getGraphics();   
   drawBackground(g);   
   drawCodes(g, codes);   
   g.dispose();
   

//通过构造方法拿到JSP页面的Response对象,输出图片
   JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(response.getOutputStream());
   en.encode(bi);
   
   
   
  } catch (ImageFormatException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
  return new String(codes);
 }
 
private char[] createCodes() {
  
  String codeSet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  
  char[] codes = new char[4];
  for(int i=0; i<codes.length; i++) {
   codes[i] = codeSet.charAt(random.nextInt(62));
  }
  
  return codes;  
 }
 
 public void drawCodes(Graphics g, char[] codes) {
  Color c = g.getColor();
  g.setColor(Color.black);
  g.setFont(new Font(Font.DIALOG, Font.BOLD, 15));
  g.drawString("" + codes[0], 1, 17);
  g.drawString("" + codes[1], 16, 15);
  g.drawString("" + codes[2], 31, 18);
  g.drawString("" + codes[3], 46, 16);
  g.setColor(c);
//System.out.println(codes);
 }

 public void drawBackground(Graphics g) {
  Color cc = g.getColor();
  g.setColor(Color.red);
  g.fillRect(0, 0, WIDTH, HEIGHT);
  
  for(int i=0; i<100; i++) {
   int x = random.nextInt(WIDTH);
   int y = random.nextInt(HEIGHT);
   
   int r = random.nextInt(255);
   int gg = random.nextInt(255);
   int b = random.nextInt(255);
   
   Color c = new Color(r, gg, b);
   g.setColor(c);
   g.fillOval(x, y, 5, 5);
  }
  
  g.setColor(cc);
 }
}

 

生成图片的Jsp页面代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ page import="com.lqh.util.*, java.io.*"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<%
  response.setHeader("pragma","No-cache");
  response.setHeader("Cache-Control", "No-store");
  response.setHeader("Expires","0");
  
  
  RandImageCreater rc = new RandImageCreater(response); 
  String rand = rc.createImage();    
  session.setAttribute("rand",rand);  
  
 %>
 
 <%
out.clear();
out = pageContext.pushBody();

//不能省略,否则会提示getOutputStream() has already been called for this response 错误。原因是JSP默认的输出流为PrintWriter ,即<% %>以外的东西所默认的输出方式,如果你尝试在JSP中使用ServletOutputStream就会引起错误
%>

 

登陆的页面代码如下:

<script type="text/javascript">
  function change() {
   
   document.getElementById("code").src = "image.jsp?t=" + Math.random();

                   //同样,后面的随机数不能省略
  }
 </script>
 
  </head>
 
  <body>
   <center>
    <h2>管理员登陆</h2>
    <br />
    <br />
    输入用户名: <input type="text" name="username" />
    <br />
    <br />
    输入密码: <input type="password" name="password"/>
    <br />
    <br />
    验证码:
      <a href="javascript:change()">
    <img id="code" alt="看不清楚换一个" src="image.jsp" /> </a>
    
   </center>
  </body>

原创粉丝点击