前端+servlet获得验证码图片

网页通过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处索引的值

	}

最终结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值