ホームページ >Java >&#&チュートリアル >SpringBoot+kaptchaで検証コードを実装する方法
kaptcha は非常に古い検証コード生成ツールですが、何年前のものですか? 2006 年に遡ります。
何年も経った今でも、寂しくないだけでなく、今でも多くの人に使われているということは、その活力を示しており、研究する価値があります。
便宜上、Spring Boot プロジェクトを作成してその使用法を示します。
最初に新しい Spring Boot プロジェクトを作成し、次に次のように kaptcha 依存関係を追加します。
<dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency>
次に必要なのは、次のように Kaptcha を構成する Bean を提供することだけです。 # #DefaultKaptcha に認証コード画像の各属性値を設定します。各属性の意味はコード内でコメントされているため、これ以上は説明しません。
次に、次のように、インターフェイスで検証コード イメージを返します。
@Configuration public class KaptchaConfig { @Bean(name = "captchaProducer") public DefaultKaptcha getKaptchaBean() { DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); // 是否有边框 默认为true 我们可以自己设置yes,no properties.setProperty(KAPTCHA_BORDER, "yes"); // 验证码文本字符颜色 默认为Color.BLACK properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); // 验证码图片宽度 默认为200 properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); // 验证码图片高度 默认为50 properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); // 验证码文本字符大小 默认为40 properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); // KAPTCHA_SESSION_KEY properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); // 验证码文本字符长度 默认为5 properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } }
ここでは、イメージを IO ストリームの形式でフロントエンドに書き込みます。もちろん、変換することもできます。 Base64 に変換する フロントエンドに返される文字列もOKです。
待って、何かが足りないようです。
生成された検証コード テキストをセッションに保存しなかったため、ログイン時に検証することはできません。友人の中には、これは簡単ではないかと言う人もいるかもしれません。インターフェースに保存するだけでは十分ではないでしょうか? ######ダメダメダメ!
ほら、DefaultKaptcha Bean を設定するときに、
properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");というコード行があります。このコード行は、自動的に生成された検証コード テキストはセッションに保存され、セッションの KEY は kaptchaCode です。ただし、実際のテストでは、上記のコードでは、検証コードによって生成されたテキストがセッションに保存されていないことがわかります。
理由は、Kaptcha ツールが実際に検証コード イメージを生成するサーブレットを提供しているためです。提供される検証コード サーブレットを直接使用すると、上記の設定が有効になります。Spring Boot では、 Kaptcha が提供するサーブレットを設定するには、次の方法があります。 <pre class="brush:java;">@Autowired
DefaultKaptcha defaultKaptcha;
@GetMapping("/img")
public void getKaptcha(HttpServletResponse resp) throws IOException {
String text = defaultKaptcha.createText();
BufferedImage image = defaultKaptcha.createImage(text);
ImageIO.write(image, "jpg", resp.getOutputStream());
}</pre>
プロジェクト開始後、
に直接アクセスして、検証コードのイメージと検証のテキストを確認します。コードも自動的に保存されます。セッションに入ります。ユーザーがログインすると、
session.getAttribute("kaptchaCode") を通じて検証コードのテキスト コンテンツを取得できます。 ただし、多くの場合、検証コード インターフェイスから返されるコンテンツは比較的豊富で、画像だけでなく他の情報も含まれる場合があります。したがって、サーブレットを直接構成することは要件を満たすことができません。検証コード インターフェイスを自分で作成することしかできません。自分で作成する場合は、検証コード イメージを自分でセッションに保存し、その後、
properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, " kaptchaCode");
この構成は実際には役に立たないため、追加する必要はありません。
2. 検証コード テキストのカスタマイズもちろん、検証コード テキストもカスタマイズできます。次のように、検証コード テキストの実装クラスを指定するだけです:
@Bean ServletRegistrationBean<HttpServlet> kaptchaServlet() { ServletRegistrationBean<HttpServlet> bean = new ServletRegistrationBean<>(); bean.setServlet(new KaptchaServlet()); bean.addUrlMappings("/img"); Properties properties = new Properties(); // 是否有边框 默认为true 我们可以自己设置yes,no properties.setProperty(KAPTCHA_BORDER, "yes"); // 验证码文本字符颜色 默认为Color.BLACK properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); // 验证码图片宽度 默认为200 properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); // 验证码图片高度 默认为50 properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); // 验证码文本字符大小 默认为40 properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); // KAPTCHA_SESSION_KEY properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); // 验证码文本字符长度 默认为5 properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); Map<String, String> map = new HashMap<String,String>((Map)properties); bean.setInitParameters(map); return bean; }
のような文字列です。
今後は、@を区切り線として使用し、@より前の文字列内容を画像上に描画し、@以降の内容をセッションに保存し、アップロードした内容と比較する予定です。ユーザーによる。 もちろん、検証コードを構成するときに次の属性を追加して、検証コード テキストの提供クラスを変更する必要もあります。
public class KaptchaTextCreator extends DefaultTextCreator { private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(","); @Override public String getText() { Integer result = 0; Random random = new Random(); int x = random.nextInt(10); int y = random.nextInt(10); StringBuilder suChinese = new StringBuilder(); int randomoperands = (int) Math.round(Math.random() * 2); if (randomoperands == 0) { result = x * y; suChinese.append(CNUMBERS[x]); suChinese.append("*"); suChinese.append(CNUMBERS[y]); } else if (randomoperands == 1) { if (!(x == 0) && y % x == 0) { result = y / x; suChinese.append(CNUMBERS[y]); suChinese.append("/"); suChinese.append(CNUMBERS[x]); } else { result = x + y; suChinese.append(CNUMBERS[x]); suChinese.append("+"); suChinese.append(CNUMBERS[y]); } } else if (randomoperands == 2) { if (x >= y) { result = x - y; suChinese.append(CNUMBERS[x]); suChinese.append("-"); suChinese.append(CNUMBERS[y]); } else { result = y - x; suChinese.append(CNUMBERS[y]); suChinese.append("-"); suChinese.append(CNUMBERS[x]); } } else { result = x + y; suChinese.append(CNUMBERS[x]); suChinese.append("+"); suChinese.append(CNUMBERS[y]); } suChinese.append("=?@" + result); return suChinese.toString(); } }
構成が完了すると、この検証コードは次のようになります。使用する際は、生成された検証コードのテキストを分割して処理することに注意してください 一部は描画に使用され、一部はセッションに保存されます。
以上がSpringBoot+kaptchaで検証コードを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。