验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行提交操作的同时需要将图片上的字符同时提交,如果提交的字符与服务器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>255) fc=255;
if(bc>255) bc=255;
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", 0);
// 在内存中创建图象
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
//生成随机类
Random random = new Random();
// 设定背景色
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);
//设定字体
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
for (int i=0;i<155;i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}
// 取随机产生的认证码(4位数字)
String codeList = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
String sRand="";
for (int i=0;i<4;i++){
int a=random.nextInt(codeList.length()-1);
String rand=codeList.substring(a,a+1);
sRand+=rand;
// 将认证码显示到图象中
g.setColor(new Color(20+random.nextInt(110),20+random.next
本来验证码是为了对付大量的自动注册机、自动回贴机而出现的,这种技术一出现,那些自动化软件马上就没有了立足之地,但是有矛必有盾,为了破解验证码,验证码识别的技术也随之出现了,作为验证码的对立面,它对网络安全有没有促进作用呢?当然有。但是很多时候网页也会有不显示验证码是情况,遇到这种情况该怎么处理呢?我们来看看一下方案吧。。
针对
XP SP2
系统的解决办法
一、情况一:由与网速慢原因会造成页面打开慢进而影响验证码图片显示
处理方式:请稍后再试等待网络状态恢复正常,或稍后重新刷新。
二、情况二:由于使用的浏器不兼容产生不能显示验证码
处理方式:使用通用的浏览器如(IE、MYIE等)
三、安装
windows xp sp2
系统后某些网站后台验证码不能显示的问题
用户计算机安装了
windows XP SP2
系统后(包括最新的win2003sp1),在一些网站上在进行用户注册或后台管理登录需要输入验证码时,页面却无法显示验证码,(而在计算机升级为windows XP SP2)
以前却可以显示。其原因是大部分的验证码都是以图片形式出现的,且图片格试一般为.xbm,而Windows XP SP2操作系统在默认状态下是不支持该图片格式的,所以,无法显示验证码。解决办法
网页不显示验证码的原因与处理方法:
使用
开始->运行,在运行输入框中输入
“regsvr32 c:windowssystem32pngfilt.dll”(弹出框显示已成功,然后点击确定)
重开浏览器
OK!若是不行,请往下看:
具体解决方法描述
Windows XP
操作系统,安装了Service Pack 2正式版后,原来一些需要验证码(以图片形式显示的)的网站就登录不了,验证码不能正常显示。让
Windows XP再显示验证码的补丁其实就是个注册表文件,新建文本文档
内容:
Windows Registry Editor Version 5.00
(此处是一空行)
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InternetExplorer\Security]
"BlockXBM"=dword:00000000
将以上字符保存到文本编辑器(如Windows自带的“记事本”),存为“所有文件”,文件名扩展名为123.reg,导入到注册表即可生效。
重新启动电脑,使注册表生效,即可显示验证码。
为什么XP SP2会默认不显示验证码呢?原来微软公司在XP SP2里面默认不显示XBM图形格式。
X-Bitmap(XBM)是一种古老但通用的图像文件格式,它与现在的许多Web浏览器都兼容。X-Windows图形界面UNIX和Linux常用的GUI)的C代码库xlib中有一个组件专门描述了它的规范。XBM图形的实质上是使用16进制数组来表示二进制图像的C源代码文件。
针对
XP SP3
系统的解决办法
“开始”—“运行”—输入
" regsvr32 c:windowssystem32pngfilt.dll "(不包括双引号哦)
如果显示成功了那就对了
如果显示找不到输入点那就说明你的pngfilt.dll文件损坏了,去下一个pngfilt.dll到system32,再次输入regsvr32 c:windowssystem32pngfilt.dll确定。
文章出自:http://www.zhima365.com/shownews.php?id=369
在Android中实现异步任务机制有两种方式,Handler和AsyncTask。
Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。关于Handler的相关知识,前面也有所介绍,不清楚的朋友们可以参照一下。
为了简化操作,Android1.5提供了工具类android.os.AsyncTask,它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。
先来看看AsyncTask的定义:
public abstract class AsyncTask<Params, Progress, Result> {
三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用java.lang.Void类型代替。
一个异步任务的执行一般包括以下几个步骤:
1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。
2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。
3.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。
4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。
5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
在使用的时候,有几点需要格外注意:
1.异步任务的实例必须在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。
(以上内容转自:http://blog.csdn.net/liuhe688/article/details/6532519)
为了对该方法有更为深入的认识,下面以一个例子来说明。
该例子要实现的是进度条倒计时的功能。时长30s,随着时间的减少,进度条逐渐缩短,同时文本框中的剩余时间也相对应减少。
import android.os.AsyncTask; import android.widget.ProgressBar; import android.widget.TextView; class TestAsyncTask extends AsyncTask<String, Integer, String> { FullscreenActivity activity; TextView textView; ProgressBar bar; public TestAsyncTask(FullscreenActivity activity, TextView textView, ProgressBar bar ) { this.activity = activity; this.textView = textView; this.bar = bar; } //TestAsyncTask被后台线程执行后,被UI线程被调用,一般用于初始化界面控件,如进度条 @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); } //doInBackground执行完后由UI线程调用,用于更新界面操作 @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub //textView.setText(result); super.onPostExecute(result); } //在PreExcute执行后被启动AysncTask的后台线程调用,将结果返回给UI线程 @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub bar.setMax(300); int i = 30; while(true) { publishProgress((int)i); if(i == 0 ) break; try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } i--; } return null; } @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub bar.setProgress(values[0]*10); textView.setText("" + values[0] + " s"); super.onProgressUpdate(values); } }
在UI线程中:
new TestAsyncTask(FullscreenActivity.this, textView, bar).execute("");
以上采用了AsyncTask来实现异步更新进度条。能够不影响程序运行的基础上在后台不断更新前端UI。
该方法还可以用来显示处理进度、计时、载入进度等功能。