验证码生成流程
页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="" method="post">
验证码:<input type="text" name="checkcode"/>
<img id="codeImg" οnclick="changeImg()" src="${pageContext.request.contextPath }/CheckImgServlet"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
java代码
简单版
@WebServlet ( "/CheckImgServlet1" )
public class CheckImgServlet1 extends HttpServlet {
private static final long serialVersionUID = 1L ;
protected void doGet ( HttpServletRequest request, HttpServletResponse response) throws ServletException , IOException {
int width = 120 ;
int height = 30 ;
BufferedImage bufferedImage = new BufferedImage ( width, height, BufferedImage . TYPE_INT_RGB) ;
Graphics graphics = bufferedImage. getGraphics ( ) ;
graphics. setColor ( Color . YELLOW) ;
graphics. fillRect ( 0 , 0 , width, height) ;
graphics. setColor ( Color . BLUE) ;
graphics. drawRect ( 0 , 0 , width- 1 , height- 1 ) ;
Graphics2D g2d = ( Graphics2D ) graphics;
g2d. setColor ( Color . BLACK) ;
g2d. setFont ( new Font ( "宋体" , Font . BOLD, 18 ) ) ;
String words = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ;
Random random = new Random ( ) ;
int x = 10 ;
for ( int i= 0 ; i< 4 ; i++ ) {
int idx = random. nextInt ( words. length ( ) ) ;
char ch = words. charAt ( idx) ;
int jiaodu = random. nextInt ( 60 ) - 30 ;
double theta = jiaodu * Math . PI / 180 ;
g2d. rotate ( theta, x, 20 ) ;
g2d. drawString ( String . valueOf ( ch) , x, 20 ) ;
g2d. rotate ( - theta, x, 20 ) ;
x+= 30 ;
}
ImageIO . write ( bufferedImage, "jpg" , response. getOutputStream ( ) ) ;
}
protected void doPost ( HttpServletRequest request, HttpServletResponse response) throws ServletException , IOException {
doGet ( request, response) ;
}
}
升级版
package com. imooc. web. servlet ;
import java. awt. Color ;
import java. awt. Font ;
import java. awt. Graphics ;
import java. awt. Graphics2D ;
import java. awt. image. BufferedImage ;
import java. io. IOException ;
import java. util. Random ;
import javax. imageio. ImageIO ;
import javax. servlet. ServletException ;
import javax. servlet. annotation. WebServlet ;
import javax. servlet. http. HttpServlet ;
import javax. servlet. http. HttpServletRequest ;
import javax. servlet. http. HttpServletResponse ;
@WebServlet ( "/CheckImgServlet" )
public class CheckImgServlet extends HttpServlet {
public void doGet ( HttpServletRequest request, HttpServletResponse response)
throws ServletException , IOException {
int width = 120 ;
int height = 30 ;
BufferedImage bufferedImage = new BufferedImage ( width, height,
BufferedImage . TYPE_INT_RGB) ;
Graphics graphics = bufferedImage. getGraphics ( ) ;
graphics. setColor ( getRandColor ( 200 , 250 ) ) ;
graphics. fillRect ( 0 , 0 , width, height) ;
graphics. setColor ( Color . WHITE) ;
graphics. drawRect ( 0 , 0 , width - 1 , height - 1 ) ;
Graphics2D graphics2d = ( Graphics2D ) graphics;
graphics2d. setFont ( new Font ( "宋体" , Font . BOLD, 18 ) ) ;
String words =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890" ;
Random random = new Random ( ) ;
StringBuffer sb = new StringBuffer ( ) ;
int x = 10 ;
for ( int i = 0 ; i < 4 ; i++ ) {
graphics2d. setColor ( new Color ( 20 + random. nextInt ( 110 ) , 20 + random
. nextInt ( 110 ) , 20 + random. nextInt ( 110 ) ) ) ;
int jiaodu = random. nextInt ( 60 ) - 30 ;
double theta = jiaodu * Math . PI / 180 ;
int index = random. nextInt ( words. length ( ) ) ;
char c = words. charAt ( index) ;
sb. append ( c) ;
graphics2d. rotate ( theta, x, 20 ) ;
graphics2d. drawString ( String . valueOf ( c) , x, 20 ) ;
graphics2d. rotate ( - theta, x, 20 ) ;
x += 30 ;
}
request. getSession ( ) . setAttribute ( "checkCode" , sb. toString ( ) ) ;
graphics. setColor ( getRandColor ( 160 , 200 ) ) ;
int x1;
int x2;
int y1;
int y2;
for ( int i = 0 ; i < 30 ; i++ ) {
x1 = random. nextInt ( width) ;
x2 = random. nextInt ( 12 ) ;
y1 = random. nextInt ( height) ;
y2 = random. nextInt ( 12 ) ;
graphics. drawLine ( x1, y1, x1 + x2, x2 + y2) ;
}
graphics. dispose ( ) ;
ImageIO . write ( bufferedImage, "jpg" , response. getOutputStream ( ) ) ;
}
public void doPost ( HttpServletRequest request, HttpServletResponse response)
throws ServletException , IOException {
doGet ( request, response) ;
}
private Color getRandColor ( int fc, int bc) {
Random random = new Random ( ) ;
if ( fc > 255 ) {
fc = 255 ;
}
if ( bc > 255 ) {
bc = 255 ;
}
int r = fc + random. nextInt ( bc - fc) ;
int g = fc + random. nextInt ( bc - fc) ;
int b = fc + random. nextInt ( bc - fc) ;
return new Color ( r, g, b) ;
}
}
看不清,换一张
<script type="text/javascript">
function changeImg(){
var codeImg = document.getElementById("codeImg");
codeImg.src="${pageContext.request.contextPath }/CheckImgServlet?time="+new Date().getTime();/*保证每次获访问的URL不同*/
}
</script>
验证码校验
String code1 = ( String ) request. getSession ( ) . getAttribute ( com. google. code. kaptcha. Constants. KAPTCHA_SESSION_KEY) ;
String code2 = request. getParameter ( "checkCode" ) ;
if ( code2== null || ! code2. equalsIgnoreCase ( code1) ) {
request. setAttribute ( "msg" , "验证码输入不正确!" ) ;
request. getRequestDispatcher ( "/login.jsp" ) . forward ( request, response) ;
return ;
}
Kaptck验证码
配置
<servlet>
<servlet-name>KaptchaServlet</servlet-name>
<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>KaptchaServlet</servlet-name>
<url-pattern>/KaptchaServlet</url-pattern>
</servlet-mapping>
jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="" method="post">
验证码:<input type="text" name="checkcode"/>
<img id="codeImg" οnclick="changeImg()" src="${pageContext.request.contextPath }/KaptchaServlet"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
看不清换一张
<script type="text/javascript">
function changeImg(){
var codeImg = document.getElementById("codeImg");
codeImg.src="${pageContext.request.contextPath }/KaptchaServlet?time="+new Date().getTime();/*保证每次获访问的URL不同*/
}
</script>
属性配置
<servlet>
<servlet-name>KaptchaServlet</servlet-name>
<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
<!-- 修改随机的字母或数字的长度 -->
<init-param>
<param-name>kaptcha.textproducer.char.length</param-name>
<param-value>4</param-value>
</init-param>
<!-- 修改字体大小 -->
<init-param>
<param-name>kaptcha.textproducer.font.size</param-name>
<param-value>25</param-value>
</init-param>
<!-- 修改字体空隙 -->
<init-param>
<param-name>kaptcha.textproducer.char.space</param-name>
<param-value>10</param-value>
</init-param>
<!-- 修改图片的宽高 -->
<init-param>
<param-name>kaptcha.image.width</param-name>
<param-value>120</param-value>
</init-param>
<init-param>
<param-name>kaptcha.image.height</param-name>
<param-value>30</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>KaptchaServlet</servlet-name>
<url-pattern>/KaptchaServlet</url-pattern>
</servlet-mapping>
验证码校验
String code1 = ( String ) request. getSession ( ) . getAttribute ( com. google. code. kaptcha. Constants. KAPTCHA_SESSION_KEY) ;
String code2 = request. getParameter ( & quot; checkCode& quot; ) ;
if ( code2== null || ! code2. equalsIgnoreCase ( code1) ) {
request. setAttribute ( & quot; msg& quot; , & quot; 验证码输入不正确! & quot; ) ;
request. getRequestDispatcher ( & quot; / login. jsp& quot; ) . forward ( request, response) ;
return ;
}