JAVA基础之设置随机成语验证码
packagecom.oracle;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.Graphics2D;
importjava.awt.image.BufferedImage;
importjava.io.BufferedReader;
importjava.io.FileReader;
importjava.io.IOException;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.Random;
importjavax.imageio.ImageIO;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/**
*验证码生成程序
*
*
*
*/
publicclassCheckImgServletextendsHttpServlet{
//集合中保存所有成语
privateList<String>words=newArrayList<String>();
@Override
publicvoidinit()throwsServletException{
//初始化阶段,读取new_words.txt
//web工程中读取文件,必须使用绝对磁盘路径
Stringpath=getServletContext().getRealPath("/WEB-INF/new_words.txt");
try{
BufferedReaderreader=newBufferedReader(newFileReader(path));
Stringline;
while((line=reader.readLine())!=null){
words.add(line);
}
reader.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//禁止缓存
//response.setHeader("Cache-Control","no-cache");
//response.setHeader("Pragma","no-cache");
//response.setDateHeader("Expires",-1);
intwidth=120;
intheight=30;
//步骤一绘制一张内存中图片
BufferedImagebufferedImage=newBufferedImage(width,height,
BufferedImage.TYPE_INT_RGB);
//步骤二图片绘制背景颜色---通过绘图对象
Graphicsgraphics=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);
//步骤四四个随机数字
Graphics2Dgraphics2d=(Graphics2D)graphics;
//设置输出字体
graphics2d.setFont(newFont("宋体",Font.BOLD,18));
Randomrandom=newRandom();//生成随机数
intindex=random.nextInt(words.size());
Stringword=words.get(index);//获得成语
//定义x坐标
intx=10;
for(inti=0;i<word.length();i++){
//随机颜色
graphics2d.setColor(newColor(20+random.nextInt(110),20+random
.nextInt(110),20+random.nextInt(110)));
//旋转-30---30度
intjiaodu=random.nextInt(60)-30;
//换算弧度
doubletheta=jiaodu*Math.PI/180;
//获得字母数字
charc=word.charAt(i);
//将c输出到图片
graphics2d.rotate(theta,x,20);
graphics2d.drawString(String.valueOf(c),x,20);
graphics2d.rotate(-theta,x,20);
x+=30;
}
//将验证码内容保存session
request.getSession().setAttribute("checkcode_session",word);
//步骤五绘制干扰线
graphics.setColor(getRandColor(160,200));
intx1;
intx2;
inty1;
inty2;
for(inti=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);
}
//将上面图片输出到浏览器ImageIO
graphics.dispose();//释放资源
//将图片写到response.getOutputStream()中
ImageIO.write(bufferedImage,"jpg",response.getOutputStream());
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
/**
*取其某一范围的color
*
*@paramfc
*int范围参数1
*@parambc
*int范围参数2
*@returnColor
*/
privateColorgetRandColor(intfc,intbc){
//取其随机颜色
Randomrandom=newRandom();
if(fc>255){
fc=255;
}
if(bc>255){
bc=255;
}
intr=fc+random.nextInt(bc-fc);
intg=fc+random.nextInt(bc-fc);
intb=fc+random.nextInt(bc-fc);
returnnewColor(r,g,b);
}
}
<%@pagelanguage="java"contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=UTF-8">
<title>Inserttitlehere</title>
<scripttype="text/javascript">
functioncode(node){
node.src="/WEB0/CheckImgServlet?time="+newDate().getTime();
}
</script>
</head>
<body>
<imgsrc="/WEB0/CheckImgServlet"onclick="code(this)"><br>
请输入验证码:<inputtype="text"name="pwd">
</body>
</html>
如果您觉得本文的内容对您的学习有所帮助:
关键字:
JAVA