Kode Verifikasi Langkah -langkah Pembuatan Gambar
Buat objek BufferedImage.
Dapatkan kuas dari bufferedImage, yaitu, panggil metode getGraphics () untuk mendapatkan objek grafis.
Panggil metode setColor () dan metode fillrect () dari objek grafis untuk mengatur warna latar belakang gambar.
Panggil metode setColor () dan metode drawline () dari objek grafis untuk mengatur garis interferensi gambar.
Panggil metode setRGB () dari objek buferedImaged untuk mengatur kebisingan gambar.
Panggil metode setColor (), metode setFont () dan metode drawstring () dari objek grafis untuk mengatur kode verifikasi gambar.
Karena lebar dan tinggi gambar kode verifikasi harus ditentukan sesuai dengan gaya situs web, ukuran font perlu ditentukan sesuai dengan lebar dan tinggi gambar, dan keterampilan kecil digunakan.
Paket util; impor java.awt.color; impor java.awt.font; impor java.awt.graphics; impor java.awt.image; impor java.awt.image.bufferedImage; impor java.io.bytearrayoutputstream; impor java.io.io eexception; javax.imageio.imageio; verifikasi kelas publik {string final statis privat alphabet = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz1234567890"; /** * Generate an image with width as width, height as height, and verification code as code* @param width The width of the image* @param height The height of the image* @param code Verification code string* @return Return image verification code*/ public static BufferedImage getImage(int width, int height, String code){ return getImage(width, height, code, 20); } /** * Menghasilkan lebar sebagai lebar, tinggi sebagai tinggi, kode verifikasi adalah kode, jumlah garis interferensi dalam gambar adalah linecnt * @param lebar lebar gambar * @param ketinggian, tinggi gambar * @param verification string * @param linion. Public Static BufferedImage getImage (int lebar, tinggi int, kode string, int linecnt) {return createImage (lebar, tinggi, kode, linecnt, 0,01); } /*** Hasilkan gambar dengan lebar, tinggi, tinggi, dan kode verifikasi adalah kode, jumlah garis interferensi dalam gambar adalah linecnt* rasio noise berisik, Secara tepat sesuai dengan hasil* @param noiserate persentase piksel noise pada gambar ke piksel total* @return mengembalikan kode verifikasi gambar*/ public static bufferedImage getImage (int width, int tinggi, kode string, int linecnt, double noiserate) {return createImage (lebar, tinggi, kode, linecnt, noiserate) {return createMage (lebar, tinggi, kode, lineCnt, noiserate) {return createMage (lebar, tinggi, kode, lineCnt, noiserate) {return createMage (lebar, tinggi, kode, lineCnt, noiserate) {return createMage (lebar, tinggi, kode, linecnt, noiserate) } /** * * menghasilkan gambar dengan lebar, tinggi, dan kode verifikasi. Jumlah garis interferensi dalam gambar adalah linecnt* Rasio noise berisik, yaitu persentase piksel noise pada gambar* @param lebar lebar gambar* @param tinggi tinggi gambar* @param kode verifikasi yang disesuaikan dengan noise. untuk total piksel* @return mengembalikan kode verifikasi gambar* / private static bufferedImage createImage (lebar int, tinggi int, kode string, int linecnt, double noiserate) {int fontwidth = ((int) (lebar* 0.8)) / code.length (); int fontheight = (int) (tinggi * 0.7); // Untuk menghasilkan kode verifikasi yang baik di bawah lebar dan tinggi, // ukuran fontwdith lebih kecil di fontheight, int fontsize = math.min (fontwidth, fontheight); // int paddingx = (int) (lebar * 0.1); int paddingy = tinggi - (tinggi - fontsize) / 2; // Buat gambar bufferedImage buffimg = baru buferedImage (lebar, tinggi, bufferedimage.type_int_rgb); // Dapatkan grafik kuas g = buffimg.getGraphics (); // Atur warna kuas G.SetColor (GetRandColor (200, 255)); // Kemudian isi persegi panjang, yaitu, atur warna latar belakang G.Fillrect (0, 0, lebar, tinggi); // Atur baris interferensi untuk (int i = 0; i <linecnt; i ++) {// Store untuk mendapatkan titik awal dan akhir dari garis interferensi int xs = (int) (math.random () * lebar); int ys = (int) (math.random () * tinggi); int xe = (int) (math.random () * lebar); int ye = (int) (math.random () * tinggi); g.setColor (getRandColor (1, 255)); G.Drawline (XS, YS, XE, YE); } // Tambahkan Area Int Noise = (int) (Noiserate * Width * Height); untuk (int i = 0; i <area; ++ i) {int x = (int) (math.random () * lebar); int y = (int) (math.random () * tinggi); buffimg.setrgb (x, y, (int) (math.random () * 255)); } // atur font font = font baru ("ravie", font.plain, fontSize); g.setfont (font); untuk (int i = 0; i <code.length (); ++ i) {string ch = code.substring (i, i+1); G.SetColor (GetRandColor (1, 199)); g.drawstring (ch, paddingx + fontwidth * i, paddingy); } return buffimg; } / *** Dapatkan warna acak, nilai -nilai r, g, b adalah antara l dan r* @param l interval kiri* @param r interval kanan* @return mengembalikan nilai warna acak* / warna privat statis getRandColor (int l, int r) {if (l> 255) l = 255; if (r> 255) r = 255; if (l <0) l = 0; if (r <0) r = 0; int interval = r - l; int r = l + (int) (math.random () * interval); int g = l + (int) (math.random () * interval); int b = l + (int) (math.random () * interval); mengembalikan warna baru (r, g, b); } / *** Menghasilkan secara acak beberapa string yang terdiri dari huruf besar dan huruf kecil dan angka* @param len secara acak menghasilkan karakter Len* @Return mengembalikan string yang dihasilkan secara acak yang terdiri dari huruf besar dan huruf kecil dan angka* / string statis public getRandCode (int len) {string code = ""; untuk (int i = 0; i <len; ++ i) {int index = (int) (math.random () * alfabet.length ()); kode = kode + alfabet.charat (indeks); } kembali kode; } / *** Konversi gambar ke array byte* @param gambar gambar* @return mengembalikan array byte* @throws ioException* / public static byte [] getByTeArray (BufferedImage Image) melempar ioException {bytearrayutputStream Baos = bytearrayRayStreamstream (); Imageo.write (Image, "Png", Baos); return baos.tobytearray (); // bytearrayoutputstream tidak memerlukan tutup}}Gunakan gambar kode verifikasi
Di VerificationCode.java Servlet, hubungi kelas di atas untuk menghasilkan gambar kode verifikasi, dan kemudian kembalikan gambar ke klien.
DOGET VOID DOGET (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {httpsession session = request.getSession (); // Hasilkan secara acak string dan tulis kode string sesi = verifikasi.getRandCode (4); session.setAttribute ("verifikasi", kode); BufferedImage Image = util.verification.getImage (100,30, kode, 5); response.setContentType ("Image/png"); OutputStream out = response.getoutputStream (); out.write (util.verification.getByTeArray (gambar)); out.flush (); out.close (); }Atur kode verifikasi di index.jsp. Ketika pengguna mengklik kode verifikasi, ia memanggil kode JS untuk meminta server untuk mendapatkan kode verifikasi baru. Karena servlet di atas yang menghasilkan kode verifikasi akan di -cache oleh browser, kode JS perlu memberikan parameter acak kepada Servlet, sehingga browser akan mengirim permintaan ke server untuk mendapatkan kode verifikasi baru, daripada membacanya di cache.
<%@page Impor = "util.verification"%> <%@page language = "java" contentType = "text/html; charset = utf-8" pageEncoding = "UTF-8"%> <! Doctml html public "-// w3c // dtd html 4.01 transisi // en" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title><script type="text/javascript"> function refreshcode(){ document.geteLementById ("verifikasi"). src = "/verifikasicode/verifikasi kode? hehe ="+math.random (); } </script> </head> <body> <Form Action = "< %= request.getContextPath ()+"/checkverifikasi " %>" Method = "Post"> Kode Verifikasi: <Input Type = "Text" Name = "SubmitVerification"> <img id = "verifikasi" src = "< %= request.getContPath () <) <) <) <) <) <) <perifikasi" src = "< %= getcontextpath () <) <) <) <)" verifikasi "src =" < %= getcontextpath () <) OnClick = "RefreshCode ()"> <br> <input type = "kirim" name = "kirim" value = "kirim"> </form> </body> </html>Akhirnya, di Checkverification.java Servlet, kami menentukan apakah kode verifikasi yang dimasukkan oleh pengguna benar. Untuk memfasilitasi pengguna, kode verifikasi umumnya ditetapkan untuk menjadi tidak peka, sehingga harus dikonversi menjadi huruf kecil sebelum perbandingan.
DOGET VOID DOGET (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {httpsession session = request.getSession (); Verifikasi string = (string) session.getAttribute ("verifikasi"); String submitverification = request.getParameter ("Submitverification"); Printwriter out = response.getWriter (); if (verifikasi! = null && submitverification! = null) {if (verification.tolowercase (). Equals (submitverification.tolowercase ())) {out.println ("Ya !!!"); } else {out.println ("Tidak !!!"); }} else {out.println ("Tidak !!!"); } Sesi. {// TODO Metode yang dihasilkan otomatis Stub doGet (Request, Response); }Render rendering terakhir adalah sebagai berikut
Di atas adalah semua tentang artikel ini, saya harap ini akan membantu untuk pembelajaran semua orang.