验证码图片不能正常显示的一个原因
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
验证码技术的实现按如下步骤:
1、设计一个验证码生成类RandomImageGenerator.java
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.ImageIO;
public class RandomImageGenerator {
final static int LENGTH=4;
static Color
colors[]={Color.red,Color.black,Color.blue,Color.pink,Color.cyan};
public static String random() {//创建一个4位的验证码
字符串
String
str="1234567890ABCDEFGHIJKLMNOPORSTUVWXYZabcefghijklmnopqrstuvwxyz",r and="";
java.util.Random random=new java.util.Random();
for(int i=0;i<LENGTH;i++) {
int
index=random.nextInt(str.length());
rand+=str.substring(index,index+1);
}
return rand;
}
public static void render(String num,OutputStream out) throws IOException {//创建一幅含有验证码的干扰图象,送输出流
if (num.length()!=LENGTH)
throw new IllegalArgumentException("
验证码长度不足");
int height=30;
int width=(height-10)*LENGTH;
BufferedImage bi=new
BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics2D g=(Graphics2D)bi.getGraphics();
java.util.Random random=new java.util.Random();
g.setColor(Color.white);
g.fillRect(0,0,width,height);
Font mFont=new Font("宋体
",Font.BOLD+Font.ITALIC,height-5);
g.setFont(mFont);
FontMetrics fm=g.getFontMetrics();
//画干扰点
for(int i=0;i<200;i++) {
int x=random.nextInt(width);
int y=random.nextInt(height);
Color color1=new
Color(random.nextInt(255),random.nextInt(255),random.nextInt(255));
g.setColor(color1);
g.drawOval(x,y,0,0);
}
//画干扰线
for(int i=0;i<5;i++) {
int x=0;
int y=random.nextInt(height);
int x1=width;
int y1=random.nextInt(height);
Color color1=new
Color(random.nextInt(255),random.nextInt(255),random.nextInt(255));
g.setColor(color1);
g.drawLine(x,y,x1,y1);
}
//显示验证码字符
char str[]=num.toCharArray();
for(int i=0,x=0,y=0;i<str.length;i++) {
y=height-fm.getDescent();
if (i%2==0){
y-=10;
}
g.setColor(colors[random.nextInt(color s.length)]);
g.drawChars(str,i,1,x,y);
x+=fm.charWidth(str[i])+5;
}
g.dispose();
ImageIO.write(bi,"jpg",out);
}
}
2.使用Servlet程序来实现验证码
在页面中使用这个Servlet程序,显示验证码图案。
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class RandomImageServlet extends HttpServlet {
public final static String
RANDOM_LOGIN_KEY="RANDOM_LOGIN_KEY";
public void init() throws ServletException {
System.setProperty("java.awt.headless","true" );//设置一个系统属性
}
public String getRandomLoginKey(HttpServletRequest request){
return
(String)request.getSession().getAttribute(RANDOM_LOGIN_KEY);
}
protected void doGet(HttpServletRequest
request,HttpServletResponse response)
throws
ServletException,IOException {
HttpSession session=request.getSession();
if (session!=null){
String
randomString=RandomImageGenerator.random();//得到一个6位的验证码字符串
session.setAttribute(RANDOM_LOGIN_KEY , randomString);//验证码保存到session中
response.setContentType("image/jpeg") ;//设置响应类型为jpeg类型
response.setHeader("Pragma","No-cache ");//设置响应不采用缓冲
response.setHeader("Cache-Control","n o-cache");//设置响应不采用缓冲
response.setDateHeader("Expires", 0);//设置响应不采用缓冲
RandomImageGenerator.render(randomStr ing,response.getOutputStream());
}
}
protected void doPost(HttpServletRequest
request,HttpServletResponse
response) throws ServletException,IOException {
doGet(request,response);
}
}
在WEB-INF/web.xml中配置这个Servlet程序:
<servlet>
<servlet-name>image</servlet-name>
<servlet-class>ch17.RandomImageServlet</servlet-class >
</servlet>
<servlet-mapping>
<servlet-name>image</servlet-name>
<url-pattern>/verifyCode.jsp</url-pattern>
</servlet-mapping>
3.JSP页面实现testRandom.jsp
<script type="text/javascript" language="javascript">
function Check() {
if (document.register.random.value==""){
window.alert("请填写验证码!");
document.register.random.focus();
return false;
}
document.register.submit();
}
function reloadImage(url){
document.register.img1.src = url;
}
</script>
<form name="register" method="post" action="">
<table cellpadding="0" cellspacing="0">
<tr>
<td><div align="right" class="style2"><strong>验证码</strong></div></td>
<td><div align="center"><input name="random" type="text" id="random"></div></td>
<td><img name="img1" src="./verifycode.jsp" width="100" height="20" border="1" align="absmiddle">
<a
href="JavaScript:reloadImage('./verifyCode.jsp');"><font size="2">看不清楚,换一张</font></a></td>
</tr>
<tr><td></td><td></td><td>
<input type="button" name="Submit" value="登录" onclick="Check()">
<td></tr>
</table>
</form>
在Eclipse按上述步骤完成后,点击“运行”,界面上验证码图标总是显示不出来,出现一把叉,究竟是什么原因,在网上查找了很久,大多数都说是要下载类似flash插件,或者是Cookie禁用等方法,我按网上的方法改来改去,最后都是不行,最后我把web.xml里的配置一个一个重新加进去,发现,竟然是在。