现在许多系统的注册 登录或者发布信息模块都添加的随机验证码功能 就是为了避免自动注册程序或者自动发布程序的使用
验证码实际上就是随机选择一些字符以图片的形式展现在页面上 如果进行提交 *** 作的同时需要将图片上的字符同时提交 如果提交的字符与服务器session保存的不同 则认为提交信息无效 为了避免自动程序分析解析图片 通常会在图片上随机生成一些干扰线或者将字符进行扭曲 增加自动识别验证码的难度
在这里 我们使用java实现验证码
<%@ page contentType= image/jpeg import= java awt * java awt image * java util * javax imageio * %>
<%!
Color getRandColor(int fc int bc){//给定范围获得随机颜色
Random random = new Random()
if(fc>) fc=
if(bc>) bc=
int r=fc+random nextInt(bc fc)
int g=fc+random nextInt(bc fc)
int b=fc+random nextInt(bc fc)
return new Color(r g b)
}
%>
<%
//设置页面不缓存
response setHeader( Pragma No cache )
response setHeader( Cache Control no cache )
response setDateHeader( Expires )
// 在内存中创建图象
int width= height=
BufferedImage image = new BufferedImage(width height BufferedImage TYPE_INT_RGB)
// 获取图形上下文
Graphics g = image getGraphics()
//生成随机类
Random random = new Random()
// 设定背景色
g setColor(getRandColor( ))
g fillRect( width height)
//设定字体
g setFont(new Font( Times New Roman Font PLAIN ))
// 随机产生 条干扰线 使图象中的认证码不易被其它程序探测到
g setColor(getRandColor( ))
for (int i= i<i++)
{
int x = random nextInt(width)
int y = random nextInt(height)
int xl = random nextInt( )
int yl = random nextInt( )
g drawLine(x y x+xl y+yl)
}
// 取随机产生的认证码( 位数字)
String codeList = ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
String sRand=
for (int i= i<i++){
int a=random nextInt(codeList length() )
String rand=codeList substring(a a+ )
sRand+=rand
// 将认证码显示到图象中
g setColor(new Color( +random nextInt( ) +random nextInt( ) +random nextInt( )))//调用函数出来的颜色相同 可能是因为种子太接近 所以只能直接生成
g drawString(rand *i+ )
}
// 将认证码存入SESSION
session setAttribute( rand sRand)
// 图象生效
g dispose()
// 输出图象到页面
ImageIO write(image JPEG response getOutputStream())
out clear()
out = pageContext pushBody()
lishixinzhi/Article/program/Java/hx/201311/25536
在刷票软件盛行的环境下,验证码的出现可以说大量减少了这些软件对网站的访问和恶意注册等现象的发生,但是有时候太严密的验证码设计会让用户也受到伤害,下面我们就一起来思考一下,验证码功能设计的意义。
思考一:不要将责任推卸给用户不知道你有没有想过,让用户辨别和输入扭曲的验证码,其实是因为服务提供方的能力欠缺,无法静默区分人和机器,而输入验证码本身,这一 *** 作对用户来说其实并无价值。
有一次我接到用户打来电话,抱怨自己搞不定验证码。
我向他解释我们正在被攻击,所以临时调高了验证码的级别。
电话的后,我习惯性地向他道歉,用户却很体贴地安慰我说没必要道歉,毕竟被攻击不是我们的错。
当时我心头一热,脸上一红。
他说的没错,被攻击确实不是我们的错,但更不是用户的错,让他们付出成本,花费时间,去辨别图片里的那个圆圈究竟是O还是0还是6,其实就是让他们承担我们本应该承担的责任。
举一反三,如果再激进一点考虑,我们的软件服务中还有不少推卸责任的设计,比如:让用户在成千上万的商品中筛选和比价,比如:各种复杂的界面参数设置和兴趣选择。
要是想得再发散一点,所有的银行账户密码似乎也没有必要,超市排队也是一样。
如果用户不需要付出筛选和比价的成本,或不需要花费精力记住账户密码,却可以享受到同样高质量的服务,是不是更好呢?基于这样的思考,我们是不是应该马上去掉这些推卸责任的设计,比如:想出更复杂的方案,替代现有的验证码机制呢?这是关于验证码的二个思考。
思考二:方案选择的平衡有效的设计确实未必是好设计,比如:我自己曾经参与设计的产品中也用到验证码,而且在某些特殊阶段(像刚才提到的被定向攻击),我们还会升级验证码机制,让验证码出现的频率更高,而且更加难以辨认,从而在某些关键入口抵抗一些有针对性的攻击。
这一策略是有效的,但对用户的伤害也很大,升级验证码机制后,用户登录过程中耗费的时间会显著增加,通过率也会下降,还有大量的用户抱怨一股脑地涌进来。
然而从服务提供方的角度来看,它却用低的成本快速地解决了当时面临的问题。
电脑培训http://www.kmbdqn.cn/认为这是产品设计方案选择过程中不得不做出的“平衡”,很多时候我们没有办法一时间实施对用户的完美方案,这就需要在产品利益和用户利益之间,找到微妙的动态平衡点。
原理:1.随机生成4个数字 用到了Random类
2.对这4个数字设置字体格式 用 setFont方法
3.改变字体颜色用setColor 然后随机生成颜色
代码如下
package s1
import java.awt.Color
import java.awt.Font
import java.awt.Graphics
import java.awt.image.BufferedImage
import java.io.IOException
import java.io.PrintWriter
import java.util.Random
import javax.imageio.ImageIO
import javax.jms.Session
import javax.servlet.ServletException
import javax.servlet.http.HttpServlet
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
import javax.servlet.http.HttpSession
public class GetImage extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response)
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 发送图片不能够添加这2行代码
// response.setContentType("text/htmlcharset=UTF-8")
//request.setCharacterEncoding("UTF-8")
int width=100
int height=50
//获得一张图片
BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)
Graphics g=image.getGraphics()
g.setColor(Color.WHITE)
g.fillRect(1, 1, width-2, height-2)
g.setFont(new Font("宋体",Font.BOLD,30))
Random random=new Random()
//填充的字符串
String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
//缓存生成的验证码
StringBuffer stringbuffer=new StringBuffer()
//随机生成验证码的颜色和字符
for(int i=0i<4i++)
{ //设置随机颜色
g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)))
int index=random.nextInt(62)//这里的62就是从填充字符段中随意选取一个位置
String str1=str.substring(index,index+1)
g.drawString(str1, 20*i, 30)//x,y数值设置太小会显示不出来
stringbuffer.append(str1)
}
//将生成的验证码存到服务器
request.getSession().setAttribute("checkcode", stringbuffer.toString())//key和value
//将图片发送给浏览器
ImageIO.write(image, "jpg", response.getOutputStream())
}
}
用户登录界面代码
package s1
import java.io.IOException
import java.io.PrintWriter
import javax.servlet.ServletException
import javax.servlet.http.HttpServlet
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
import javax.servlet.http.HttpSession
public class Login extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/htmlcharset=UTF-8")// 设置服务器发送给浏览器的编码方式
request.setCharacterEncoding("UTF-8")// 客户端向服务器提交的数据的解码方式
// 获得用户提交的数据
String checkcode = request.getParameter("checkcode")
System.out.println(checkcode)
// 判断输入的验证码是不是符合
HttpSession session = request.getSession()// session是存放数据的地方
String str = (String) session.getAttribute("checkcode")
if (str != null) {
if (checkcode.compareToIgnoreCase(str) == 0) // 验证码忽略大小写
response.getWriter().println("验证码输入正确")
else
response.getWriter().println("验证码输入错误")
}
else response.getWriter().println("验证码失效")
// 使用完的验证码信息要删除,返回原页面再输一次,验证码就失效了
session.removeAttribute("checkcode")
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)