用image.jsp 的彩色验证出现" ... "的错误
使用servlet验证
pp.function.VerifyCodeServlet
package pp.function;
import java.io.*;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageOutputStream;
import javax.servlet.*;
import javax.servlet.http.*;
public class VerifyCodeServlet extends HttpServlet
{
private static final int IMAGE_WIDTH = 60;
private static final int IMAGE_HEIGHT = 20;
private static final int FONT_HEIGHT = 16;
private static final String SVG_SOURCE1 = "<!DOCTYPE svg PUBLIC /"-//W3C//DTD SVG 1.0//EN/" /"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd/">"
+ "<svg width=/""
+ IMAGE_WIDTH
+ "/" height=/""
+ IMAGE_HEIGHT
+ "/" xmlns=/"http://www.w3.org/2000/svg/">"
+ "<text x=/"0/" y=/""
+ IMAGE_HEIGHT
+ "/" font-family=/"Arial/" font-size=/""
+ IMAGE_HEIGHT + "/" fill=/"black/">";
private static final String SVG_SOURCE2 = "</text></svg>";
private boolean svgMode = false;
private PrintWriter out = null;
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException
{
//if (sn == null)
// return;
String vcode = sn2vcode();
arg0.getSession().setAttribute("rand",vcode) ;//代码内容写入session中
if (svgMode)
outSVG(vcode, arg1);
else
outJPEG(vcode, arg1);
}
private void outSVG(String vcode, HttpServletResponse resp) throws IOException
{
resp.setContentType("image/svg+xml");
resp.getOutputStream().print(SVG_SOURCE1 + vcode + SVG_SOURCE2);
}
private void outJPEG(String vcode, HttpServletResponse resp) throws IOException
{
resp.setContentType("image/jpeg");
BufferedImage image = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT,
BufferedImage.TYPE_INT_RGB);
Random random = new Random();
Graphics g = image.getGraphics();
//g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, IMAGE_WIDTH, IMAGE_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(IMAGE_WIDTH);
int y = random.nextInt(IMAGE_HEIGHT);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
for (int i = 1; i <= 4; i++)
{
String rand = vcode.substring(i - 1, i);
g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
g.drawString(rand, 13 * (i - 1) + 0, 16);
}
ImageWriter writer = (ImageWriter) ImageIO.getImageWritersByFormatName("jpeg").next();
JPEGImageWriteParam params = new JPEGImageWriteParam(null);
ImageOutputStream ios = ImageIO.createImageOutputStream(resp.getOutputStream());
writer.setOutput(ios);
writer.write(null, new IIOImage(image, null, null), params);
writer.dispose();
ios.close();
}
static String sn2vcode()
{
String sRand = "";
Random random = new Random();
for (int i=0;i<4;i++)
{
String rand=String.valueOf(random.nextInt(10));
sRand+=rand;
}
return sRand;
}
public void init() throws ServletException
{
try
{
GraphicsEnvironment.getLocalGraphicsEnvironment();
}
catch (Throwable e)
{
svgMode = true;
}
}
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);
}
}
web.xml中配置servlet
加入以下面两句话
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>VerifyCodeServlet</servlet-name>
<servlet-class>pp.function.VerifyCodeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>VerifyCodeServlet</servlet-name>
<url-pattern>/VerifyCodeServlet</url-pattern>
</servlet-mapping>
使用这个彩色验证 这个servlet就是一个随机图片, /VerifyCodeServlet
login.jsp
<%@ page language="java" contentType="text/html; charset=GB2312" import="java.sql.*"%>
<jsp:useBean id="db" class="com.pp.db.DBOperation"></jsp:useBean>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" type="text/css" href="../css/book.css">
<title>广告主登陆</title>
<script language="javascript">
function IsDigit(cCheck)
{
return (('0'<=cCheck) && (cCheck<='9'));
}
function IsAlpha(cCheck)
{
return ((('a'<=cCheck) && (cCheck<='z')) || (('A'<=cCheck) && (cCheck<='Z')))
}
function IsValid()
{
var strUsername = formadv.Username.value;
for (nIndex=0; nIndex<strUsername.length; nIndex++)
{
cCheck = strUsername.charAt(nIndex);
if (!(IsDigit(cCheck) || IsAlpha(cCheck)))
{
return false;
}
}
return true;
}
function docheck()
{
if(formadv.Username.value=="")
{
alert("请填写用户名");
return false;
}
else if(!IsValid())
{
alert("用户名只能使用字母和数字");
return false;
}
else if(formadv.Password.value=="")
{
alert("请填写密码");
return false;
}
else if(formadv.Rand.value=="")
{
alert("请填写验证码");
return false;
}
else
{
return true;
}
}
</script>
</head>
<body>
<form name="formadv" action="../advertiser/login_ad_do.jsp"" method="post" target="_self" onSubmit="return docheck()">
<TABLE>
<TR>
<TD>用户名:</TD>
<TD><INPUT TYPE="text" NAME="Username" SIZE=15>
</TD>
<TD>密码:</TD>
<TD><INPUT TYPE="password" NAME="Password" SIZE=15></TD>
<TD>验证码:</TD>
<TD><INPUT TYPE="text" NAME="Rand" SIZE=5> <img border=0 src="../VerifyCodeServlet"></TD>
<TD><INPUT TYPE="submit" value="提交" SIZE=15></TD>
<TD><INPUT TYPE="button" value="取消" SIZE=15></TD>
</TR>
</TABLE>
</form>
</body>
</html>
login_ad_do.jsp
<%@ page language="java" contentType="text/html; charset=GB2312" import="java.sql.*"%>
<jsp:useBean id="db" class="com.pp.db.DBOperation"></jsp:useBean>
<html>
<head>
</head>
<body>
<%
String Username=request.getParameter("Username");
String Password=request.getParameter("Password");
String Rand=request.getParameter("Rand");
String imgRand=(String)session.getAttribute("rand");
// System.out.println(Rand);
if(Rand.equals(imgRand)){
try{
db.creatConnection();
String sql="select * from AdsHost where Username='"+Username+"' and Password='"+Password+"'";
// String sql="select * from WebSiteHost where UserName='facepp' and Password=911";
//System.out.println(sql);
ResultSet rs=db.executeQuery(sql);
if(rs.next()){
String id=new Integer(rs.getInt("id")).toString();
session.setAttribute("Login","Yes");
session.setAttribute("Username",Username);
session.setAttribute("ID",id);//edit
response.sendRedirect("../advertiser/Admin_Main.jsp");
}
else{
// System.out.println("你错了呀");
}
// while(rs.next()){out.println(rs.getString(2));}
db.closeConnection();
rs.close();
}
catch(Exception e){System.out.println(e.toString());}
}
else{
out.print("你输入的验证码错误!");
out.println("<input type=button name=btn3 value=返回 onClick='window.history.go(-1)'> ");
}
%>
</body>
</html>