代码如下
//生成验证码,并将验证码存入session中,以ip为key public class GetMessage { public static BufferedImage getMsg(HttpServletRequest request,String ip){ int width = 60 , height = 30; //创建一个图像,宽60 高30 BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); Random random = new Random(); g.setColor(getRandomColor(200,250)); g.fillRect(0,0,width,height); g.setFont(new Font("Times New Roman",Font.PLAIN,18)); g.setColor(getRandomColor(160,200)); //干扰线生成 for (int i = 0; i < 10; 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 strCode = ""; for (int i = 0; i < 4; i++) { String strNumber = String.valueOf(random.nextInt(10)); strCode = strCode+strNumber; //设置字体颜色 g.drawString(strNumber,13*i+6,20); } System.out.println("当前ip"+ip); System.out.println("当前验证码"+strCode); request.getSession().setAttribute(ip,strCode); Common.setRedis(ip,strCode); g.dispose(); return image; } /** * 随机获取颜色的方法 * @return */ public static Color getRandomColor (int fc , int bc){ Random random = new Random(); Color reandomColor = null; 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); reandomColor = new Color(r,g,b); return reandomColor; } }
代码如下:
/* *获取图片验证码 */ @PostMapping("getMessage") @ApiOperation(value = "获取图片验证码",notes = "获取图片验证码") @CrossOrigin public void getMessage(HttpServletResponse response, HttpServletRequest request){ response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","No-cache"); response.setDateHeader("Expires",0); response.setContentType("image/jpeg"); String ip=request.getRemoteAddr(); BufferedImage image= GetMessage.getMsg(request,ip); try { ImageIO.write(image,"JPEG",response.getOutputStream()); response.getOutputStream().flush(); response.getOutputStream().close(); } catch (IOException e) { e.printStackTrace(); } }
上面代码调用工具类中的方法生成验证码图片,并将图片转换为数据流response返回给前端。
使用postman测试效果如下: