JSP生成验证码4个数字怎么搞高人指点,刚学习啊!
具体验证的时候怎么比较,请指点!
具体验证的时候怎么比较,请指点!
解决方案 »
- 关于myeclipse项目上的标志问题。
- iText生成PDF的问题求教
- 请教下用XP SP3和SQL2005如何配置本机运行的JSP网站服务器(将现有的2003网站服务器移植过来)?
- [c3p0] Exceptions occurred while trying to close a PooledConnection's resources
- struts做的查询功能出现错误
- 一台静态IP的电脑,用TOMCAT怎样实现输入我的IP即可访问指定的应用而不是TOMCAT的root
- struts2+spring2+hibernate2 启动 tomcat报错
- 散分过5.1前5名
- 问个和HttpUnit里的WebRequest有关的问题。请熟悉它的大虾进来指点一下。谢谢!Up有分!
- servlet中的参数怎么传给javascript?(有代码)谢谢!
- 求助:Cannot find bean in scope request
- ECLIPSE不能正常启动TOMCAT
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));//画边框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);// 随机产生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 sRand="";
for (int i=0;i<4;i++){
String rand=String.valueOf(random.nextInt(10));
sRand+=rand;
// 将认证码显示到图象中
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand,13*i+6,16);
}// 将认证码存入SESSION
session.setAttribute("rand",sRand);
System.out.println(sRand);
// 图象生效
g.dispose();// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
%>
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page pageEncoding="gb2312"%><html>
<head>
<LINK href=site.css rel=stylesheet>
<title></title>
<script language="JavaScript">
<!--if (self != top) top.location.href = window.location.href//-->
</script><script language=javascript>
function CheckFormUserLogin()
{
if(document.UserLogin.UserName.value=="")
{
alert("请输入用户名!");
document.UserLogin.UserName.focus();
return false;
}
if(document.UserLogin.Passwd.value == "")
{
alert("请输入密码!");
document.UserLogin.Passwd.focus();
return false;
}
if(document.UserLogin.verifycode.value == "")
{
alert("请输入验证码!");
document.UserLogin.verifycode.focus();
return false;
}
}
</script><style type="text/css">
<!--
.style1 {
font-size: 10.5pt;
font-weight: bold;
}
-->
</style>
</head>
<body bgcolor="#CCCCCC" background="IMAGES/linebg1.gif" topmargin="0" marginheight="0">
<br>
<table width="760" border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="80"> </td>
</tr>
</table>
<p> </p>
<form method="POST" action="ChkLogin.asp" name="UserLogin" onSubmit="return CheckFormUserLogin();">
<table width="750" border="0" align=center cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
<tr>
<td height="67" colspan="2" align="center"><font color="#000000"> <p> </font></td>
</tr>
<tr>
<td height="37" colspan="2" align="center"><span class="style1"><font color=red>用 户 登 录</font></span></td>
</tr>
<tr>
<td width="273" height="176">
</td>
<td width="477" height="176" background="IMAGES/admin_4.gif"><table width="350" border="0" align="center" cellpadding="6">
<tr>
<td>用户名:
<input name="UserName" size="15" font face="宋体" style="font-size: 9pt; background-color:#EAEAF4"> </td>
</tr>
<tr>
<td>密 码:
<input type="password" name="Passwd" size="15" font face="宋体" style="font-size: 9pt; background-color:#EAEAF4"> </td>
</tr>
<tr>
<td>验证码:
<input type="text" name="verifycode" size="15" font face="宋体" style="font-size: 9pt; background-color:#EAEAF4">
<b><span><font color=#000000></font></span></b> </td>
</tr>
<tr>
<td>
<p>
<input type="submit" name="Submit" value="确定" style="font-size: 9pt; color: #000000; background-color: #EAEAF4; solid #EAEAF4" onMouseOver ="this.style.backgroundColor='#ffffff'" onMouseOut ="this.style.backgroundColor='#EAEAF4'" title="确定">
<input type="reset" name="Submit2" value="重输" style="font-size: 9pt; color: #000000; background-color: #EAEAF4; solid #EAEAF4" onMouseOver ="this.style.backgroundColor='#ffffff'" onMouseOut ="this.style.backgroundColor='#EAEAF4'" title="重输">
</p></td>
</tr>
</table></td>
</tr>
</table>
</form>
</body>
</html>
楼上的楼上的你写的哪个放到那里能运行啊??????????
<jsp:include .........
</iframe>
这个可以。但是哪个值怎么传到我的login.jsp页面啊????
帮我解决啊!55555555555555555
楼上的那个代码可以直接用,在定义一个。jsp 文件就可以
不过在验证的文件里要调用产生验证码的name对应的值,
在验证的文件里做个判断就可以了]
可以这样写:
String rand = (String)session.getAttribute("rand");
String input = request.getParameter("rand");if (rand.equals(input)) {
;
}
else {
throw new Exception("验证码输入有误!");
}
</iframe>
这个可以。但是哪个验证码怎么传到我的login.jsp页面啊????
在login.jsp页面我得不到哪个验证码没办法比较啊。请指点。
2006-7-3 9:43:23 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:606)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:195)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:124)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:117)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:191)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:115)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75)
at org.apache.jsp.image_jsp._jspService(org.apache.jsp.image_jsp:127)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:868)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
怎么回事啊!
进来不行阿....
<td>验证码:</td>
<td width="30%">
<input name="CheckCode" type="text" id="CheckCode" size="8" maxlength="4" style="height:18px;" />
</td>
<td width="37%">
<img src="image.jsp" border="0" align="absmiddle" />
</td>
</tr>
这样写很困难么?我晕,为啥还要放到iframe里?
<form name="myform" method="post" action="">
<tr><td valign="bottom" align="right">
<input type="text" name="checkcode" /></td>
<td width="37%" valign="middle">
<img src="code.jsp" border="0" align="absmiddle" />
</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="Submit" value="提交" /><%=session.getAttribute("rand")%></td>
</tr>
</form>
</table>...这里取到的session和图片显示的不对阿?慢一拍..晕
楼上的怎么解决啊,大家都帮忙看下啊?
<form name="myform" method="post" action="">
<tr><td valign="bottom" align="right">
<input type="text" name="checkcode" /></td>
<td width="37%" valign="middle">
<img src="code.jsp" border="0" align="absmiddle" />
</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="Submit" value="提交" /><%=session.getAttribute("rand")%></td>
</tr>
</form>
</table>...这里取到的session和图片显示的不对阿?慢一拍..晕
不是啊楼上已经该成这个拉,不过...这里取到的session和图片显示的不对阿?慢一拍..晕
楼上的怎么解决啊,大家都帮忙看下啊?
session.setAttribute("rand",sRand);
System.out.println(sRand);
// 图象生效在这个千面你们把 sRand值输出来看看是不是慢一拍??如果是就说明!sRand还没生成图片也就是没有任何验证码就把空验证码放到会话里你们说是不是有问题??将上面的放到这个后面就不会慢一拍了
ImageIO.write(image, "JPEG", response.getOutputStream());
{
public String sRand = "";
public 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);
}
public BufferedImage creatImage()
{
// 在内存中创建图象
int width = 62, 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));
// 画边框
// g.setColor(new Color());
// g.drawRect(0,0,width-1,height-1);
// 随机产生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 rand = request.getParameter("rand");
// rand = rand.substring(0,rand.indexOf("."));
sRand="";
for (int i = 0; i < 4; i++)
{
String rand = String.valueOf(random.nextInt(10));
//String rand =RandomStringUtils.random(1,true,true);
// 将认证码显示到图象中
g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110))); //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand, 13 * i + 6, 16);
//g.drawString(rand, 6, 16);
sRand =sRand+rand;
}
// 图象生效
g.dispose();
return image;
} /**
* @return
*/
public String getSRand()
{
return sRand;
}
}Img.jsp
<%@ page contentType="image/jpeg" import="javax.imageio.*" %>
<jsp:useBean id="image" scope="request" class="com.YzImage"/>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);// 输出图象到页面
out.clear();
ImageIO.write(image.creatImage(), "JPEG", response.getOutputStream());
// 将认证码存入SESSION
session.setAttribute("rand",image.sRand);
System.out.println("=************************="+image.getSRand());
%>
在任何需要用验证码的地方调用。。路径俺你的实际情况修改?
<img src=Img.jsp>
在处理页面Rand是验证码的文本表单名字
String rand= request.getParameter("Rand");
if (rand.equals(session.getAttribute("rand").toString()))//判断用户输入的验证码和会话里面的验证码是否一样
{成功后操作~!
}
}else
{
session.setAttribute("rand", ""); //不成功 清空验证码
session.setAttribute("LOGIN_MSG", "验证码不正确!请填写正确的验证码!");//返回错误信息
return new ActionForward(mapping.findForward("fault").getPath(), true);//返回错误页面
}
<jsp:useBean id="image" scope="request" class="com.YzImage"/>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);// 输出图象到页面
out.clear();
ImageIO.write(image.creatImage(), "JPEG", response.getOutputStream());
// 将认证码存入SESSION
session.setAttribute("rand",image.sRand);
System.out.println("=************************="+image.getSRand());
%>很多慢一拍的就是把 session.setAttribute("rand",image.sRand);放到了ImageIO.write(image.creatImage(), "JPEG", response.getOutputStream());前面!能看懂代码就明白原理。。
不是这样的,按你说的做还是老样子。你自己看看是不是。
慢一拍就说明代码延缓执行了。什么原因会延缓执行? 你可以分别把 rand的值在 ImageIO.write前后分别输出到控制台看看到底那个会有值。。
ImageIO.write(image, "JPEG", response.getOutputStream());
// 将认证码存入SESSION
session.setAttribute("rand",sRand);
System.out.println(sRand);
// 图象生效
已经该成这样了在页面上还是慢,这样字验证码永远也填不对啊。
<form name="myform" method="post" action="">
<tr><td valign="bottom" align="right">
<input type="text" name="checkcode" /></td>
<td width="37%" valign="middle">
<img src="code.jsp" border="0" align="absmiddle" />><%=session.getAttribute("rand")%>
</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="Submit" value="提交" /</td>
</tr>
</form>
</table>
当页面第一次近来时code.jsp还没执行结果是: 空白 null
刷新一次后才是 0900 3855
再刷新一次是 0221 0900
2254 0221
是这样的啊
System.out.println(sRand);这个地方输出的数字是不是和 页面显示一样,如果显示一样就正确
不要在代码里面用这个就<%=session.getAttribute("rand")%>认为他慢一拍。。<%=session.getAttribute("rand")%>这一句执行完了, 你的输出图片的那个还在执行了
<tr>
<td>用户名:
<input name="UserName" size="15" font face="宋体" style="font-size: 9pt; background-color:#EAEAF4"> </td>
</tr>
<tr>
<td>密 码:
<input type="password" name="Passwd" size="15" font face="宋体" style="font-size: 9pt; background-color:#EAEAF4"> </td>
</tr>
<tr>
<td>验证码:
<input type="text" name="verifycode" size="15" font face="宋体" style="font-size: 9pt; background-color:#EAEAF4">
<img src="yanzheng.jsp" border="0" align="middle"/>
<%=session.getAttribute("rand")%>
</td>
</tr>
<tr>
<td>
<p>
<input type="submit" name="Submit" value="确定" style="font-size: 9pt; color: #000000; background-color: #EAEAF4; solid #EAEAF4" onMouseOver ="this.style.backgroundColor='#ffffff'" onMouseOut ="this.style.backgroundColor='#EAEAF4'" title="确定">
<input type="reset" name="Submit2" value="重输" style="font-size: 9pt; color: #000000; background-color: #EAEAF4; solid #EAEAF4" onMouseOver ="this.style.backgroundColor='#ffffff'" onMouseOut ="this.style.backgroundColor='#EAEAF4'" title="重输">
</p></td>
</tr>
</table>
这个是我的怎么就不对啊
<%=session.getAttribute("rand")%>这要这干吗。。这个绝对是取得的上一次的值!
yanzheng.jsp这个里面的代码了
image.jsp-------------------生成随即验证码图片的jsp页面
代码如下:
<%@ 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);
}
%>
<%
out.clear();//这句针对resin服务器,如果是tomacat可以不要这句
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));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);
}
String sRand="";
for (int i=0;i<4;i++){
String rand=String.valueOf(random.nextInt(10));
sRand+=rand;g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
g.drawString(rand,13*i+6,16);
}// 将认证码存入SESSION
session.setAttribute("rand",sRand);g.dispose();ImageIO.write(image, "JPEG", response.getOutputStream());
%>login.jsp--------------------登录页面,在这里我是提供输入验证码然后提交进行验证
代码如下:
<%@ page language="java" import="java.sql.*" errorPage="" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>用户登录</title>
<script language="javascript">
function loadimage(){
document.getElementById("randImage").src = "image.jsp?"+Math.random();
}
</script>
</head><body><table width="256" border="0" cellpadding="0" cellspacing="0">
<!--DWLayoutTable-->
<form action="validate.jsp" method="post" name="loginForm">
<tr>
<td width="118" height="22" valign="middle" align="center"><input type="text" name="rand" size="15"></td>
<td width="138" valign="middle" align="center"><img alt="code..." name="randImage" id="randImage" src="image.jsp" width="60" height="20" border="1" align="absmiddle"></td>
</tr>
<tr>
<td height="36" colspan="2" align="center" valign="middle"><a href="javascript:loadimage();"><font class=pt95>看不清点我</font></a></td>
</tr>
<tr>
<td height="36" colspan="2" align="center" valign="middle"><input type="submit" name="login" value="提交"></td>
</tr>
</form>
</table>
</body>
</html>validate.jsp-------------用来验证输入的验证码是否正确
代码如下:
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<%
String rand = (String)session.getAttribute("rand");
String input = request.getParameter("rand");
if(rand.equals(input)){
out.print("<script>alert('验证通过!');</script>");
} else{
out.print("<script>alert('请输入正确的验证码!');location.href='login.jsp';</script>");
}
%>以上这三个jsp页面放在和WEB-INF相同的目录下,如果你放在不同的文件夹下,那么里面相关页面的路径你就要自己改了。
我的MSN是 [email protected]