SpringMVC生成的验证码图片不显示问题及解决方法

网友投稿 636 2023-06-16

SpringMVC生成的验证码图片不显示问题及解决方法

近期用SSM框架写一个项目,登录模块需要生成验证码图片,我把相关的代码写好了之后传到 jsp ,但是图片不显示,查看控制台显示404,反复查询了一下代码并没有发现任何问题,代码如下:

@Controller

pubjncOHlic class ValidateCodeController {

private static final long serialVersionUID = 1L;

private static int WIDTH = 70; // 验证码图片的宽度

private static int HEIGHT = 35; // 验证码图片的高度

@RequestMapping("/validateCode")

public void validateCode(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

HttpSession session = request.getSession();

response.setContentType("image/jpeg");

ServletOutputStream sos = response.getOutputStream();

// 设置浏览器不要缓存该图片

response.setHeader("Pragma", "No-cache");

response.setHeader("Cache-Control", "no-cache");

response.setDateHeader("Expires", 0);

// 创建图片缓存区

BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

Graphics g = image.getGraphics(); // 获取画笔

char [] rands = generateCheckCode(); // 产生随机的验证码

// 产生图像

drawBackground(g);

drawRands(g, rands);

// 结束绘画过程,完成图像

g.dispose();

// 将图像输出到客户端

ByteArrayOutputStream bos = new ByteArrayOutputStream();

ImageIO.write(image, "JPEG", bos);

byte [] buf = bos.toByteArray();

response.setContentLength(buf.length);

sos.write(buf);

bos.close();

sos.close();

// 将当前验证码存入 Session 中

session.setAttribute("valicode", new String(rands));

//Systehttp://m.out.println("1:"+request.getSession().getId());

System.out.println(session.getAttribute("valicode"));

}

private void drawRands(Graphics g, char[] rands) {

g.setColor(new Color(41, 41, 41));

g.setFont(new Font(null, Font.ITALIC|Font.BOLD, 18));

g.drawString("" + rands[0], 2, 17);

g.drawString(" " + rands[1], 16, 20);

g.drawString(" " + rands[2], 31, 13);

g.drawString(" " + rands[3], 46, 18);

//System.out.println(rands);

}

private void drawBackground(Graphics g) {

g.setColor(new Color(255, 255, 255));

g.fillRect(0, 0, WIDTH, HEIGHT);

// 随机产生 120 个干扰点

for(int i = 0; i < 120; i++) {

int x = (int) (Math.random() * WIDTH);

int y = (int) (Math.random() * HEIGHT);

int red = (int) (Math.random() * 255);

int green = (int) (Math.random() * 255);

int blue = (int) (Math.random() * 255);

g.setColor(new Color(red, green, blue));

g.drawOval(x, y, 1, 0);

}

}

// 生成四个字符的验证码

private char[] generateCheckCode() {

String chars = "0123456789abcdefghijklmnopqrstuvwxyz";

char [] rands = new char[4];

for(int i = 0; i <4; i++) {

int rand = (int) (Math.random() * 36);

rands[i] = chars.charAt(rand);

}

return rands;

}

}

jsp 获取验证码图片的关键代码如下:

后来就给validateCode方法加了一个注解 @ResponseBody 图片就显示出来了。然后看了 这篇博客,才得知:

1、responseBody一般是作用在方法上的,加上该注解表示该方法的返回结果直接写到Http response Body中,常用在ajax异步请求中,

2、在RequestMapping中 return返回值默认解析为跳转路径,如果你此时想让Controller返回一个字符串或者对象到前台 就会报404 not response的错误。

3、当加上@ResponseBody注解后不会解析成跳转地址 会解析成相应的json格式的对象 集合 字符串或者xml等直接返回给前台 可以通过 ajax 的“success”:fucntion(data){} data直接获取到。

总结

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:springboot+redis过期事件监听实现过程解析
下一篇:Spring Security如何基于Authentication获取用户信息
相关文章

 发表评论

暂时没有评论,来抢沙发吧~