Java web图片验证功能实现二

上一篇实现的是最简单的图片验证,本文要实现复杂一点的:图片是旋转的,并通过一个注册实例把图片验证嵌套在网页中

    实现图片旋转功能的代码为:

//写字母
		String content = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcedfghijklmnopqrstuvwxyz1234567890";
		Random random = new Random();
		Graphics2D graphics2D = (Graphics2D)graphics;
		//设置字体颜色
		graphics2D.setColor(Color.red);
		//设置字体及大小
		graphics2D.setFont(new Font("宋体", Font.BOLD, 20));
		int x=20;
		int y=20;
		for(int i = 0; i < 4; i++)
		{
			int index = random.nextInt(content.length());
			char letter = content.charAt(index);

			double jiaodu = random.nextInt(60)-30;
			double theta = jiaodu/360*2*Math.PI;
			graphics2D.rotate(theta, x, y);
			graphics2D.drawString(letter+" ", x, y);
			graphics2D.rotate(-theta, x, y);

			x = x+20;		

		}

实现带旋转图片验证功能的servlet代码为:

package com.lsgjzhuwei.servlet.response;

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;

/**
 * Servlet implementation class VerificationCode
 */
@WebServlet(asyncSupported = true, urlPatterns = { "/VerificationCode" })
public class VerificationCode extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public VerificationCode() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub

		int width = 120;
		int height = 30;

		//创建一张内存中的缓存图片
		BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

		///背景色
		//通过graphics绘制图像
		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);

		//写字母
		String content = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcedfghijklmnopqrstuvwxyz1234567890";
		Random random = new Random();
		Graphics2D graphics2D = (Graphics2D)graphics;
		//设置字体颜色
		graphics2D.setColor(Color.red);
		//设置字体及大小
		graphics2D.setFont(new Font("宋体", Font.BOLD, 20));
		int x=20;
		int y=20;
		for(int i = 0; i < 4; i++)
		{
			int index = random.nextInt(content.length());
			char letter = content.charAt(index);

			double jiaodu = random.nextInt(60)-30;
			double theta = jiaodu/360*2*Math.PI;
			graphics2D.rotate(theta, x, y);
			graphics2D.drawString(letter+" ", x, y);
			graphics2D.rotate(-theta, x, y);

			x = x+20;		

		}

		//绘制干扰线
		int x1;
		int x2;
		int y1;
		int y2;
		graphics.setColor(Color.LIGHT_GRAY);
		for(int i = 0;i <50;i++)
		{
			x1=random.nextInt(width);
			x2=random.nextInt(width);
			y1=random.nextInt(height);
			y2=random.nextInt(height);
			graphics.drawLine(x1, y1, x2, y2);
		}

		//将图片输出到浏览器
		//将内存的图片通过浏览器输出流输出成jpg图片
		ImageIO.write(bufferedImage, "jpg", response.getOutputStream());

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}

下面是新建HTML页面,并添加简单的注册按钮,源码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form>
	输入用户名<input type="text"/><br/>
	请输入密码<input type="password"/><br/>
	请输入验证码<input type="text" name ="checkcode">
	<img src="/day06/VerificationCode"/> <br/>
	<input type="submit" value="注册"/>
</form>
</body>
</html>

系统运行界面如下:

下面实现复杂点的功能:单击图片验证码的时候验证码刷新

修改HTML页面代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript">
function change()
{
	//alert("1");
	//重新加载生成图片
	document.getElementById("myimg").src="/day06/VerificationCode?"+new Date().getTime();
	//alert(document.getElementById("myimg").src);
}
</script>
<title>Insert title here</title>
</head>
<body>
<form>
	输入用户名<input type="text"/><br/>
	请输入密码<input type="password"/><br/>
	请输入验证码<input type="text" name ="checkcode">
	<img src="/day06/VerificationCode" onclick="change()" id="myimg" style="cursor:pointer"/> <br/>
	<input type="submit" value="注册"/>
</form>
</body>
</html>
时间: 2024-09-07 16:28:25

Java web图片验证功能实现二的相关文章

Java实现验证码验证功能

