Java 生成验证码
直接上代码
- 先创建好一个生成图片的类。
public class VerCode {
private BufferedImage img = new BufferedImage(100, 50, BufferedImage.TYPE_INT_RGB);
Color[] colors = new Color[]{Color.RED,Color.blue,Color.YELLOW,Color.green,Color.pink,Color.gray,Color.orange};
public Map<BufferedImage,String> createGrap(){
String randWord = "";
Random random = new Random();
List<Integer> words = new ArrayList<>();
for(int i = 0; i < 4; i++){
words.add(random.nextInt(10));
randWord += words.get(i);
}
Graphics2D gra = img.createGraphics();
gra.setColor(Color.white);
gra.fillRect(0, 0, 100, 50);
gra.setFont(new Font("微软雅黑",Font.ITALIC|Font.BOLD,20));
for(int i = 0; i <5 ;i++){
gra.setColor(colors[random.nextInt(colors.length)]);
gra.drawLine(0, random.nextInt(51), 100, random.nextInt(51));
}
for(int i = 0; i <10 ;i++){
gra.setColor(colors[random.nextInt(colors.length)]);
gra.drawOval(random.nextInt(101), random.nextInt(51), 2, 2);
}
for(int i = 0; i < words.size();i++){
gra.setColor(colors[random.nextInt(colors.length)]);
gra.drawString(words.get(i)+"", i*20, 35+(random.nextInt(11)-5));
}
Map<BufferedImage,String> map = new HashMap<>();
map.put(img, randWord);
return map;
}
}
- 在Cotroller中调用该类
@Controller
public class VerCodeController {
@RequestMapping("/pages/Vcode")
public String vercode(HttpServletRequest req, HttpServletResponse res) throws IOException {
BufferedImage img = null;
String words = "";
VerCode verCode = new VerCode();
Map<BufferedImage, String> grap = verCode.createGrap();
for (Entry<BufferedImage, String> arg : grap.entrySet()) {
img = arg.getKey();
words = arg.getValue();
}
System.out.println("Code:"+words);
ServletOutputStream outputStream = res.getOutputStream();
ImageIO.write(img, "jpg", outputStream);
HttpSession session = req.getSession();
session.setAttribute("vercode", words);
return null;
}
}
3.前端页面图片请求
<a href=""><img src="Vcode" onClick="this.src=this.src+'?'+Math.random()"/></a>
后面的onClick方法可以实现在不刷新页面的情况下重新加载图片。
总结:
前端页面加载时候,会向后端发送Vcode请求,被Controller控制器响应后,在控制器内把图片转换成流放入返回数据流中,在将验证码放入session中以便登入时候的验证。