jsp创建jsp实现验证码
在web开发领域⾥⾯,验证码是⼀个⽐较常见的功能,⽽归根到底,验证码其实就是⼀组随机数,或者是⼀个随机算术
⼀、基本知识
1、为什么需要验证码?
验证码,很多时候出现在注册页⾯或者登陆界⾯,在这些页⾯中有可能会出现恶意注册和暴⼒破解,这时候验证码可以有效防范这些攻击。所以,总的来说,验证码很多时候是为了防⽌不法分⼦对⽹站进⾏恶意的注册和攻击,是⼀种有效的拦截⼿段。
2、验证码的⼯作原理
⾸先,我们要明确⼀点就是,验证码实际是在服务器端产⽣的,因为如果在前端参数的话并不能有效拦截,因此很多时候,在拦截时我们都需要在服务器端进⾏相关操作,防⽌⿊客绕过前端验证直接⾮法访问。
验证码的⼯作原理其实⽅⼏个步骤:⾸先,服务端随机产⽣⼏个随机数或者随机算式,然后通过sessio
n对象将数据传输到客户端,客户端输⼊验证码,通过r表单将数据提交到服务器,服务器提取数据之后和产⽣的随机数字或者算式的结果对⽐,以此进⾏验证。
当然,很多时候,简单的验证码很容易被图像识别软件破解,所以现在很多时候更流⾏短信验证等⽅式,但是,⼀下讨论的均是简单的数字图⽚验证。
⼆、验证码的实现过程
1、⾸先,验证码其实就是在服务端产⽣⼀张带有验证码数字或者算式的图⽚,所以,在这个过程要⽤到gui知识,具体请先看⼀下代码
//1、验证码界⾯
//验证码的宽和⾼
int width = 70;
int height = 30;
/*
*图像缓冲对象(注意:在多次对某个对象操作时,为了提⾼效率,很多时候选择⽤缓冲对象来进⾏操作,
因为缓冲类的对象很多时候是可以即时改变对象的数据的)
*/
BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//创建图像操作对象,⽤于操作验证码图⽚对象
Graphics2D g = ateGraphics();
//创建字体对象⽅便操作图像字体的属性
Font font = new Font("Times New Roman",Font.PLAIN,18);
g.setFont(font);
//设置相关颜⾊等等
g.setColor(Color.BLACK);
g.drawRect(0,0,width-1,height-1);
g.setColor(Color.GRAY);
以上创建了⼀个基本的验证码图⽚,注意很多时候如果要反复对象对某个对象进⾏修改操作时(如某个字符串,需要反复进⾏拼接操作时,为提⾼性能,⼀般选择⽤缓冲类的对象进⾏操作之后再转换为相关对象)。以上是产⽣验证码的gui主要代码,具体的步骤不啰嗦了,请参考代码吧。
2、创建好相关的验证码图⽚界⾯之后,下⼀步就是产⽣随机数了,请先看以下代码:
//2、产⽣随机数
//定义⽣成随机数的对象
Random random = new Random();
//产⽣⼲扰线
for(int i=0;i<40;i++){
//设置40条⼲扰线
int x1 = Int(width);
int y1 = Int(height);
int x2 = Int(10);
int y2 = Int(10);
//将随机线条描绘到验证码对象中
g.drawLine(x1,y1,x1+x2,y1+y2);
}
//产⽣随机数
//定义随机数的个数
int length = 4
//定义变量存储随机数字变量
BufferedString str_random = new BufferedString();//定义成缓冲字符类型是为了提⾼效率
for(int i=0;i<length;i++){
int num_random = Int(10);
String str_num = String.valueOf(num_random);
g.drawString(str_num);
str_random.append(str_num);
}
以上主要通过Random随机数产⽣对象来产⽣随机数字,其中注意要在反复第String类型操作的时候,将其定义成BufferedString进⾏操作⽐较⾼效。具体的操作并没有涉及什么新技术,请查看代码。
3、完成产⽣随机数的步骤之后,剩下的就是将产⽣的随机数发送出去了。请看代码
//3、发送验证码图⽚数据
bufferedImg.flush();//刷新与图像缓冲有关的数据
g.dispose();//释放与Graphice2D有关的对象的资源
String randomCode = String();
session.setAttribute("randomCode",String());//通过session传递随机码给其他页⾯⽤于验证⾝份
ServletOutputStream outputStream = OutputStream();
ImageIO.write(bufferedImg,"jpeg",outputStream);
outputStream.close();
out.clear();
out=pageContext.pushBody();
以上的发送验证码也是⽐较简单,只是通过⽹络流进⾏发送操作,其中,注意Graphics2D的资源释放和IO流的关闭就好了。其中,将验证码通过session发送给其他页⾯使⽤。
三、总结
以上实现了简单的数字验证码功能,其中涉及到的技术主要是javaGUI、IO操作和servlet技术的session技术。类似的,实现算式的验证码也是类似的步骤,具体的就不多说,下⾯的代码是实现了简单的算式验证码的代码参考:
int width = 70,height = 22;
Parameter("width")!=null){
try{
width=Integer.Parameter("width"));
}catch(NumberFormatException e) {
}
}
BufferedImage bufferedImg = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics2D g = ateGraphics();
g.setColor(Color.WHITE);
g.fillRect(0,0,width,height);
Font font = new Font("Times New Roman",Font.PLAIN,18);
g.setFont(font);
g.setColor(Color.BLACK);
g.drawRect(0,0,width-1,height-1);
g.setColor(Color.GRAY);
Random random = new Random();//设置随机种⼦
for(int i=0;i<40;i++){
//设置40条⼲扰线
int x1 = Int(width);
int y1 = Int(height);
int x2 = Int(10);
int y2 = Int(10);
g.drawLine(x1,y1,x1+x2,y1+y2);
}
int length = 4;//设置默认⽣成四个长度的验证码
Parameter("length")!=null){
try{
length = Integer.Parameter("length"));
}catch(NumberFormatException e){
out.println("<script>alert('⽆法加载验证码,请重新操作!')</script");
e.printStackTrace();
}
}
//定义变量存储运算结果
int result = 0;
//定义⼀个int⽤于存储某个数字后⾯的运算符,1代表+,2代表-,初始化为0
int int_sign = 0;
for(int i = 0;i<length;i++){//获取随机数字字符串
int num_random = Int(10);
//根据符号标记标量int_sign进⾏相应的运算
if(int_sign==2){
result = result - num_random;
}else{
result = result + num_random;
}
String strRand = String.valueOf(num_random);
g.setColor(Color.RED);
g.drawString(strRand,13 * i + 6, 16);
//随机获取运算符号
if(i<length-1){
int sign_random = Int(2);
if(sign_random<1){
g.setColor(Color.GREEN);
g.drawString("+",13 * i + 12, 16);
int_sign = 1;
}else{
g.setColor(Color.BLUE);
g.drawString("-",13 * i + 12, 16);
int_sign = 2;
}
}else{
g.drawString("=?",13 * i + 12, 16);
}
}
bufferedImg.flush();
g.dispose();
session.setAttribute("randomCode",result);
response.setContentType("image/jpeg");
response.setHeader("Pragam","no-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
ServletOutputStream outputStream = OutputStream();
ImageIO.write(bufferedImg,"jpeg",outputStream);
outputStream.close();
out.clear();
out=pageContext.pushBody();
好了,验证码的总结就到此结束,有什么不⾜的地⽅请各位⼤神指正!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论