Java如何实现验证码验证功能呢?日常生活中,验证码随处可见,他可以在一定程度上保护账号安全,那么他是怎么实现的呢? Java实现验证码验证功能其实非常简单:用到了一个Graphics类在画板上绘制字母,随机选取一定数量的字母随机生成,然后在画板上随机生成几条干扰线. 首先,写一个验证码生成帮助类,用来绘制随机字母: import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.ima

Java web过滤器验证登录防止未登录进入界面_java

今天用ssh2写了个简单的系统,发现了一个问题,我这系统必须先登录成功才能进入主页,但我在浏览器里直接输入主页地址,发现也能进入,这个肯定不好,毫无安全性可言,后经查资料发现需要登录过滤器,就试了下,发现果然可以避免未经登录即可进入主页的危险,下面是我整理出的详细步骤: 1.首先写一个权限过滤filter类,实现Filter接口 import java.io.IOException; import javax.servlet.Filter; import javax.servlet.Filter

Java实现图片对比功能_java

之前用按键精灵写过一些游戏辅助,里面有个函数叫FindPic,就上在屏幕范围查找给定的一张图片,返回查找到的坐标位置. 现在,Java来实现这个函数类似的功能. 算法描述: 屏幕截图,得到图A,(查找的目标图片为图B): 遍历图A的像素点,根据图B的尺寸,得到图B四个角映射到图A上的四个点: 得到的四个点与图B的四个角像素点的值比较.如果四个点一样,执行步骤4:否则,回到步骤2继续: 进一步对比,将映射范围内的全部点与图B全部的点比较.如果全部一样,则说明图片已找到:否则,回到步骤2继续: 这里

Java Web技术经验总结(二)

该系列的第一篇在此:Java Web技术经验总结一,主要包含我在日常工作中的经验和心得体会(如有不足之处欢迎指出). Maven的使用经验 依赖的scope有test.provided.compile等.test:一般是单元测试场景使用,在编译环境加入classpath,但打包时不会加入,如junit等:provided:表示容器或者JDK已经提供该依赖,打包时不需要打包入war:compile:默认范围,在工程环境的classpath(编译环境)和打包(如果是WAR包,会包含在WAR包中)时候

java web图片上传和文件上传实例_java

图片上传和文件上传本质上是一样的,图片本身也是文件.文件上传就是将图片上传到服务器,方式虽然有很多,但底层的实现都是文件的读写操作. 注意事项 1.form表单一定要写属性enctype="multipart/form-data" 2.为了能保证文件能上传成功file控件的name属性值要和你提交的控制层变量名一致, 例如空间名是file那么你要在后台这样定义 private File file; //file控件名 private String fileContentType;//图

java web项目 下载功能 浏览器无显示

问题描述 publicStringxiaz()throwsException{Filefile=newFile("E://in.txt");response.reset();response.setCharacterEncoding("utf-8");response.setContentType("multipart/form-data");StringdownloadFileName="in.txt";response.s

java web激活邮箱并找回密码_java

几乎每个网站或论坛之类的用户注册后都需要通过发送邮件到邮箱激活用户,如何激活邮箱呐? 设计激活步骤: 1.发送激活操作链接地址至用户邮箱. 2.用户至邮箱查收邮件. 3.用户点击链接,跳转至成功页面(修改激活状态),激活成功. 实现: /** * 发送邮件 * * @param request * @return */ @RequestMapping(value = "/sendEmail.jhtml") @ResponseBody public String sendEmail(Ht

sql 2005+eclipse 实现登录验证功能

问题描述 importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.sql.*;importsun.jdbc.odbc.JdbcOdebcDriver;publicclassSqlApplication{publicstaticvoidmain(Stringargs[])throwsIOException{StringinputUserid,inputPwd;

java 实现比较版本号功能_java

涉及到客户端的系统中经常需要用到比较版本号的功能,但是比较版本号又不能完全按照字符串比较的方式去用compareTo之类的方法: 这就需要我们总结版本号的通用规则,设计一个比较算法并封装成通用方法来使用: 通常版本号如:1.3.20.8,6.82.20160101,8.5a/8.5c等: 通用规则就是,先将版本字符串按照点号分割,然后主版本与主版本比较.此版本与此版本比较,如此按序一级一级往后比较,直到有分出大小: 值得注意的是,很多比较版本号的方法都先将字符串转换成int或者double类型,