以下是我的代码,但是不知道为啥,出来的验证码背景颜色永远都是黑色,不知道和我用的是EE5标准有关系么?
private int w = 70;//验证码宽度
private int h = 35;//验证码高度
private Random r = new Random();//定义一个随机数对象
private String[] fontNames = {"宋体","黑体","微软雅黑","楷体"};//定义一个字符串数组存放字体种类
private String codes = "23456789qwertyuipasdfghjkzxcvbnmQWERTYUIPASDFGHJKZXCVBNM";//定义一个字符串存放验证码字符的取值范围
private Color bgColor = new Color(255, 255, 255);//定义一个白色背景
private String text;//定义一个字符串变量用来存放验证码的字符
//定义一个随机生成颜色的方法
private Color randomColor(){
int red = r.nextInt(150);
int green = r.nextInt(150);
int blue = r.nextInt(150);
return new Color(red, green, blue);
}
//定义一个随机生成字体的方法
private Font randomFont(){
int index = r.nextInt(fontNames.length);//从取值是字体字符串长度的范围中随机生成一个字符串下标
String fontName = fontNames[index];//通过得到的下标得到一个字体
int style = r.nextInt(4);//0-3是4种字体的样式,无样式、粗体、斜体、粗+斜
int size = r.nextInt(5)+24;//让字的大小在24-28之间
return new Font(fontName, style, size);//通过三个随机生成的参数创建一个字对象
}
//干扰线生成方法
private void drawLine(BufferedImage image){
int num = 3;//干扰线一共三条
Graphics2D g2 = (Graphics2D) image.getGraphics();//得到绘画环境,即画笔
for (int i = 0; i < num; i++) {
int x1 = r.nextInt(w);
int y1 = r.nextInt(h);
int x2 = r.nextInt(w);
int y2 = r.nextInt(h);
g2.setStroke(new BasicStroke(1.5F));
g2.setColor(Color.blue);
g2.drawLine(x1, y1, x2, y2);
}
}
//定义一个随机生成字符的方法
private char randomChar(){
int index = r.nextInt(codes.length());
return codes.charAt(index);
}
//定义一个生成图片缓冲区的方法
private BufferedImage createImage(){
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);//得到图片缓冲区为宽70px 高35px,图片类型为Int RGB
Graphics2D g2 = (Graphics2D) image.getGraphics();//拿起画笔
g2.setColor(this.bgColor);//画笔颜色为定义好的成员变量——背景色 白色
g2.drawRect(0, 0, w, h);//画一个坐标为(0,0)的W H 的矩形
return image;
}
//定义一个可被外界调用的生成验证码图片的方法
public BufferedImage getImage(){
BufferedImage image = createImage();//得到预先做好的画板
Graphics2D g2 = (Graphics2D) image.getGraphics();//再次拿起画笔
StringBuffer sb = new StringBuffer();//创建一个可变字符串对象
for (int i = 0; i < 4; i++) {//循环4次写四个字符
String s = randomChar()+"";//随机得到字符并转成字符串类型
sb.append(s);//把它添加到可变字符串SB末尾
float x = i*1.0F*w/4;//把X轴以FLOAT类型分成4份,一个字符一份
g2.setFont(randomFont());//随机生成字体
g2.setColor(randomColor());//随机生成颜色
g2.drawString(s, x, h-5);//把字写到画板上去
}
this.text = sb.toString();//把得到的4个字符转成String类型赋值给成员变量text
drawLine(image);//对image这个图片进行绘制3条干扰线的操作
return image;
}
//定义一个方法返回验证码中的文本
public String getText() {
return text;
}
//定义一个方法是将生成的验证码图片保存到本地
public static void outPut(BufferedImage image,OutputStream out) throws IOException {
ImageIO.write(image, "JPEG", out);
private int w = 70;//验证码宽度
private int h = 35;//验证码高度
private Random r = new Random();//定义一个随机数对象
private String[] fontNames = {"宋体","黑体","微软雅黑","楷体"};//定义一个字符串数组存放字体种类
private String codes = "23456789qwertyuipasdfghjkzxcvbnmQWERTYUIPASDFGHJKZXCVBNM";//定义一个字符串存放验证码字符的取值范围
private Color bgColor = new Color(255, 255, 255);//定义一个白色背景
private String text;//定义一个字符串变量用来存放验证码的字符
//定义一个随机生成颜色的方法
private Color randomColor(){
int red = r.nextInt(150);
int green = r.nextInt(150);
int blue = r.nextInt(150);
return new Color(red, green, blue);
}
//定义一个随机生成字体的方法
private Font randomFont(){
int index = r.nextInt(fontNames.length);//从取值是字体字符串长度的范围中随机生成一个字符串下标
String fontName = fontNames[index];//通过得到的下标得到一个字体
int style = r.nextInt(4);//0-3是4种字体的样式,无样式、粗体、斜体、粗+斜
int size = r.nextInt(5)+24;//让字的大小在24-28之间
return new Font(fontName, style, size);//通过三个随机生成的参数创建一个字对象
}
//干扰线生成方法
private void drawLine(BufferedImage image){
int num = 3;//干扰线一共三条
Graphics2D g2 = (Graphics2D) image.getGraphics();//得到绘画环境,即画笔
for (int i = 0; i < num; i++) {
int x1 = r.nextInt(w);
int y1 = r.nextInt(h);
int x2 = r.nextInt(w);
int y2 = r.nextInt(h);
g2.setStroke(new BasicStroke(1.5F));
g2.setColor(Color.blue);
g2.drawLine(x1, y1, x2, y2);
}
}
//定义一个随机生成字符的方法
private char randomChar(){
int index = r.nextInt(codes.length());
return codes.charAt(index);
}
//定义一个生成图片缓冲区的方法
private BufferedImage createImage(){
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);//得到图片缓冲区为宽70px 高35px,图片类型为Int RGB
Graphics2D g2 = (Graphics2D) image.getGraphics();//拿起画笔
g2.setColor(this.bgColor);//画笔颜色为定义好的成员变量——背景色 白色
g2.drawRect(0, 0, w, h);//画一个坐标为(0,0)的W H 的矩形
return image;
}
//定义一个可被外界调用的生成验证码图片的方法
public BufferedImage getImage(){
BufferedImage image = createImage();//得到预先做好的画板
Graphics2D g2 = (Graphics2D) image.getGraphics();//再次拿起画笔
StringBuffer sb = new StringBuffer();//创建一个可变字符串对象
for (int i = 0; i < 4; i++) {//循环4次写四个字符
String s = randomChar()+"";//随机得到字符并转成字符串类型
sb.append(s);//把它添加到可变字符串SB末尾
float x = i*1.0F*w/4;//把X轴以FLOAT类型分成4份,一个字符一份
g2.setFont(randomFont());//随机生成字体
g2.setColor(randomColor());//随机生成颜色
g2.drawString(s, x, h-5);//把字写到画板上去
}
this.text = sb.toString();//把得到的4个字符转成String类型赋值给成员变量text
drawLine(image);//对image这个图片进行绘制3条干扰线的操作
return image;
}
//定义一个方法返回验证码中的文本
public String getText() {
return text;
}
//定义一个方法是将生成的验证码图片保存到本地
public static void outPut(BufferedImage image,OutputStream out) throws IOException {
ImageIO.write(image, "JPEG", out);
<script type="text/javascript">
function _change(){
var imgEle = document.getElementById("img");
//为了避免浏览器缓存验证码图片,让图片路径加一个毫秒参数,让浏览器以为是和上次不一样的
imgELe.src = "/day03/VerifyCodeServlet?a=" + new Date().getTime();
}
</script> </head>
<body>
<%--
1、创建一个变量用于在input标签中输出,给一个初始值用于最初的输出状态
2、从servlet中获取cookie[]得到所有的请求头 set-Cookies,数组的每个元素都是aaa=AAA这样的值对
3、判断cookies是否为空,为空则以初始值输出,不为空则循环遍历数组,将getName()是uname的cookie的value赋值给变量,在input中输出在value属性中
--%>
<%
String uname = "username";
Cookie[] cs = request.getCookies();
if(cs != null){
for(Cookie c:cs){
if("uname".equals(c.getName())){
uname = c.getValue();
}
}
}
%>
<form action="/day03/LoginServlet" method="post">
用户名:<input type="text" name="username" value="<%=uname%>"/></br>
密 码:<input type="text" name="password" value="password"/></br>
验证码:<input type="text" name="yanzheng" size="3"/>
<img id="img" src="/day03/VerifyCodeServlet" "/>
<a href="javascript:_change()">换一张</a></br>
<input type="submit" value="登录">
</form>
<%--
1、和cookie一样的道理,创建一个值为空串的字符串变量
2、获取request域健为faile的值,如果不为空,则把值赋给变量输出
--%>
<%
String msg = "";
String message = (String)request.getAttribute("faile");
if(message!=null){
msg = message;
}
%>
<font color="red"><b><%=msg %></b></font>