jsp+servlet验证码验证
一. servlet绘制生成验证码
index.jsp – 前台页面
<body>
<form action="<%=request.getContextPath() %>/servlet/LoginServlet" method="get">
验证码:<input type="text" name="VerifyCode" size=6 />
<img onclick="reloadCode()" src="<%=request.getContextPath() %>/servlet/ImgServlet" id="img" /> <br>
<input type="submit" name="submit" value="提交" />
</form>
<script> function reloadCode(){ document.getElementById("img").src="<%=request.getContextPath() %>/servlet/ImgServlet?"+Math.random();; } </script>
</body>
ImgServlet.java – 绘制验证码图片
package servlet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ImgServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
BufferedImage bfi = new BufferedImage(68, 22, BufferedImage.TYPE_INT_RGB); //图像缓冲区
Graphics g = bfi.getGraphics();
StringBuffer sb = new StringBuffer();
/*画背景框*/
Color color = new Color(200,215,250);
g.setColor(color);
g.fillRect(0, 0, 68,30);
/*第一个数字*/
Random r = new Random();
int tmp1 = r.nextInt(20);
g.setColor(new Color(r.nextInt(100),r.nextInt(100),r.nextInt(100))); //设置随机颜色
g.drawString(tmp1+"",3, 18);
/*加号*/
g.setColor(new Color(r.nextInt(100),r.nextInt(100),r.nextInt(100))); //设置随机颜色
g.drawString("+",18, 18);
/*第二个数字*/
int tmp2 = r.nextInt(20);
g.setColor(new Color(r.nextInt(100),r.nextInt(100),r.nextInt(100))); //设置随机颜色
g.drawString(tmp2+"",33, 18);
/*等号*/
g.setColor(new Color(r.nextInt(100),r.nextInt(100),r.nextInt(100))); //设置随机颜色
g.drawString("=",48, 18);
/*问号*/
g.setColor(new Color(r.nextInt(100),r.nextInt(100),r.nextInt(100))); //设置随机颜色
g.drawString("?",57, 18);
/*保存到session*/
int result = tmp1+tmp2;
request.getSession().setAttribute("VerifyCode", result+"");
/*写入response输出流*/
ImageIO.write(bfi, "JPG", response.getOutputStream());
}
}
LoginServlet.java – 校验与处理
package servlet;
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 {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String re = request.getParameter("VerifyCode");
String answer =(String)request.getSession().getAttribute("VerifyCode");
PrintWriter out = response.getWriter();
if(re.equals(answer)){
out.printf("验证成功");
}else{
out.printf("验证失败");
}
out.flush();
out.close();
}
}
二. 使用kaptcha验证码组件
1.. 添加kaptcha的jar包到项目lib库
2..配置web.xml
<servlet>
<servlet-name>Kaptcha</servlet-name>
<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Kaptcha</servlet-name>
<url-pattern>/kaptcha.jpg</url-pattern>
</servlet-mapping>
3.. 页面调用
<body>
<form action="<%=request.getContextPath() %>/servlet/LoginServlet" method="get">
验证码:<input type="text" name="VerifyCode" size=6 />
<img onclick="reloadCode()" src="kaptcha.jpg" id="img" /> <br>
<input type="submit" name="submit" value="提交" />
</form>
<script> function reloadCode(){ document.getElementById("img").src="kaptcha.jpg?"+Math.random();; } </script>
</body>
4..验证用户输入是否正确
/*获取session中的验证码*/
String captcha = ((String) request.getSession().getAttribute(
com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY));
kaptcha详细配置:
在web.xml的该servlet中配置初始化参数
属性 | param name | param value |
---|---|---|
文本实现类 | kaptcha.textproducer.impl | com.google.code.kaptcha.text.impl.DefaultTextCreator |
验证码值配置 | kaptcha.textproducer.char.string | abcde2345678gfynmnpwx(自定义) |
验证码的长度 | kaptcha.textproducer.char.length | 数字 |
字体 | kaptcha.textproducer.font.names | 字体 |
字体颜色 | kaptcha.textproducer.font.color | r,g,b 或者 white,black,blue |
验证码宽度 | kaptcha.textproducer.img.width | 数字 |
验证码高度 | kaptcha.textproducer.img.height | 数字 |
干扰实现类 | kaptcha.noise.impl | com.google.code.kaptcha.impl.DefaultNoise/NoNoise |
干扰颜色 | kaptcha.noise.color | r,g,b 或者 white,black,blue |
图片样式 | kaptcha.obscurificator.impl | 水纹com.google.code.kaptcha.impl.WaterRipple; 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy; 阴影com.google.code.kaptcha.impl.ShadowGimpy |
背景实现类 | kaptcha.background.impl | com.google.code.kaptcha.impl.DefaultBackground |
背景渐变色(开始/结束) | kaptcha.background.clear.from/to | r,g,b 或者 white,black,blue |
文字渲染器 | kaptcha.word.impl | com.google.code.kaptcha.text.impl.DefaultWordRenderer |
session中存放验证码的key键 | kaptcha.session.key | KAPTCHA_SESSION_KEY |
还没有评论,来说两句吧...