您的位置:首页 > 编程语言 > Java开发

JAVA图片验证码的创建与使用教程

2017-12-30 17:49 344 查看
前言:验证码常用于注册或登录等常见功能当中,这样做的目的是为了防止恶意登录或者恶意的批量注册等。验证码是必须传到服务端校验的。



DEMO1 创建一个图片写入文字并输出

写一个ImageCodeServlet

public class ImageCodeServlet extends HttpServlet {

public void service (HttpServletRequest request, HttpServletResponse response) throws IOException{
/**
*      验证码功能
* 第一步: 动态创建一个图片
* 第二步: 在图片上画字符
* 第三步: 将图片上文字保存到session里面,将来校验时,和session里面的数据比对
* 第四步: 将图片以字节输出流的形式response输出
*/

// 第一步: 动态创建一个图片  指定 (宽,高,颜色格式) 宽高单位px
BufferedImage image = new BufferedImage(100, 30, BufferedImage.TYPE_INT_BGR);

// 第二步: 在图片上画字符
//二 1、创建一个字符串
String str = "Hello World";
//二 2、 创建画笔
Graphics graphic = image.getGraphics();
//二 3、利用画笔将字符串写到图片上   (字符串,放置的横坐标,放置的纵坐标)
graphic.drawString(str, 20, 10);

// 第三步 : 将图片上文字保存到session
request.getSession().setAttribute("code", str);

// 第四步:将图片利用response输出  (图片,图片格式,字节输出流)
ImageIO.write(image, "jpeg", response.getOutputStream());

}

}


编写web.xml配置

<servlet>
<servlet-name>imageCodeServlet</servlet-name>
<servlet-class>
com.vc.servlet.ImageCodeServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>imageCodeServlet</servlet-name>
<url-pattern>/image.do</url-pattern>
</servlet-mapping>


DEMO2 建立随机数组,获取随机验证码,设置字符颜色为随机

public class ImageCodeServlet extends HttpServlet {

// 创建一个字符数组
private char[] chars = {'A','B','C','D','E','F','G',
'H','I','J','K','M','L','N',
'O','P','Q','R','S','T',
'U','V','W','X','Y','Z',
'1','2','3','4','5','6','7','8','9','0'};

public void service (HttpServletRequest request, HttpServletResponse response) throws IOException{

// 第一步: 动态创建一个图片  指定 (宽,高,颜色格式) 宽高单位px
BufferedImage image = new BufferedImage(100, 30, BufferedImage.TYPE_INT_BGR);
//创建画笔
Graphics graphic = image.getGraphics();
//设置图片背景颜色 为黄色
graphic.setColor(Color.YELLOW);
//画一个矩形 设置 坐标点 宽高
graphic.fillRect(0, 0, 100, 30);

// 第二步: 在图片上画字符
//二 1、创建一个字符串
String str = "";
// 随机抽取字符
for(int i=0;i<5;i++){
Random ran = new Random();
int index = ran.nextInt(chars.length);
str += chars[index];
//生成一个随机的Color RGB模式
Color color = new Color(
ran.nextInt(255),ran.nextInt(255),ran.nextInt(255));
graphic.setColor(color);
//利用画笔将字符串写到图片上   (字符串,放置的横坐标,放置的纵坐标)
graphic.drawString(chars[index]+"", 30+i*10, 20);
}

// 第三步 : 将图片上文字保存到session
request.getSession().setAttribute("code", str);

// 第四步:将图片利用response输出  (图片,图片格式,字节输出流)
ImageIO.write(image, "jpeg", response.getOutputStream());

}


DEMO3 增加验证码的干扰线

public class ImageCodeServlet extends HttpServlet {

// 创建一个字符数组
private char[] chars = {'A','B','C','D','E','F','G',
'H','I','J','K','M','L','N',
'O','P','Q','R','S','T',
'U','V','W','X','Y','Z',
'1','2','3','4','5','6','7','8','9','0'};

public void service (HttpServletRequest request, HttpServletResponse response) throws IOException{

// 第一步: 动态创建一个图片  指定 (宽,高,颜色格式) 宽高单位px
BufferedImage image = new BufferedImage(100, 30, BufferedImage.TYPE_INT_BGR);
//创建画笔
Graphics graphic = image.getGraphics();
//设置图片背景颜色 为黄色
graphic.setColor(Color.YELLOW);
//画一个矩形 设置 坐标点 宽高
graphic.fillRect(0, 0, 100, 30);

// 第二步: 在图片上画字符
//二 1、创建一个字符串
String str = "";
Random ran = new Random();
// 随机抽取字符
for(int i=0;i<5;i++){
int index = ran.nextInt(chars.length);
str += chars[index];
//生成一个随机的Color RGB模式
Color color = new Color(
ran.nextInt(255),ran.nextInt(255),ran.nextInt(255));
graphic.setColor(color);
//利用画笔将字符串写到图片上   (字符串,放置的横坐标,放置的纵坐标)
graphic.drawString(chars[index]+"", 30+i*10, 20);
}

// 第三步 : 将图片上文字保存到session
request.getSession().setAttribute("code", str);

/**    增加干扰线        */
for(int i=0;i<5;i++){
/** 随机设置干扰线的颜色 */
Color color = new Color(                    ran.nextInt(255),ran.nextInt(255),ran.nextInt(255));
graphic.setColor(color);
// 设置干扰线
graphic.drawLine(ran.nextInt(100),ran.nextInt(30),ran.nextInt(100),ran.nextInt(30));
}

// 第四步:将图片利用response输出  (图片,图片格式,字节输出流)
ImageIO.write(image, "jpeg", response.getOutputStream());

}

}


校验验证码的servlet

CheckCodeServlet

public class CheckCodeServlet extends HttpServlet {

@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//接收请求code参数
String code = request.getParameter("code");
//获取session中验证码信息
String s_code = (String) request.getSession().getAttribute("code");
/** 比对输出结果 */
// 输出中文
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
if(code.equals(s_code)){
out.println("验证码正确");
}else{
out.println("验证码错误");
}
out.close();
}

}


web.xml配置文件

<!-- 校验验证码图片 -->
<servlet>
<servlet-name>checkCodeServlet</servlet-name>
<servlet-class>
com.vc.servlet.CheckCodeServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>checkCodeServlet</servlet-name>
<url-pattern>/checkcode.do</url-pattern>
</servlet-mapping>


login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript">
function flushImage(){
// 给连接后面增加一串随机数 避免缓存带来的影响
$("#code").attr("src","image.do?r="+Math.random());
};

function checkCode(){
//获取用户输入的验证码信息
var code = $("#txt_code").val().trim();
if(code==''){
$("#s_code").html("不能为空");
return;
}
//发送ajax检查正确性
$.ajax({
url:"checkcode.do",
type:"post",
data:{"code":code},
dataType:"text",
success:function(data){
//data是服务器返回的消息
$("#s_code").html(data);
}
});
};
</script>
</head>
<body>
用户名: <input type="text" id="txt_username" name="username"><br/>
密码: <input type="text" id="txt_password" name="password"><br/>
验证码: <input type="text" id="txt_code" name="code" size="5" onblur="checkCode()">
<img id="code" alt="验证码" src="image.do">
<a href="javascript:flushImage();">看不清?</a>
<span id="s_code"></span><br/>
<input type="button" value="登录•">
</body>
</html>


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