kaptchaを使用するように構成された認証コードジェネレータ
オープンソースのコードを使用してGoogleは、Mavenの座標により組み入れ、ライブラリkaptchaを実装しました
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
<exclusions>
<exclusion>
<artifactId>javax.servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
</exclusions>
</dependency>
- 我々は、設定ファイルがapplication.ymlであることを前提としていkaptcha.propertiesと呼ばれる別のファイルを作成します。kaptcha設定YAML非準拠のフォーマットなので、これだけのプロパティを使用します。ノートPropertySourc使用を遵守しなければなりません。
- 私たちは、プロファイルは、別のファイルを確立することなく、中に参加するには、次のコードapplication.propertiesであることを前提としています。
- 次のコードの設定、我々が国境検証コード、色、サイズ、フォントおよびその他の属性を調整する必要がある場合、あなたはこれらの構成を変更することができ、英語の単語の観点から理解しやすいです。
kaptcha.border=no
kaptcha.border.color=105,179,90
kaptcha.image.width=100
kaptcha.image.height=45
kaptcha.session.key=code
kaptcha.textproducer.font.color=blue
kaptcha.textproducer.font.size=35
kaptcha.textproducer.char.length=4
kaptcha.textproducer.font.names=宋体,楷体,微软雅黑
次のコードは、それが必要PropertySource注釈と結合された別のファイルのプロパティである場合、ロードされたkaptcha構成(コンフィギュ春起動ロードを参照)の設定ファイルです。
さらに、我々は確認コードを生成するため、構成、初期化captchaProducerスプリングビーンをロードすることによって達成しました。
@Component
@PropertySource(value = {"classpath:kaptcha.properties"})
public class CaptchaConfig {
@Value("${kaptcha.border}")
private String border;
@Value("${kaptcha.border.color}")
private String borderColor;
@Value("${kaptcha.textproducer.font.color}")
private String fontColor;
@Value("${kaptcha.image.width}")
private String imageWidth;
@Value("${kaptcha.image.height}")
private String imageHeight;
@Value("${kaptcha.session.key}")
private String sessionKey;
@Value("${kaptcha.textproducer.char.length}")
private String charLength;
@Value("${kaptcha.textproducer.font.names}")
private String fontNames;
@Value("${kaptcha.textproducer.font.size}")
private String fontSize;
@Bean(name = "captchaProducer")
public DefaultKaptcha getKaptchaBean() {
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
Properties properties = new Properties();
properties.setProperty("kaptcha.border", border);
properties.setProperty("kaptcha.border.color", borderColor);
properties.setProperty("kaptcha.textproducer.font.color", fontColor);
properties.setProperty("kaptcha.image.width", imageWidth);
properties.setProperty("kaptcha.image.height", imageHeight);
properties.setProperty("kaptcha.session.key", sessionKey);
properties.setProperty("kaptcha.textproducer.char.length", charLength);
properties.setProperty("kaptcha.textproducer.font.names", fontNames);
properties.setProperty("kaptcha.textproducer.font.size",fontSize);
Config config = new Config(properties);
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
}
この時点で、我々はコンフィギュレーション・ファイルを見つけた場合、我々は中国を読み取るために、行っているコンフィギュレーションKaptchaオープンソースコードのソフトウェアは、次の設定を変更し、IDEAの環境下で文字化け。
第二に、認証コード記憶されたセッションの生成
コントローラは、確認コードを生成します。パスを開くために同じ時間が必要で、「/ kaptcha」のアクセス権は、アクセスへのパスを任意の権限付与の必要はありませんログインなしで構成します。私はすでに話されている前の記事を構成する方法。
- captchaProducer.createTextによって()検証コードワードを生成し、そして一緒にCaptchaImageVOに時間と失敗を節約。
- クラスオブジェクトCaptchaImageVO情報コードは、セッションに格納されています。(して以下にこのクラスコード)
- 画像captchaProducer.createImage(capText)によって生成されたコード、およびServletOutputStreamを、フロントエンドに戻ります
@RestController
public class CaptchaController {
@Resource
DefaultKaptcha captchaProducer;
/**
* 获取验证码
*/
@RequestMapping(value = "/kaptcha", method = RequestMethod.GET)
public void kaptcha(HttpSession session, HttpServletResponse response) throws Exception {
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
response.setContentType("image/jpeg");
String capText = captchaProducer.createText();
CaptchaImageVO captchaImageVO = new CaptchaImageVO(capText,2 * 60);
//将验证码存到session
session.setAttribute(Constants.KAPTCHA_SESSION_KEY, captchaImageVO);
//将图片返回给前端
try(ServletOutputStream out = response.getOutputStream();) {
BufferedImage bi = captchaProducer.createImage(capText);
ImageIO.write(bi, "jpg", out);
out.flush();
}//使用try-with-resources不用手动关闭流
}
}
私たちは、CaptchaImageVOセッションの内部を保存したいです。したがって、このクラスでは、その後の検証のための唯一の認証コードと有効期限の保存テキストをすることができ、写真を追加しないでください。CAPTCHAイメージは役に立たないとメモリの無駄の両方を保存しました。
@Data
public class CaptchaImageVO {
//验证码文字
private String code;
//验证码失效时间
private LocalDateTime expireTime;
public CaptchaImageVO(String code, int expireAfterSeconds){
this.code = code;
this.expireTime = LocalDateTime.now().plusSeconds(expireAfterSeconds);
}
//验证码是否失效
public boolean isExpried() {
return LocalDateTime.now().isAfter(expireTime);
}
}
第三に、ユーザーのアクセスコード
次のコードは、ログインフォームに画像のimgタグに適切な場所、注意を払うログインページに追加されます。
<img src="/kaptcha" id="kaptcha" width="110px" height="40px"/>
<script>
window.onload=function(){
var kaptchaImg = document.getElementById("kaptcha");
kaptchaImg.onclick = function(){
kaptchaImg.src = "/kaptcha?" + Math.floor(Math.random() * 100)
}
}
</script>
- 達成される効果は、ページロードされた初期化コードであるということです。各クリック後、確認コードを更新しました。
- 注:それ以外の場合は画像が表示できない、幅と高さを設定してください。
第四に、セキュリティチェックコードの検証
- 私たちは、カスタム認証コードフィルタVerificationCodeFilterを書き、フィルタは、ログイン要求をインターセプト
- VerificationCodeFilterフィルタはフィルタチェーンを行うことによって以外のユーザ入力整合seesion、から文字コードを取得します。
- ないAuthenticationFailureHandlerと比較し、カスタムの例外処理によって、
- 最後にUsernamePasswordAuthenticationFilterフォームフィラーの前に実装上のVerificationCodeFilter。
上記の春のセキュリティでは、ログイン認証コード検証ロジックを実現しています。あなたが達成するために史郎またはその他のカスタム・ログイン認証を使用している場合、それはさらに簡単です。彼らは、コードが一致したログイン認証セッションコントローラを削除して、カスタムフィルタを必要としません。
あなたの注意を楽しみにして
- :ブロガーは、一連の文書をお勧めします「手タッチの手があなたSpringBootシリーズの章97節を教え-16」
- この記事は、再現される(エンはテキストのみをオンにしてはならない)ソースを示す:文字がオフジボ。