Schauen wir uns zunächst den Effekt an:
(Lernvideo-Empfehlung: Java-Kurs)
1. Anwendbare Anforderungen
Generieren Sie im Hintergrund einen Bestätigungscode für die Anmeldebestätigung. 2. Implementierungsprozess , doppelklicken Sie auf das Bild, um den Bestätigungscode zu aktualisieren, binden Sie das Onblue-Fokusverlust-Ereignis (ein Ereignis, das ausgelöst wird, wenn die Maus den Fokus verliert)
(3) Überprüfen Sie das Onblue-Ereignis,
(4) Den src-Attributwert im Bild ist der Methodenanforderungspfad zum Generieren des Bestätigungscodes im Hintergrund (dh der Pfad von requestMapping). Wenn Sie auf den Bestätigungscode klicken, können Sie das src-Attribut (ursprüngliche Zugriffsadresse + zufälliger Zeitstempel) dynamisch festlegen, um den Browser daran zu hindern nicht auf denselben Pfad zugreifen)
Hinweis: Der Hintergrund gibt das Bild direkt zurück, nicht die Zeichen des Bestätigungscodes! Wenn Zeichen zurückgegeben werden, ist der Bestätigungscode bedeutungslos (die Rezeption kann die Zeichen des Bestätigungscodes leicht erhalten und mehrere durchführen). böswillige Besuche) (dies berücksichtigt die Systemsicherheit)
2. Verwenden Sie die BufferedImage-Klasse, um ein Bild zu erstellen, und verwenden Sie dann Graphics2D, um das Bild zu zeichnen (zufällige Zeichen generieren, Interferenzlinien hinzufügen). Zur späteren Anmeldung muss eine Codezeichenfolge in die Sitzung eingefügt werden (natürlich auch im Hintergrund).
Der Front-End-Code lautet wie folgt:
<td class="tds">验证码:</td> <td> <input type="text" name="valistr" onblur="checkNull('valistr','验证码不能为空!')"> <img id="yzm_img" src="${pageContext.request.contextPath}/servlet/ValiImgServlet" style="max-width:90%" onclick="changeYZM(this)"/ alt="Verwenden Sie Java, um einen Hintergrundüberprüfungscode zu generieren" > <span id="valistr_msg"></span> </td> /** * 校验字段是否为空 */ function checkNull(name,msg){ setMsg(name,"") var v = document.getElementsByName(name)[0].value; if(v == ""){ setMsg(name,msg) return false; } return true; } /** * 为输入项设置提示消息 */ function setMsg(name,msg){ var span = document.getElementById(name+"_msg"); span.innerHTML="<font color='red'>"+msg+"</font>"; } /** * 点击更换验证码 */ function changeYZM(imgObj){ imgObj.src = "${pageContext.request.contextPath}/servlet/ValiImgServlet?time="+new Date().getTime(); }
Der Back-End-Code lautet wie folgt:
package cn.tedu.web; import cn.tedu.util.VerifyCode; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; /** * 获取验证码 */ public class ValiImgServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //禁止浏览器缓存验证码 response.setDateHeader("Expires",-1); response.setHeader("Cache-Control","no-cache"); response.setHeader("Pragma","no-cache"); //生成验证码 VerifyCode vc = new VerifyCode(); //输出验证码 vc.drawImage(response.getOutputStream()); //获取验证码的值,存储到session中 String valistr = vc.getCode(); HttpSession session = request.getSession(); session.setAttribute("valistr",valistr); //打印到控制台 System.out.println(valistr); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
package cn.tedu.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.Random; import javax.imageio.ImageIO; /** * 动态生成图片 */ public class VerifyCode { // {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"} private static String[] fontNames = { "宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312" }; // 可选字符 //"23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ"; private static String codes = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ"; // 背景色 private Color bgColor = new Color(255, 255, 255); // 基数(一个文字所占的空间大小) private int base = 30; // 图像宽度 private int width = base * 4; // 图像高度 private int height = base; // 文字个数 private int len = 4; // 设置字体大小 private int fontSize = 22; // 验证码上的文本 private String text; private BufferedImage img = null; private Graphics2D g2 = null; /** * 生成验证码图片 */ public void drawImage(OutputStream outputStream) { // 1.创建图片缓冲区对象, 并设置宽高和图像类型 img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 2.得到绘制环境 g2 = (Graphics2D) img.getGraphics(); // 3.开始画图 // 设置背景色 g2.setColor(bgColor); g2.fillRect(0, 0, width, height); StringBuffer sb = new StringBuffer();// 用来装载验证码上的文本 for (int i = 0; i < len; i++) { // 设置画笔颜色 -- 随机 // g2.setColor(new Color(255, 0, 0)); g2.setColor(new Color(getRandom(0, 150), getRandom(0, 150),getRandom(0, 150))); // 设置字体 g2.setFont(new Font(fontNames[getRandom(0, fontNames.length)], Font.BOLD, fontSize)); // 旋转文字(-45~+45) int theta = getRandom(-45, 45); g2.rotate(theta * Math.PI / 180, 7 + i * base, height - 8); // 写字 String code = codes.charAt(getRandom(0, codes.length())) + ""; g2.drawString(code, 7 + i * base, height - 8); sb.append(code); g2.rotate(-theta * Math.PI / 180, 7 + i * base, height - 8); } this.text = sb.toString(); // 画干扰线 for (int i = 0; i < len + 2; i++) { // 设置画笔颜色 -- 随机 // g2.setColor(new Color(255, 0, 0)); g2.setColor(new Color(getRandom(0, 150), getRandom(0, 150), getRandom(0, 150))); g2.drawLine(getRandom(0, 120), getRandom(0, 30), getRandom(0, 120), getRandom(0, 30)); } //TODO: g2.setColor(Color.GRAY); g2.drawRect(0, 0, this.width-1, this.height-1); // 4.保存图片到指定的输出流 try { ImageIO.write(this.img, "JPEG", outputStream); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); }finally{ // 5.释放资源 g2.dispose(); } } /** * 获取验证码字符串 * @return */ public String getCode() { return this.text; } /* * 生成随机数的方法 */ private static int getRandom(int start, int end) { Random random = new Random(); return random.nextInt(end - start) + start; } /*public static void main(String[] args) throws Exception { VerifyCode vc = new VerifyCode(); vc.drawImage(new FileOutputStream("f:/vc.jpg")); System.out.println("执行成功~!"); }*/ }
Zusammenfassung:
Einführung: Es handelt sich um den „vollständig automatisierten öffentlichen Turing-Test zur Unterscheidung von Computern und Menschen“ (vollständig). automatisierter Turing-Test zur Unterscheidung von Computern und Menschen) Abkürzung für ein öffentliches, vollautomatisches Programm, das unterscheidet, ob der Benutzer ein Computer oder ein Mensch ist.
(1) Vier Ziffern und Buchstaben, sie können alle Buchstaben sein oder sie können es alle sein Zahlen, eine zufällige 4-stellige Zeichenfolge, der originellste Bestätigungscode, und der Überprüfungseffekt ist nahezu Null. Für die Benutzeranmeldung auf der CSDN-Website wird das GIF-Format verwendet, ein häufig verwendeter zufälliger Verifizierungscode für digitale Bilder. Die Zeichen auf dem Bild sind recht anständig und der Verifizierungseffekt ist besser als beim vorherigen.
(2) Chinesische Schriftzeichen sind der neueste derzeit registrierte Bestätigungscode, der zufällig generiert wird und schwer einzugeben ist, wie z. B. die QQ-Beschwerdeseite.
(3) Die MS-Hotmail-Anwendung ist im BMP-Format, Zufallszahlen + zufällige englische Großbuchstaben + zufällige Interferenzpixel + zufällige Positionen.
(4) Koreanisch oder Japanisch, jetzt erfordert die MS-Registrierung auf Paopao HF Koreanisch, was den Schwierigkeitsgrad erhöht.
Erste Schritte mit Java
Das obige ist der detaillierte Inhalt vonVerwenden Sie Java, um einen Hintergrundüberprüfungscode zu generieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!