java制作验证码详解编程语言

建立一个web工程

java制作验证码详解编程语言

编写servlet,生成图像

package com.imooc; 
 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.util.Random; 
 
import javax.imageio.ImageIO; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
public class ImageSevlet extends HttpServlet 
{ 
    public void  doGet(HttpServletRequest request,HttpServletResponse response) throws IOException 
    { 
        System.err.println("doget into"); 
         
        BufferedImage bi = new BufferedImage(68, 22, BufferedImage.TYPE_INT_RGB); 
        //画图 
        Graphics g = bi.getGraphics(); 
        Color c = new Color(200,150,255); 
        g.setColor(c); 
        g.fillRect(0, 0, 68, 22);//画背景 
        //画验证码图片里面的内容 
        char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray(); 
        Random r = new Random(); 
        //获取随机的4个类 
        int len = ch.length, index;//len-1是ch下标的取值上限 
         
        StringBuffer sb = new StringBuffer(); 
        for(int i = 0; i < 4 ; i++) 
        { 
            index = r.nextInt(len); 
            //获取随机位置,即获取到了字符 
            //,new 一个新的颜色,不让字符的颜色一致,随机取, 
            g.setColor(new Color(r.nextInt(88),r.nextInt(188),r.nextInt(255)));//随机颜色 
            //画在图片上,位置 
            g.drawString(ch[index]+"", (i*15)+3, 18); 
            //保存生成的字符 
            sb.append(ch[index]); 
        } 
        //放在session中 
        request.getSession().setAttribute("verifyCode", sb.toString()); 
        //输出到response中,write(RenderedImage im, String formatName, OutputStream output)  
        ImageIO.write(bi, "jpg", response.getOutputStream()); 
    } 
     
}

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 
  <display-name>verifyCode</display-name> 
  <welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.htm</welcome-file> 
    <welcome-file>index.jsp</welcome-file> 
    <welcome-file>default.html</welcome-file> 
    <welcome-file>default.htm</welcome-file> 
    <welcome-file>default.jsp</welcome-file> 
  </welcome-file-list> 
  <servlet> 
    <description></description> 
    <display-name>ImageSevlet</display-name> 
    <servlet-name>ImageSevlet</servlet-name> 
    <servlet-class>com.imooc.ImageSevlet</servlet-class> 
  </servlet> 
  <servlet-mapping> 
    <servlet-name>ImageSevlet</servlet-name> 
    <url-pattern>/servlet/ImageSevlet</url-pattern> 
  </servlet-mapping> 
</web-app>

jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" 
pageEncoding="UTF-8"%> 
<% 
String nameSpace = request.getContextPath(); 
%> 
<% 
String projectPath = request.getScheme() + "://" 
+ request.getServerName() + ":" + request.getServerPort() 
+ nameSpace + "/"; 
%> 
<%--以后可以在页面直接使用$("basepath") --%> 
<%-- <c:set value="<%=projectPath %>" var="basePath"/> --%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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  reloadCode() 
{ 
//解决缓存的问题 
var time = new Date().getTime(); 
//在路径后面加上时间是因为这样每次请求的url不一样,浏览器就不会缓存,如果有缓存的影响那么图片就不会刷新 
document.getElementById("verifyCode").src="<%=projectPath %>servlet/ImageSevlet?id="+time; 
} 
</script> 
</head> 
<body> 
验证码:<input type="text" name = "verifyCode"/> 
<img id="verifyCode" src="<%=projectPath %>servlet/ImageSevlet" alt="verifyCode"> <a href="javascript:reloadCode();"> 看不清,刷新</a> 
<br> 
</body> 
</html>

效果(把浏览器放大了的效果)

java制作验证码详解编程语言

后台验证

package com.imooc; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
public class LoginServlet extends HttpServlet 
{ 
@Override 
public void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException 
{ 
String verifyCode = (String) req.getSession().getAttribute("verifyCode"); 
String code = req.getParameter("verifyCode"); 
System.out.println(verifyCode); 
System.out.println(code); 
System.out.println(verifyCode.equalsIgnoreCase(code)); 
//设置页面类型,解决中文乱码的问题 
resp.setContentType("text/html;charset=gbk"); 
PrintWriter out = resp.getWriter(); 
if(verifyCode.equalsIgnoreCase(code)) 
{ 
out.print("success"); 
} 
else 
{ 
out.print("false"); 
} 
} 
}

在web.xml中加入servlet

<servlet> 
<description></description> 
<servlet-name>LoginServlet</servlet-name> 
<servlet-class>com.imooc.LoginServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
<servlet-name>LoginServlet</servlet-name> 
<url-pattern>/servlet/LoginServlet</url-pattern> 
</servlet-mapping>

修改上面的jsp,实际就是加入了form

<form action="<%=projectPath %>servlet/LoginServlet" method="get"> 
验证码:<input type="text" name = "verifyCode"/> 
<img id="verifyCode" src="<%=projectPath %>servlet/ImageSevlet" alt="verifyCode"> <a href="javascript:reloadCode();"> 看不清,刷新</a> 
<br> 
<input type="submit" value="submit"> 
</form>

 

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/15372.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论