验证码在很多地方都能用上特别登录、注册的的时候会派上特别大的用处,接下来我们做一个简陋的验证码功能的实现:
1.创建一个servlet:
@WebServlet("/checkCode")
public class CheckCodeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
2在servlet中,根据自己的需求,看是否要进行浏览器的缓存,一般情况下不用缓存:
//服务器通知浏览器不要缓存
response.setHeader("pragma","no-cache");
response.setHeader("cache-control","no-cache");
3.定义一个方法,判断用几位数字和英文组成验证:
private String getCheckCode() {
//定义验证码的值
String base = "0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnnm";
//设置大小
int size = base.length();
//随机产生
Random r = new Random();
//产生缓冲流
StringBuffer sb = new StringBuffer();
//4个
for (int i = 1 ; i <= 4; i++){
//随机数添加进来
int index = r.nextInt(size);
//从base拿值
char c = base.charAt(index);
//输出
sb.append(c);
}
return sb.toString();
}
3.设置验证码的位置和高度
//参数一:长
int width = 80;
//参数二:宽
int height = 30;
//参数三:颜色
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
4.通过画笔填充图片:
//获取画笔
Graphics g = image.getGraphics();
//设置画笔颜色为灰色
g.setColor(Color.darkGray);
//填充图片
g.fillRect(0,0,width,height);
5.接受验证码的数字大小以及填充:
//接受验证码
String checkCode = getCheckCode();
//将验证码放入HttpSession中~
request.getSession().setAttribute("CHECKCODE_SERVER",checkCode);
//设置画笔颜色为黄色
g.setColor(Color.YELLOW);
//设置字体的小大
g.setFont(new Font("黑体",Font.BOLD,24));
//向图片上写入验证码
g.drawString(checkCode,5,25);
`
6.最后输出:
ImageIO.write(image,"PNG",response.getOutputStream());
7.html页面:
<input type="text" id="check" name="check" class="check">
<script type="text/javascript">
//图片点击事件
function changeCheckCode(img) {
img.src="checkCode?"+new Date().getTime();
}
</script>
<img src="checkCode" height="32px" alt="" onclick="changeCheckCode(this)">
8.结果:点击验证码或者刷新页面都可以产生不同的验证码