写验证码,网页和idea都不报错,但就是显示不出来
Servlet代码:
package pers.hawk.bms.web;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
@WebServlet(loadOnStartup = 1) // 希望该 servlet 在服务器启动的时候可以先准备好
public class SecurityCode extends HttpServlet {
Random random = new Random();
/**
* 获取随机字符串,作为验证码
* @return 返回验证码字符串
*/
private String getRandomString() {
String string = "23456789ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghjklmnpqrstuvwxyz";
StringBuilder stringBuilder = new StringBuilder();
// 生成四个随机字符
for ( int i = 0; i < 4; i++ ) {
int index = random.nextInt(string.length());
char letter = string.charAt(index);
stringBuilder.append(letter);
}
return stringBuilder.toString();
}
/**
* 获取背景色,0-255
* @return 返回随机颜色
*/
private Color getBackgroundColor() {
// 生成三原色
int red = random.nextInt(256);
int green = random.nextInt(256);
int blue = random.nextInt(256);
return new Color(red,green,blue);
}
/**
* 获取与背景色反差很大的前景色
* @param backgroundColor 背景色
* @return 返回前景色
*/
private Color getForegroundColor(Color backgroundColor) {
// 前景色和背景色最好反差大一些
int red = 255 - backgroundColor.getRed();
int green = 255 - backgroundColor.getGreen();
int blue = 255 - backgroundColor.getBlue();
return new Color(red,green,blue);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置响应格式 .jpg 图片,设置 MIM 类型
resp.setContentType("image/jpeg");
//浏览器不缓存响应内容--验证码图片,点一次就要刷新一次,所以不能有缓存出现
resp.setHeader("Pragma","No-cache");
resp.setHeader("Cache-Control","no-cache");
//设置验证码失效时间
resp.setDateHeader("Expires",0);
// 图片对象(缓冲区图片)
BufferedImage bufferedImage = new BufferedImage(80,30,BufferedImage.TYPE_INT_RGB);
// 获取画布对象
Graphics graphics = bufferedImage.getGraphics();
// 设置背景色
Color backgroundColor = getBackgroundColor();
graphics.setColor(backgroundColor); // 将 backgroundColor 给画布
// 画背景
graphics.fillRect(0,0,80,30); // 让画布用 backgroundColor ,填充该的长方形
// 获取前景色
Color foregroundColor = getForegroundColor(backgroundColor);
graphics.setColor(foregroundColor);
// 设置字体
graphics.setFont(new Font("黑体",Font.BOLD,26)); // 黑体 + 粗体 + 26号字
// 将随机字符串存到 session
String randomString = getRandomString();
HttpSession httpSession = req.getSession();
httpSession.setAttribute("security_code",randomString);
System.out.println(httpSession.getAttribute("security_code"));
graphics.drawString(randomString,10,28); // 将字符串画到画布中
// 噪点(30 个白色正方形)(防止暴力登录)
for ( int i = 0; i < 30; i++ ) {
graphics.setColor(Color.white);
int x = random.nextInt(80); // 长方形的宽
int y = random.nextInt(30); // 长方形的高
graphics.fillRect(x,y,1,1);
}
// 将内存中,这张画好的图片,输出到响应流
ServletOutputStream servletOutputStream = resp.getOutputStream();
// 将画好的画布,写成 jpeg 的格式,并写到响应流
ImageIO.write(bufferedImage,"jepg",servletOutputStream); // ImageIO 图片的帮助类
}
}
login.jsp里的部分代码
<script type="text/javascript">
$(function (){
$("#security_code").click(function () {
$(this).prop("src","securityCode?id="+Math.random());
});
$("#submit_button").click(function () {
// 验证码:现在只需要验证用户已输入。
var codeText = $("#code").val();
//去掉验证码前后空格
codeText = $.trim(codeText);
if (codeText == null || codeText === "") {
//4 提示用户
$("span.error_message").text("验证码不能为空!");
return false;
}
// 去掉错误信息
$("errorMsg").text("");
});
});
</script>
<input id="code" class="entry_field" name="security_code" type="text" placeholder="请输入验证码" autocomplete="off" tabindex="1">
<img id="security_code" src="securityCode"/>看不清?换一张
在idea里不报错,网页控制台也不报错,而且验证码也有内容,就只是在网页页面加载不出来
网上的各种方法都试过了,都不行。
而且刚写完测试代码时,还报了405错误,“此URL不支持Http方法GET”
我就将doDet方法里的super.doGet(req,resp),改成了doPost(req,resp)
然后就是现在的情况了