java校验码的设计_Java动态验证码单线设计的两种方法
1.java的動(dòng)態(tài)驗(yàn)證碼我這里將介紹兩種方法:
一:根據(jù)java本身提供的一種驗(yàn)證碼的寫法,這種呢只限于大家了解就可以了,因?yàn)閖ava自帶的模式編寫的在實(shí)際開發(fā)中是沒有意義的,所以只供學(xué)習(xí)一下就可以了,待會(huì)講解的第二種呢就是我們需要掌握的一種模式了:
第一種的代碼如下:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
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;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class inde
*/
@WebServlet("/inde")
public class inde extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public inde() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
/**動(dòng)態(tài)生成圖片驗(yàn)證碼
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//創(chuàng)建圖像
int width=100;
int height=40;
//圖片的大小設(shè)置
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//創(chuàng)建畫板
Graphics g=image.getGraphics();
setSquareBackGround(g,width,height,5);
//確定畫筆顏色
g.setColor(Color.black);
//填充矩形
g.fillRect(0, 0, width, height);
//在大矩形中放小矩形
g.setColor(Color.WHITE);
g.fillRect(1, 1, width-2, height-2);
//填充字符
String str = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789";
StringBuffer sb=new StringBuffer();
//畫隨機(jī)干擾框
setSquareBackGround(g,width,height,3);
//畫干擾點(diǎn)
CreateRandomPoint(width, height,100,g,100);
//隨機(jī)畫幾條線
CreateRandomLine(width, height,8,g,100);
//隨機(jī)獲取4個(gè)字符
Random random=new Random();
for (int i = 0; i < 4; i++) {
//62個(gè)填充字符里面隨機(jī)的隨機(jī)的收取字符
int index=random.nextInt(62);
//截取一個(gè)字符
String st=str.substring(index, index+1);
//把字符放到圖片中去
g.setColor(Color.red);
//設(shè)置字體
g.setFont(new Font("宋體",Font.BOLD,30));
g.drawString(st, 20*i, 30);//防止4個(gè)字符在一起
sb.append(st);
}
//把StringBuffer中的驗(yàn)證碼放到session里面,目的是讓Login調(diào)用
HttpSession se=request.getSession();
se.setAttribute("number", sb.toString());
//發(fā)送圖片到瀏覽器 指定發(fā)送的圖片 和格式
response.setContentType("image/jpeg");
//圖片,圖片的格式,輸出的方式
ImageIO.write(image, "jpg", response.getOutputStream());
}
Random rand = new Random();
private void CreateRandomPoint(int width,int height,int many,Graphics g,int alpha)
{ // 隨機(jī)產(chǎn)生干擾點(diǎn)
for (int i=0;i
int x = rand.nextInt(width);
int y = rand.nextInt(height);
g.setColor(getColor(alpha));
g.drawOval(x,y,rand.nextInt(3),rand.nextInt(3));
}
}
/**
* 隨機(jī)產(chǎn)生干擾線條
* @param width
* @param height
* @param minMany 最少產(chǎn)生的數(shù)量
* @param g
* @param alpha 透明度0~255 0表示全透
*/
private void CreateRandomLine(int width,int height,int minMany,Graphics g,int alpha)
{ // 隨機(jī)產(chǎn)生干擾線條
for (int i=0;i
int x1 =getIntRandom(0,(int)(width*0.6));
int y1 =getIntRandom(0,(int)(height*0.6));
int x2 =getIntRandom((int)(width*0.4),width);
int y2 =getIntRandom((int)(height*0.2),height);
g.setColor(getColor(alpha));
g.drawLine(x1, y1, x2, y2);
}
}
/**
* 由隨機(jī)產(chǎn)生的方塊來作為干擾背景
*/
private void setSquareBackGround(Graphics g,int width,int height,int count){
// 隨機(jī)產(chǎn)生干擾線條
for (int i=0;i
int x1 =getIntRandom(0,(int)(width*0.3));
int y1 =getIntRandom(0,(int)(height*0.3));
int x2 =getIntRandom((int)(width*0.5),width);
int y2 =getIntRandom((int)(height*0.55),height);
g.setColor(getColor(100));
int w=x2-x1;
int h=y2-y1;
if(w<0) w=-w;
if(h<0) h=-h;
g.drawRect(x1, y1, w, h);
g.setColor(getColor(25));
g.fillRect(x1, y1, w, h);
}
}
private int getIntRandom(double start,double end)
{ if(end
{
double t=end;
end=start;
start=t;
}
double i=start+(int) (Math.random()*(end-start));
return (int)i;
}
上面的代碼呢寫的很詳細(xì)了,這里我就不重復(fù)了,這里的干擾線條是有很多寫法的,我這里就沒有全寫出來,有需要的話可以私聊我哦!
下面介紹第二種:
這種呢是我們開發(fā)中是可以用得到的,使用在的是網(wǎng)頁端的交互,我們?cè)诘卿浘W(wǎng)站的時(shí)候有很多的驗(yàn)證碼就可以用這個(gè)來寫了
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;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class inde
*/
@WebServlet("/inde")
public class inde extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public inde() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
/**動(dòng)態(tài)生成圖片驗(yàn)證碼
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//創(chuàng)建圖像
int width=100;
int height=40;
//圖片的大小設(shè)置
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//創(chuàng)建畫板
Graphics g=image.getGraphics();
setSquareBackGround(g,width,height,5);
//確定畫筆顏色
g.setColor(Color.black);
//填充矩形
g.fillRect(0, 0, width, height);
//在大矩形中放小矩形
g.setColor(Color.WHITE);
g.fillRect(1, 1, width-2, height-2);
//填充字符
String str = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789";
StringBuffer sb=new StringBuffer();
//隨機(jī)獲取4個(gè)字符
Random random=new Random();
for (int i = 0; i < 4; i++) {
//62個(gè)填充字符里面隨機(jī)的隨機(jī)的收取字符
int index=random.nextInt(62);
//截取一個(gè)字符
String st=str.substring(index, index+1);
//把字符放到圖片中去
g.setColor(Color.red);
//設(shè)置字體
g.setFont(new Font("宋體",Font.BOLD,30));
g.drawString(st, 20*i, 30);//防止4個(gè)字符在一起
sb.append(st);
}
//把StringBuffer中的驗(yàn)證碼放到session里面,目的是讓Login調(diào)用
HttpSession se=request.getSession();
se.setAttribute("number", sb.toString());
//發(fā)送圖片到瀏覽器 指定發(fā)送的圖片 和格式
response.setContentType("image/jpeg");
//圖片,圖片的格式,輸出的方式
ImageIO.write(image, "jpg", response.getOutputStream());
}
這樣就可以運(yùn)行了,當(dāng)然了我們可以在這里面加入第一種的干擾模塊給拿過來這樣就可以實(shí)現(xiàn)整體的一個(gè)效果了。
總結(jié)
以上所述是小編給大家介紹的Java動(dòng)態(tài)驗(yàn)證碼單線設(shè)計(jì)的兩種方法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
總結(jié)
以上是生活随笔為你收集整理的java校验码的设计_Java动态验证码单线设计的两种方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: word自带公式编辑_怎样在word20
- 下一篇: java 怎么向串口发送指令_idea