Kodenya terlihat seperti ini:
impor java.awt.Color;
impor java.awt.Font;
impor java.awt.Grafik;
impor java.awt.image.BufferedImage;
import java.util.Acak;
impor javax.imageio.ImageIO;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
/**
* <b>fungsi:</b> Kelas alat pembuatan kode verifikasi
* @projectNetWorkService
* @paket com.hoo.util
* @fileName ValidCodeUtils.java
* @createDate 3-8-2010 15:05:50
*@penulishoojo
*/
@SuppressWarnings("tidak digunakan")
kelas publik ValidCodeUtils {
/****************************************************** ***** *********************
* Lebar kode verifikasi
*/
public static int LEBAR = 60;
/***
* Tinggi kode verifikasi
*/
public static int TINGGI = 20;
/****************************************************** ***** *********************
* Warna latar belakang kode verifikasi COLOR_FC_BG harus lebih kecil dari COLOR_BC_BG
*/
int statis publik COLOR_FC_BG = 200;
/***
* Warna latar belakang kode verifikasi COLOR_FC_BG harus lebih kecil dari COLOR_BC_BG
*/
int statis publik COLOR_BC_BG = 250;
/****************************************************** ***** *********************
* Warna garis gangguan latar belakang kode verifikasi COLOR_FC_LINE harus lebih kecil dari COLOR_BC_LINE
*/
int statis publik COLOR_FC_LINE = 160;
/***
* Warna garis gangguan latar belakang kode verifikasi COLOR_FC_LINE harus lebih kecil dari COLOR_BC_LINE
*/
int statis publik COLOR_BC_LINE = 200;
/****************************************************** ***** ****************************
* Warna kode verifikasi COLOR_FC_CODE harus lebih kecil dari COLOR_BC_CODE
*/
int statis publik COLOR_FC_CODE = 20;
/***
* Warna kode verifikasi COLOR_FC_CODE harus lebih kecil dari COLOR_BC_CODE
*/
int statis publik COLOR_BC_CODE = 170;
/****************************************************** ***** ****************************
* Hasilkan warna dalam rentang yang ditentukan
* Nilai warna fc rentang @param fc kurang dari 255
* @param bc rentang bc nilai warna kurang dari 255
* @returnColor
*/
warna statis pribadi getRandColor(int fc, int bc) {
Acak acak = baru Acak();
jika (fc < 0)
fc = 0;
jika (bc < 0)
sm = 1;
jika (fc > 255)
fc = 255;
jika (bc > 255)
SM = 255;
jika (bc == fc)
SM += 10;
int suhu = 0;
jika (bc < fc) {
suhu = bc;
bc = fc;
fc = suhu;
}
int r = fc + acak.nextInt(bc - fc);
int g = fc + acak.nextInt(bc - fc);
int b = fc + acak.nextInt(bc - fc);
kembalikan Warna baru (r, g, b);
}
/**
* <b>fungsi:</b> Menghasilkan metode gambar
* @createDate 3-8-2010 15:06:22
*@penulishoojo
* @param meminta HttpServletRequest
* @param respons HttpServletResponse
* @kembalikan boolean
* @throwsException
*/
getImage boolean statis publik (permintaan HttpServletRequest, respons HttpServletResponse) memunculkan Pengecualian{
respon.reset();
respon.setContentType("gambar/jpeg");
//Atur halaman agar tidak di-cache
respon.setHeader("Pragma", "Tanpa cache");
respon.setHeader("Kontrol Cache", "tanpa cache");
respon.setDateHeader("Kedaluwarsa", 0);
//Buat gambar di memori
Gambar BufferedImage = BufferedImage baru(LEBAR, TINGGI, BufferedImage.TYPE_INT_RGB);
// Dapatkan konteks grafis
Grafik img = gambar.getGraphics();
// Hasilkan kelas acak
Acak acak = baru Acak();
//Mengatur warna latar belakang
img.setColor(getRandColor(COLOR_FC_BG, COLOR_BC_BG));
img.fillRect(0, 0, LEBAR, TINGGI);
//Setel font
img.setFont(Font baru("Times New Roman", Font.PLAIN, 18));
// menggambar batas
// g.setColor(Warna baru());
// g.drawRect(0,0,lebar-1,tinggi-1);
// Secara acak menghasilkan 155 garis interferensi untuk membuat kode otentikasi pada gambar sulit dideteksi oleh program lain
img.setColor(getRandColor(COLOR_FC_LINE, COLOR_BC_LINE));
untuk (int saya = 0; saya < 155; saya++) {
int x = acak.nextInt(LEBAR);
int y = acak.nextInt(TINGGI);
int xl = acak.nextInt(12);
int yl = acak.nextInt(12);
img.drawLine(x, y, x + xl, y + yl);
}
// Dapatkan kode autentikasi yang dibuat secara acak (4 digit)
String kodeNilai = "";
untuk (int saya = 0; saya < 4; saya++) {
//String rand = String.valueOf(random.nextInt(10));
String rand = getRandomChar();
codeValue = codeValue.concat(rand);
img.setFont(getRandomFont());//Font acak
//Menampilkan kode otentikasi ke dalam gambar
img.setColor(getRandColor(COLOR_FC_CODE, COLOR_BC_CODE));
img.drawString(rand, 13 * i + 6, 16);
}
request.getSession().setAttribute("codeValue", codeValue);
//gambar mulai berlaku
img.buang();
// Keluarkan gambar ke halaman
return ImageIO.write(gambar, "JPEG", respon.getOutputStream());
}
/**
* Menghasilkan karakter secara acak, termasuk huruf besar, huruf kecil, dan angka
* <b>fungsi:</b> fungsi
* @createDate 23-8-2010 10:33:55
*@penulishoojo
* @kembali
*/
String statis publik getRandomChar() {
int indeks = (int) Matematika.bulat(Matematika.acak() * 2);
StringrandChar = "";
beralih (indeks) {
huruf 0://karakter huruf besar
randChar = String.valueOf((char)Math.round(Math.random() * 25 + 65));
merusak;
kasus 1://karakter huruf kecil
randChar = String.valueOf((char)Math.round(Math.random() * 25 + 97));
merusak;
default://nomor
randChar = String.valueOf(Math.round(Math.random() * 9));
merusak;
}
kembalikan RandChar;
}
/**
* <b>fungsi:</b> Menghasilkan font dan ukuran teks secara acak
* @createDate 23-8-2010 10:44:22
*@penulishoojo
* @kembali
*/
font statis publik getRandomFont() {
String[] font = {"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(Matematika.random() * 4 + 16);
kembalikan Font baru(font[fontIndex], Font.PLAIN, fontSize);
}
}
Nilai kode verifikasi disimpan dalam sesi: request.getSession().setAttribute("codeValue", codeValue);
Bandingkan saja nilai yang dimasukkan oleh pengguna dan codeValue dalam sesi untuk melihat apakah keduanya sama;
Berikut ini adalah halaman jsp yang memanggil servlet: ValidCodeServlet.java
Kelas alat pembuatan kode verifikasi ValidCodeUtils di atas disebut di ValidCodeServlet
paket com.hoo.servlet;
impor java.io.IOException;
impor javax.servlet.ServletException;
impor javax.servlet.http.HttpServlet;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
impor com.hoo.util.ValidCodeUtils;
@SuppressWarnings("serial")
kelas publik ValidCodeServlet memperluas HttpServlet {
public void doGet (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
mencoba {
ValidCodeUtils.getImage(permintaan, tanggapan);
} tangkapan (Pengecualian e) {
e.printStackTrace();
}
}
public void doPost (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
doGet(permintaan, tanggapan);
}
}
Panggil saja metode servlet di halaman jsp
js: metode reloadValidCode
fungsi memuat ulangValidCode(o) {
o.src = "${pageContext.request.contextPath }/validCodeServlet?timed=" + Tanggal baru().getMilliseconds();
}
"timed=" + new Date().getMilliseconds(); di sini diperlukan untuk mencegah cache IE.
tanda html:
<img src="${pageContext.request.contextPath }/validCodeServlet" onclick="reloadValidCode(ini)"/>
Cukup konfigurasikan URL secara langsung dengan nama Servlet, yang sesuai dengan konfigurasi web.xml. Jalur pemanggilan utama ${pageContext.request.contextPath}/validCodeServlet akan membawa direktori root, yang lebih aman.
konfigurasi validCodeServlet di web.xml
<servlet>
<nama-servlet>validCodeServlet</nama-servlet>
<servlet-class>com.hoo.servlet.ValidCodeServlet</servlet-class>
</servlet>
<pemetaan-servlet>
<nama-servlet>validCodeServlet</nama-servlet>
<url-pattern>/validCodeServlet</url-pattern>
</pemetaan-servlet>