使用Servlet实现验证码
没有验证码带来的问题
对特定用户不断登录破解密码。
对某个网站创建账户。
对某个网站提交垃圾数据。
对某个网站刷票。
通过验证码由用户肉眼识别其中的验证码信息,从而区分用户是人还是计算机。
定义:
验证码(CAPTCHA):是一种区分用户是计算机还是人的公共全自动程序。
作用:防止恶意破解密码、刷票、论坛灌水,防止黑客暴力破解。
使用Servlet实现验证码
实现图片验证码类GenerateImageCodeServlet.java
GenerateImageCodeServlet.java
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.image.BufferedImage;
importjava.io.IOException;
importjava.util.Date;
importjava.util.Random;
importjavax.imageio.ImageIO;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
publicclassGenerateImageCodeServletextendsHttpServlet{
privatestaticfinallongserialVersionUID=1L;
privatestaticfinalchar[]CH="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".toCharArray();
privatestaticfinalintIMAGE_WIDTH=73;
privatestaticfinalintIMAGE_HEIGHT=28;
privatestaticfinalintLINE_NUM=30;
privatestaticfinalintRANDOM_NUM=4;
Randomrandom=newRandom();
@Override
protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
response.setContentType("image/jpg");//设置相应类型,告诉浏览器输出的内容为图片
response.setHeader("Pragma","No-cache");//设置响应头信息,告诉浏览器不要缓存此内容
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expire",newDate().getTime());
BufferedImagebi=newBufferedImage(IMAGE_WIDTH,IMAGE_HEIGHT,BufferedImage.TYPE_INT_BGR);
Graphicsg=bi.getGraphics();
g.fillRect(0,0,IMAGE_WIDTH,IMAGE_HEIGHT);
g.setColor(getRandomColor(110,133));
g.setFont(newFont("TimesNewRoman",Font.ROMAN_BASELINE,18));
//绘制干扰线
for(inti=1;i<=LINE_NUM;i++){
intx=random.nextInt(IMAGE_WIDTH);
inty=random.nextInt(IMAGE_HEIGHT);
intxl=random.nextInt(13);
intyl=random.nextInt(15);
g.drawLine(x,y,x+xl,y+yl);
}
//绘制随机字符
StringBuildersb=newStringBuilder();
Stringstr=null;
for(inti=0;i<RANDOM_NUM;i++){
g.setFont(newFont("Fixedsys",Font.CENTER_BASELINE,18));
g.setColor(newColor(random.nextInt(101),random.nextInt(111),random.nextInt(121)));
str=CH[random.nextInt(CH.length)]+"";
g.drawString(str,13*i,16);
g.translate(random.nextInt(3),random.nextInt(3));
sb.append(str);
}
g.dispose();
request.getSession().setAttribute("safeCode",sb.toString());
ImageIO.write(bi,"JPG",response.getOutputStream());
}
/**
*获得颜色
*/
privateColorgetRandomColor(intfc,intbc){
if(fc>255)
fc=255;
if(bc>255)
bc=255;
intr=fc+random.nextInt(bc-fc-16);
intg=fc+random.nextInt(bc-fc-14);
intb=fc+random.nextInt(bc-fc-18);
returnnewColor(r,g,b);
}
}
登录验证LoginServlet.java
importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
publicclassLoginServletextendsHttpServlet{
privatestaticfinallongserialVersionUID=1L;
@Override
protectedvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
resp.setContentType("text/html;charset=gbk");
StringsafeCode=(String)req.getSession().getAttribute("safeCode");
Stringcheckcode=req.getParameter("checkcode");
PrintWriterout=resp.getWriter();
if(safeCode.equalsIgnoreCase(checkcode)){
out.println("验证码正确");
}
else{
out.println("验证码错误");
}
out.flush();
out.close();
}
}
web.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<web-appid="WebApp_ID"version="3.0"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>ImageCodeServlet</servlet-name>
<servlet-class>com.lijy.servlet.GenerateImageCodeServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.lijy.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageCodeServlet</servlet-name>
<url-pattern>/safe_code</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
index.jsp
<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=ISO-8859-1">
<title>checkcodes</title>
<scripttype="text/javascript">
functionreloadCode(){
vartime=newDate().getTime();
document.getElementById("imagecode").src="<%=request.getContextPath()%>/safe_code?d="+time;
}
</script>
</head>
<body>
<formaction="<%=request.getContextPath()%>/login"method="get">
验证码:<inputtype="text"name="checkcode"/>
<imgalt="验证码"id="imagecode"src="<%=request.getContextPath()%>/safe_code">
<ahref="javascript:reloadCode();">看不清楚</a><br/>
<inputtype="submit"value="提交"/>
<hr>
</form>
</body>
</html>
如果您觉得本文的内容对您的学习有所帮助:
关键字:
ps