网页通过servlet获得验证码图片,并且可以点击更新
jsp中
<img src="/MYSystem/servlet/ImageServlet" onClick="refresh(this);" />
<script>
function refresh(obj){
obj.src="/MYSystem/servlet/ImageServlet?"+Math.random();
}
</script>
注意:必须要有Math.random()才能点击刷新,不然浏览器认为图片地址没有发生改变,图片不会刷新。
public void doGet(HttpServletRequest req,HttpServletResponse res)throws IOException,ServletException{
res.setContentType("image/jpeg");//设置响应类型,告诉浏览器输出的内容为图片
res.setHeader("Pragma","No-cache");//设置响应头信息,告诉浏览器不要缓存此内容 字段名 字段值
res.setHeader("Cache-Control","nocache");
res.setDateHeader("Expire",0);
RandomValidate validate=new RandomValidate();
try{
validate.getRandom(req,res);//输出图片
}
catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res)throws IOException,ServletException{
doGet(req,res);
}
RandomValidate类
public static final String RANDOMCODEKEY="codekey";//sessionID
private Random random=new Random();//random对象
private String randString="123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private int width=80;//图片宽
private int height=25;//图片高
private int lineSize=40;//干扰线数量
private int stringNum=4;//随机字符数量
/*
*获得字体
*/
private Font getFont(){
return new Font("Fixedsys",Font.CENTER_BASELINE,18);//字的特征
}
/*
*生成随机图片
*/
public void getRandom(HttpServletRequest req,HttpServletResponse res){
HttpSession session=req.getSession();
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
Graphics g=image.getGraphics();//产生BUfferedImage的对象Graphics对象,该对象可以在图片上进行绘制操作
g.fillRect(0,0,width,height);//矩形的 坐标 及 长 宽
g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18));
g.setColor(new Color(118,36,48));//随机颜色
//绘制干扰线
for(int i=0;i<=lineSize;i++){
draw(g);
}
//绘制随机字符
String randomString= "";//注意前面必须要有空格
for(int i=1;i<=stringNum;i++){
randomString=drawS(g,randomString,i);
}
session.setAttribute(RANDOMCODEKEY, randomString);//randomString 是获得的验证码字符串
g.dispose();//释放资源
try{
ImageIO.write(image, "JPEG", res.getOutputStream());//将内存中的图片通过流的形式输到客户端
}catch(Exception e){
e.printStackTrace();
}
}
//绘制字符串
private String drawS(Graphics g,String randomString,int i){
g.setFont(getFont());//重获得验证码字符的字体
g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));//重获随机颜色
String rand=String.valueOf(getRandom(random.nextInt(randString.length())));//从字符串的长度里随机获得字符串
randString+=rand;
g.translate(random.nextInt(3),random.nextInt(3));//就是将random.nextInt(3) random.nextInt(3)变成原点
g.drawString(rand,13*i,16);
return randomString;
}
//绘制干扰线
private void draw(Graphics g){
int x=random.nextInt(width);
int y=random.nextInt(height);
int x1=random.nextInt(13);
int y1=random.nextInt(15);
g.drawLine(x,y,x+x1,y+y1);
}
//获得随机字符
private String getRandom(int num){
return String.valueOf(randString.charAt(num));//获得12345..xyz的随机字符串 注:char String.charAt(i)获得i处索引的值
}
最终结果