El código se ve así:
importar java.awt.Color;
importar java.awt.Font;
importar java.awt.Graphics;
importar java.awt.image.BufferedImage;
importar java.util.Random;
importar javax.imageio.ImageIO;
importar javax.servlet.http.HttpServletRequest;
importar javax.servlet.http.HttpServletResponse;
/**
* <b>función:</b> clase de herramienta de generación de código de verificación
* @projectNetWorkService
* @paquete com.hoo.util
* @fileName ValidCodeUtils.java
* @createDate 2010-8-3 15:05:50
*@autorhoojo
*/
@SuppressWarnings("no utilizado")
clase pública ValidCodeUtils {
/*************************************************** ***** **********************
* Ancho del código de verificación
*/
público estático int ANCHO = 60;
/***
* Altura del código de verificación
*/
público estático int ALTURA = 20;
/*************************************************** ***** **********************
* El color de fondo del código de verificación COLOR_FC_BG debe ser menor que COLOR_BC_BG
*/
int estático público COLOR_FC_BG = 200;
/***
* El color de fondo del código de verificación COLOR_FC_BG debe ser menor que COLOR_BC_BG
*/
público estático int COLOR_BC_BG = 250;
/*************************************************** ***** **********************
* El color de la línea de interferencia de fondo del código de verificación COLOR_FC_LINE debe ser más pequeño que COLOR_BC_LINE
*/
público estático int COLOR_FC_LINE = 160;
/***
* El color de la línea de interferencia de fondo del código de verificación COLOR_FC_LINE debe ser más pequeño que COLOR_BC_LINE
*/
público estático int COLOR_BC_LINE = 200;
/*************************************************** ***** ****************************
* El color del código de verificación COLOR_FC_CODE debe ser menor que COLOR_BC_CODE
*/
público estático int COLOR_FC_CODE = 20;
/***
* El color del código de verificación COLOR_FC_CODE debe ser menor que COLOR_BC_CODE
*/
público estático int COLOR_BC_CODE = 170;
/*************************************************** ***** ****************************
* Generar colores dentro del rango especificado.
* @param fc rango el valor de color fc es inferior a 255
* @param bc range bc el valor del color es inferior a 255
* @returnColor
*/
Color estático privado getRandColor(int fc, int bc) {
Aleatorio aleatorio = nuevo Aleatorio();
si (fc<0)
fc = 0;
si (bc < 0)
antes de Cristo = 1;
si (fc > 255)
fc = 255;
si (bc > 255)
antes de Cristo = 255;
si (bc == fc)
antes de Cristo += 10;
temperatura interna = 0;
si (bc < fc) {
temperatura = antes de Cristo;
antes de Cristo = fc;
fc = temperatura;
}
int r = fc + aleatorio.nextInt(bc - fc);
int g = fc + aleatorio.nextInt(bc - fc);
int b = fc + aleatorio.nextInt(bc - fc);
devolver nuevo color (r, g, b);
}
/**
* <b>función:</b> Generar método de imagen
* @createDate 2010-8-3 15:06:22
*@autorhoojo
* @param solicitud HttpServletRequest
* @param respuesta HttpServletResponse
* @return booleano
* @throwsException
*/
getImage booleano estático público (solicitud HttpServletRequest, respuesta HttpServletResponse) arroja una excepción {
respuesta.reset();
respuesta.setContentType("imagen/jpeg");
//Configura la página para que no se almacene en caché
respuesta.setHeader("Pragma", "Sin caché");
respuesta.setHeader("Control de caché", "sin caché");
respuesta.setDateHeader("Expira", 0);
//Crear imagen en memoria
Imagen BufferedImage = nueva Imagen Buffered (ANCHO, ALTO, Imagen Buffered.TYPE_INT_RGB);
// Obtener contexto de gráficos
Gráficos img = image.getGraphics();
// Generar clase aleatoria
Aleatorio aleatorio = nuevo Aleatorio();
//Establecer color de fondo
img.setColor(getRandColor(COLOR_FC_BG, COLOR_BC_BG));
img.fillRect(0, 0, ANCHO, ALTO);
//Establecer fuente
img.setFont(nueva fuente("Times New Roman", Fuente.PLAIN, 18));
// dibujar fronteras
// g.setColor(nuevo Color());
// g.drawRect(0,0,ancho-1,alto-1);
// Genera aleatoriamente 155 líneas de interferencia para que otros programas dificulten la detección del código de autenticación en la imagen.
img.setColor(getRandColor(COLOR_FC_LINE, COLOR_BC_LINE));
para (int i = 0; i < 155; i++) {
int x = aleatorio.nextInt(ANCHO);
int y = aleatorio.nextInt(ALTURA);
int xl = aleatorio.nextInt(12);
int yl = aleatorio.nextInt(12);
img.drawLine(x, y, x + xl, y + yl);
}
// Obtener el código de autenticación generado aleatoriamente (4 dígitos)
Cadena codeValue = "";
para (int i = 0; i < 4; i++) {
//String rand = String.valueOf(random.nextInt(10));
Cadena rand = getRandomChar();
codeValue = codeValue.concat(rand);
img.setFont(getRandomFont());//Fuente aleatoria
//Muestra el código de autenticación en la imagen
img.setColor(getRandColor(COLOR_FC_CODE, COLOR_BC_CODE));
img.drawString(rand, 13 * i + 6, 16);
}
request.getSession().setAttribute("codeValue", codeValue);
//la imagen tiene efecto
img.dispose();
// Enviar la imagen a la página
return ImageIO.write(imagen, "JPEG", respuesta.getOutputStream());
}
/**
* Generar caracteres aleatoriamente, incluidas mayúsculas, minúsculas y números.
* <b>función:</b> función
* @createDate 2010-8-23 10:33:55 a. m.
*@autorhoojo
* @devolver
*/
cadena estática pública getRandomChar() {
int índice = (int) Math.round(Math.random() * 2);
Cadena randChar = "";
cambiar (índice) {
caso 0://caracteres en mayúscula
randChar = String.valueOf((char)Math.round(Math.random() * 25 + 65));
romper;
caso 1://caracteres en minúscula
randChar = String.valueOf((char)Math.round(Math.random() * 25 + 97));
romper;
predeterminado://número
randChar = String.valueOf(Math.round(Math.random() * 9));
romper;
}
devolver randChar;
}
/**
* <b>función:</b> generar fuentes y tamaños de texto aleatoriamente
* @createDate 2010-8-23 10:44:22 a. m.
*@autorhoojo
* @devolver
*/
Fuente estática pública getRandomFont() {
String[] fonts = {"Georgia", "Verdana", "Arial", "Tahoma", "Time News Roman", "Courier New", "Arial Black", "Quantzite"};
int fontIndex = (int)Math.round(Math.random() * (fonts.length - 1));
int fontSize = (int) Math.round(Math.random() * 4 + 16);
devolver nueva fuente (fuentes [fontIndex], Font.PLAIN, fontSize);
}
}
El valor del código de verificación se almacena en la sesión: request.getSession().setAttribute("codeValue", codeValue);
Simplemente compare el valor ingresado por el usuario y el codeValue en la sesión para ver si son iguales;
La siguiente es la página jsp que llama al servlet: ValidCodeServlet.java
La clase de herramienta de generación de código de verificación ValidCodeUtils anterior se llama en ValidCodeServlet
paquete com.hoo.servlet;
importar java.io.IOException;
importar javax.servlet.ServletException;
importar javax.servlet.http.HttpServlet;
importar javax.servlet.http.HttpServletRequest;
importar javax.servlet.http.HttpServletResponse;
importar com.hoo.util.ValidCodeUtils;
@SuppressWarnings("serie")
la clase pública ValidCodeServlet extiende HttpServlet {
public void doGet (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
intentar {
ValidCodeUtils.getImage(solicitud, respuesta);
} captura (Excepción e) {
e.printStackTrace();
}
}
public void doPost (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
doGet(solicitud, respuesta);
}
}
Simplemente llame al método servlet en la página jsp
js: método recargaValidCode
función recargarCódigoValido(o) {
o.src = "${pageContext.request.contextPath }/validCodeServlet?timed=" + nueva Fecha().getMillisegundos();
}
El "timed=" + new Date().getMillisegundos(); aquí es necesario para evitar el almacenamiento en caché de IE.
etiqueta html:
<img src="${pageContext.request.contextPath }/validCodeServlet" onclick="reloadValidCode(this)"/>
Simplemente configure la URL directamente con el nombre del servlet, que corresponde a la configuración web.xml. La ruta de llamada principal ${pageContext.request.contextPath}/validCodeServlet traerá el directorio raíz, que es más seguro.
Configuración validCodeServlet en web.xml
<servlet>
<nombre-servlet>códigoválidoServlet</nombre-servlet>
<servlet-clase>com.hoo.servlet.ValidCodeServlet</servlet-clase>
</servlet>
<mapeo-servlet>
<nombre-servlet>códigoválidoServlet</nombre-servlet>
<url-pattern>/validCodeServlet</url-pattern>
</servlet-mapping>