1. Pendahuluan
Keuntungan menggunakan kode verifikasi di halaman formulir adalah bahwa ia secara efektif mencegah pengguna dari mengirimkan formulir dengan jahat, atau menggunakan plug-in untuk menyerang sistem secara ilegal.
2. Kondisi persiapan
1. Proyek Web Proyek Web Normal;
2. Server web tomcat.
3. Ide Implementasi:
1. Kustomisasi Servlet VerifyCodeserVlet untuk menggambar gambar kode verifikasi yang berisi karakter verifikasi. Gambar -gambar di sini perlu diambil secara manual menggunakan Graphics2d;
2. Gunakan SRC dari tag IMG untuk merujuk servlet ini pada halaman tertentu untuk menampilkan servlet;
3. Karena informasi kode verifikasi dimasukkan ke dalam sesi saat menggambar gambar, setelah mengirimkan formulir, Anda dapat membandingkan nilai yang disimpan dalam sesi dengan kode yang dimasukkan oleh pengguna untuk memverifikasi apakah inputnya benar.
Sebagian besar kode verifikasi yang diimplementasikan melalui servlet diimplementasikan secara online, dan logika di bawah ini dimasukkan:
melangkah:
1. Menghasilkan string kode verifikasi secara acak saat meminta login ke halaman;
2. Simpan string kode verifikasi yang dihasilkan di sesi;
3. Hasilkan gambar kode verifikasi berdasarkan string kode verifikasi, dan kemudian output gambar kode verifikasi kepada pelanggan untuk ditampilkan;
4. Bandingkan string kode verifikasi yang dimasukkan oleh pengguna saat mengirimkan permintaan login dengan string di sesi.
4. Kode spesifiknya adalah sebagai berikut:
paket com.servlet; impor java.awt.color; impor java.awt.font; impor java.awt.graphics2d; impor java.awt.image.bufferedimage; impor java.util.random; impor javax.imageio.imageio; impor javax.servlet.servletException; impor javax.servlet.servletoutputStream; impor javax.servlet.http.httpservlet; impor javax.servlet.http.httpservletRequest; impor javax.servlet.http.httpservletResponse; impor javax.servlet.http.httpsession; / ** * Servlet yang menghasilkan gambar kode verifikasi * @Author Administrator * */ kelas publik VerifyCodeserVlet memperluas httpservlet {private static final long serialversionuid = -5051097528828603895l; /*** Lebar gambar kode verifikasi. */ lebar int private = 100; /*** Ketinggian gambar kode verifikasi. */ Tinggi int privat = 30; / *** Jumlah karakter kode verifikasi*/ private int codecount = 4; / *** tinggi font*/ private int fontheight; / *** Nilai sumbu x dari karakter pertama, karena koordinat karakter berikut bertambah berurutan, nilai sumbu x mereka adalah kelipatan kodeks*/ codex int private; / *** codey, nilai sumbu y dari karakter verifikasi, karena nilainya sama karena paralelisme*/ private int codey; / *** codesquence mewakili nilai urutan bahwa karakter diizinkan untuk muncul*/ char [] codesequence = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', ',', '', ',', 'o', ',' o '', ',' o ',' ',' o '', ',', 't', '', ',' ’, 'V', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; / *** Inisialisasi atribut gambar verifikasi*/ public void init () melempar servletException {// dapatkan informasi awal dari web.xml // lebar string strwidth = this.getInitparameter ("width"); // string tinggi strheight = this.getInitparameter ("tinggi"); // jumlah karakter string strcodecount = this.getInitparameter ("codecount"); // Konversi informasi yang dikonfigurasi menjadi numerik coba {if (strwidth! = Null && strwidth.length ()! = 0) {width = integer.parseint (strwidth); } if (strheight! = null && strheight.length ()! = 0) {height = integer.parseint (strheight); } if (strcodecount! = null && strcodecount.length ()! = 0) {codecount = integer.parseint (strcodecount); }} catch (NumberFormateException e) {E.PrintStackTrace (); } // Lebar-4 Lepaskan posisi kiri dan kanan yang berlebihan untuk membuat kode verifikasi lebih terkonsentrasi, dan semakin banyak Anda menguranginya, semakin terkonsentrasi. // codecount+1 // alokasi equi-varian dari lebar yang ditampilkan, termasuk spasi di sisi kiri dan kanan codex = (lebar-4) /(codecount+1); // Tinggi - 10 Kode Verifikasi Tampilan terpusat Fontheight = Tinggi - 10; codey = tinggi - 7; } /** * @param request * @param response * @throws ServletException * @throws java.io.IOException */ protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { // Define image buffer BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.type_int_rgb); Grafik2d gd = buffimg.creategraphics (); // Buat kelas generator bilangan acak acak acak = acak baru (); // Isi gambar sebagai gd.setColor putih (color.light_gray); gd.fillrect (0, 0, lebar, tinggi); // Buat font, ukuran font harus ditentukan sesuai dengan ketinggian gambar. Font font = font baru ("fixedsys", font.plain, fontheight); // Atur font. gd.setfont (font); // Gambar perbatasan. GD.SetColor (Color.Black); gd.drawrect (0, 0, lebar - 1, tinggi - 1); // menghasilkan 160 baris interferensi secara acak, membuat kode otentikasi pada gambar yang lebih kecil kemungkinannya terdeteksi oleh program lain. gd.setColor (color.gray); untuk (int i = 0; i <16; i ++) {int x = random.nextInt (lebar); int y = random.nextInt (tinggi); int xl = random.nextInt (12); int yl = random.nextInt (12); gd.drawline (x, y, x + xl, y + yl); } // RandomCode digunakan untuk menyimpan kode verifikasi yang dihasilkan secara acak sehingga pengguna dapat memverifikasi setelah masuk. StringBuffer RandomCode = New StringBuffer (); int red = 0, hijau = 0, biru = 0; // secara acak menghasilkan kode verifikasi untuk nomor codecount. untuk (int i = 0; i <codecount; i ++) {// Dapatkan nomor kode verifikasi yang dihasilkan secara acak. String strrand = string.valueof (codesequence [random.nextInt (36)]); // menghasilkan komponen warna acak untuk membangun nilai warna, sehingga nilai warna dari setiap output digit akan berbeda. merah = random.nextint (255); green = random.nextint (255); blue = random.nextint (255); // Gambar kode verifikasi ke dalam gambar dengan warna yang dihasilkan secara acak. gd.setColor (warna baru (merah, hijau, biru)); gd.drawstring (strrand, (i + 1) * codex, codey); // Gabungkan empat angka acak yang dihasilkan bersama -sama. acakcode.append (strrand); } // Simpan kode verifikasi empat digit ke sesi. Httpsession sesi = request.getSession (); session.setAttribute ("validateCode", randomCode.toString ()); // cache gambar dilarang. response.setheader ("pragma", "no-cache"); response.setheader ("cache-control", "no-cache"); response.setDateheader ("kedaluwarsa", 0); response.setContentType ("Image/JPEG"); // keluaran gambar ke aliran output servlet. ServETOutputStream sos = response.getoutputStream (); Imageo.write (Buffimg, "JPEG", SOS); sos.close (); }}Kemudian konfigurasikan servlet ini yang menghasilkan kode verifikasi di web.xml, sebagai berikut:
<servlet> <servlet-name> verifyCodeserVlet </servlet-name> <servlet-class> com.servlet.verifyCodeserVlet </servlet-class> <InT-param> <parar-name> </init-param> <param-value> </Param-Value> </init-param> <param-value> </Param-Value> </init-param> <param-value> 32 </param-value> </init-param> <Inch-param> <param-name> codecount </param-name> <param-value> 4 </param-value> </itin-param> </servlet> <servlet> <servlet-name> verifycodeservlet </servlet> <RURL-PATERS>/VERIFIFYCODESERVLET </RURL-PATERS> </SERVLET-MAPPING>
Mulai server dan masukkan di bilah alamat browser: http: // localhost: 8080/webproject/verifyCodeserVlet
Periksa efek tampilan, sebagai berikut:
1. Kode verifikasi berubah setiap kali Anda menyegarkan kode verifikasi, karena servlet telah diatur untuk menonaktifkan cache browser.
2. Masalah ditemukan di sini: Jika Anda menggunakan browser Firefox, metode layanan yang ditulis ulang di VerifyCodeserVlet telah dieksekusi dua kali, dan hal yang sama berlaku jika Anda menulis ulang metode doget atau metode dopost. Dan browser lainnya tidak melihat situasi ini. Kemudian, ditemukan bahwa jika servlet dirujuk melalui halaman, akan normal untuk menyebutnya.
Kemudian Anda dapat merujuk kode verifikasi pada halaman, kode spesifik adalah sebagai berikut:
<%@ page language = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <! Doctype html public "-// w3c // dtd html 4.01 transisi // en" "http://www.w3.org/org/ht4/t." <Html> <Head> <meta http-equiv = "content-type" content = "text/html; charset = iso-8859-1"> <itement> Sisipkan judul di sini </iteme> </head> <div> <% string inputcode = request.getParameter ("inputcode"); String verifyCode = (string) session.getAttribute ("validateCode"); if (inputCode! = null && verifyCode! = null) {out.print ("Kode verifikasi nyata:" + verifyCode + "<br/>" + "Kode verifikasi input pengguna:" + inputCode + "<br/>"); inputCode = inputCode.touppercase (); // case tidak sensitif out.print ("Bandingkan kode verifikasi untuk membuktikan input pengguna" + (inputCode.equals (verifyCode)? "Benar": "error") + "!"); } %> <Form Action = "index.jsp"> Kode verifikasi: <input name = "inputCode" value = ""/> <img src = "verifyCodeserVlet" align = "tengah" ontClick = "JavaScript: Refresh (this);" onMouseOver = "mouseover (this)"/> <br/> <input name = "kirim" type = "kirim" value = "kirim"/> </form> </div> <script> function refresh (obj) {obj.src = "verifycodeservlet?" + Math.random (); } function mouseover (obj) {obj.style.cursor = "pointer"; } </script> </body> </html> Kode di atas mengirimkan kode verifikasi ke JSP saat ini melalui formulir untuk memverifikasi apakah kode verifikasi yang dimasukkan oleh pengguna benar. Efek spesifik dari operasi adalah sebagai berikut:
1. Masukkan kode verifikasi yang benar
2. Masukkan kode verifikasi yang salah