public static void main(String[] args)throws Exception {
String message="3456789abcdefghjkmnpqstuvwxy";
//通过java生成图片
//现实:画画
//1 准备画板-
//2 铺上画布
//3 准备笔
//4 画背景
//5 画主题
//6 撤画布
//1 在内存中开辟空间 用于画画
BufferedImage bin=new BufferedImage(200, 50, BufferedImage.TYPE_INT_RGB);
//2 获取画笔
Graphics2D g=(Graphics2D)bin.getGraphics();
//3 涂染料 画背景
g.setColor(Color.WHITE);
//4 画背景:长方形
g.fillRect(2, 2, 195, 45);
//5 画主题
//随机四五个字符
String str="";
for (int i = 0; i <4; i++) {
str+=message.charAt((int)(Math.random()*message.length()));
}
//给字符设置文字样式
Font font=new Font(null, Font.BOLD, 34);
g.setFont(font);
//把字符串中的所有字符画到画布上
for (int i = 0; i < str.length(); i++) {
//笔蘸墨
g.setColor(new Color((int)(Math.random()*100+120), (int)(Math.random()*100+120), (int)(Math.random()*100+120)));
//写字
g.drawString(str.charAt(i)+"", i*45+10, 40);
}
//画干扰线
for (int i = 0; i < (int)(Math.random()*5+5); i++) {
g.setColor(new Color((int)(Math.random()*50+120), (int)(Math.random()*50+120), (int)(Math.random()*50+120)));
g.drawLine(2, (int)(Math.random()*43+2), 195, (int)(Math.random()*43+2));
}
//6 创建流与目的文件关联
File muDiFile=new File("E:\\imgs\\"+(int)(Math.random()*100+120)+".jpg");
FileOutputStream fout=new FileOutputStream(muDiFile);
//把内存中BufferedImage中的信息通过输出流写道目的文件中
ImageIO.write(bin, "JPEG", fout);
fout.close();
}
页面的img的src请求servlet生成验证码图片
servlet需要把验证码保存到session中用于登录判断输入的验证码是否正确
比较session域中的验证码和用户输入的验证码,如果相同则登录成功
<h1>用户登录表单</h1>
<c:if test="${not empty requestScope.message}">
<h3>${requestScope.message}</h3>
</c:if>
<form method="get" action="<c:url value='/user/login'/>">
<table>
<tr>
<th>用户名称:</th>
<td><input type="text" name="uname"/></td>
</tr>
<tr>
<th>用户密码:</th>
<td><input type="password" name="upwd"/></td>
</tr>
<tr>
<th><img src="<c:url value='/user/yzm'/>" id="img_yzm"/></th>
<td><input type="text" name="uyzm"/></td>
</tr>
<tr>
<th colspan="2"><INPUT type="reset" value="重置"/>
<INPUT type="submit" value="登录"/></th>
</tr>
</table>
</form>
<!-- 添加js事件 点击图片 图片更新 -->
<script type="text/javascript">
//文档加载完毕 给img_yzm注册点击事件
window.onload=function(){
//获取img_yzm
var oimg=document.getElementById("img_yzm");
oimg.onclick=function(){
//请求时 为了不使用缓存 添加一个无用的参数 参数值每次不同即可
this.src="<c:url value='/user/yzm?n='/>"+Math.random();
}
}
</script>
String message="3456789abcdefghjkmnpqstuvwxy";
//1 在内存中开辟空间 用于画画
BufferedImage bin=new BufferedImage(200, 50, BufferedImage.TYPE_INT_RGB);
//2 获取画笔
Graphics2D g=(Graphics2D)bin.getGraphics();
//3 涂染料 画背景
g.setColor(Color.WHITE);
//4 画背景:长方形
g.fillRect(2, 2, 195, 45);
//5 画主题
//随机四五个字符
String str="";
for (int i = 0; i <4; i++) {
str+=message.charAt((int)(Math.random()*message.length()));
}
//给字符设置文字样式
Font font=new Font(null, Font.BOLD, 34);
g.setFont(font);
//把字符串中的所有字符画到画布上
for (int i = 0; i < str.length(); i++) {
//笔蘸墨
g.setColor(new Color((int)(Math.random()*100+120), (int)(Math.random()*100+120), (int)(Math.random()*100+120)));
//写字
g.drawString(str.charAt(i)+"", i*45+10, 40);
}
//画干扰线
for (int i = 0; i < (int)(Math.random()*5+5); i++) {
g.setColor(new Color((int)(Math.random()*50+120), (int)(Math.random()*50+120), (int)(Math.random()*50+120)));
g.drawLine(2, (int)(Math.random()*43+2), 195, (int)(Math.random()*43+2));
}
//把验证码的信息装入session
request.getSession().setAttribute("yzm", str);
//把内存中图片的信息通过response的输出流 响应给客户端
ImageIO.write(bin, "JPEG", response.getOutputStream());
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取请求参数
String uname=request.getParameter("uname");
String upwd=request.getParameter("upwd");
String uyzm=request.getParameter("uyzm");
String message="";
//判断参数的正确
if(!uname.equals("韩梅梅")){
message="用户名错误!";
}else if(!upwd.equals("123")){
message="用户密码错误!";
}else {
String yzm=request.getSession().getAttribute("yzm")+"";
if(!uyzm.equals(yzm)){
message="验证码错误!";
}
}
//如果message有值 登录失败 回到登录页面
if(!message.isEmpty()){
request.setAttribute("message", message);
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
}
response.getWriter().print("<font color='red'>"+uname+"登录成功!</font>");