1.新建一個springboot的項目
2.導入坐標
<dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency>
3.編寫配置
1)顏色配置類
package com.zys.springboottestexample.common.kaptcha; import org.assertj.core.util.Lists; import java.awt.*; import java.util.List; import java.util.Random; /** * 驗證碼顏色 */ public class KaptchaColor { public static Color getColor() { List<Color> colors = Lists.newArrayList(); colors.add(new Color(0, 135, 255)); colors.add(new Color(51, 153, 51)); colors.add(new Color(255, 102, 102)); colors.add(new Color(255, 153, 0)); colors.add(new Color(153, 102, 0)); colors.add(new Color(153, 102, 153)); colors.add(new Color(51, 153, 153)); colors.add(new Color(102, 102, 255)); colors.add(new Color(0, 102, 204)); colors.add(new Color(204, 51, 51)); colors.add(new Color(128, 153, 65)); Random random = new Random(); int colorIndex = random.nextInt(10); return colors.get(colorIndex); } }
2)降噪配置
package com.zys.springboottestexample.common.kaptcha; import com.google.code.kaptcha.NoiseProducer; import com.google.code.kaptcha.util.Configurable; import java.awt.*; import java.awt.image.BufferedImage; import java.util.Random; /** * 驗證碼加噪處理 */ public class KaptchaNoise extends Configurable implements NoiseProducer { public KaptchaNoise() { } @Override public void makeNoise(BufferedImage image, float factorOne, float factorTwo, float factorThree, float factorFour) { int width = image.getWidth(); int height = image.getHeight(); Graphics2D graph = (Graphics2D)image.getGraphics(); graph.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON)); graph.setStroke(new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); Random random = new Random(); int noiseLineNum = random.nextInt(3); if(noiseLineNum == 0){ noiseLineNum = 1; } for (int i = 0; i < noiseLineNum; i++){ graph.setColor(KaptchaColor.getColor()); graph.drawLine(random.nextInt(width), random.nextInt(height), 10 + random.nextInt(20), 10 + random.nextInt(20)); } graph.dispose(); } }
3)字體配置
package com.zys.springboottestexample.common.kaptcha; import com.google.code.kaptcha.util.Configurable; import java.awt.*; import java.awt.font.FontRenderContext; import java.awt.font.GlyphVector; import java.awt.image.BufferedImage; import java.util.Random; /** * 驗證碼字體生成(根據文字內容) */ public class KaptchaWordRenderer extends Configurable implements com.google.code.kaptcha.text.WordRenderer { public KaptchaWordRenderer() { } @Override public BufferedImage renderWord(String word, int width, int height) { int fontSize = this.getConfig().getTextProducerFontSize(); Font[] fonts = this.getConfig().getTextProducerFonts(fontSize); int charSpace = this.getConfig().getTextProducerCharSpace(); BufferedImage image = new BufferedImage(width, height, 2); Graphics2D g2D = image.createGraphics(); g2D.setColor(Color.WHITE); RenderingHints hints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); hints.add(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY)); g2D.setRenderingHints(hints); g2D.setStroke(new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); FontRenderContext frc = g2D.getFontRenderContext(); Random random = new Random(); int startPosY = (height - fontSize) / 5 + fontSize; char[] wordChars = word.toCharArray(); Font[] chosenFonts = new Font[wordChars.length]; int[] charWidths = new int[wordChars.length]; int widthNeeded = 0; int startPosX; for(startPosX = 0; startPosX < wordChars.length; ++startPosX) { chosenFonts[startPosX] = fonts[random.nextInt(fonts.length)]; char[] charToDraw = new char[]{wordChars[startPosX]}; GlyphVector gv = chosenFonts[startPosX].createGlyphVector(frc, charToDraw); charWidths[startPosX] = (int)gv.getVisualBounds().getWidth(); if (startPosX > 0) { widthNeeded += 2; } widthNeeded += charWidths[startPosX]; } startPosX = (width - widthNeeded) / 2; for(int i = 0; i < wordChars.length; ++i) { g2D.setColor(KaptchaColor.getColor()); g2D.setFont(chosenFonts[i].deriveFont(Font.PLAIN)); char[] charToDraw = new char[]{wordChars[i]}; g2D.drawChars(charToDraw, 0, charToDraw.length, startPosX, startPosY); startPosX = startPosX + charWidths[i] + charSpace; } return image; } }
4)驗證碼主要配置
package com.zys.springboottestexample.config; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; import com.zys.springboottestexample.common.kaptcha.KaptchaNoise; import com.zys.springboottestexample.common.kaptcha.KaptchaWordRenderer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Properties; /** * 谷歌圖片驗證碼配置 */ @Configuration public class KaptchaConfig { @Bean public DefaultKaptcha getDefaultKaptcha() { DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); //圖片是否有邊框 properties.setProperty("kaptcha.border", "no"); //圖片的邊框顏色 properties.setProperty("kaptcha.border.color", "34,114,200"); //圖片的大小 properties.setProperty("kaptcha.image.width", "125"); properties.setProperty("kaptcha.image.height", "45"); //文字內容 properties.setProperty("kaptcha.textproducer.char.length", "5"); //圖片背景顏色 properties.setProperty("kaptcha.background.clear.from", "white"); properties.setProperty("kaptcha.background.clear.to", "white"); properties.setProperty("kaptcha.word.impl", KaptchaWordRenderer.class.getName()); properties.setProperty("kaptcha.noise.impl", KaptchaNoise.class.getName()); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } }
4.編寫接口
@RestController @RequestMapping("/kaptcha") public class KaptchaController { @Autowired private DefaultKaptcha defaultKaptcha; @GetMapping("/img") public void createImg(HttpServletResponse response) throws IOException { //生成驗證碼文字 String kaptchaText = defaultKaptcha.createText(); System.out.println(kaptchaText); //根據文字生成圖片 BufferedImage image = defaultKaptcha.createImage(kaptchaText); ImageIO.write(image, "jpg", response.getOutputStream()); } }
5.測試
啟動項目,訪問http://localhost:8080/kaptcha/img就可以看到圖片。
說明:對於圖片,也可以使用流的方式返回給前端,然后前端直接使用img標簽,把數據給src屬性即可。修改后的代碼如下
//生成驗證碼文字 String kaptchaText = defaultKaptcha.createText(); System.out.println(kaptchaText); //根據文字生成圖片 BufferedImage image = defaultKaptcha.createImage(kaptchaText); ByteArrayOutputStream outputStream =new ByteArrayOutputStream(); ImageIO.write(image, "jpg", outputStream); String base64Code = Base64.encodeBase64String(outputStream.toByteArray()); return base64Code;