Logika Kode Verifikasi
Saya juga telah melakukan kode verifikasi dalam proyek sebelumnya. Ada banyak kode di internet yang menghasilkan kode verifikasi, dan beberapa paket stoples pihak ketiga juga dapat menghasilkan kode verifikasi yang indah. Logika kode verifikasi sangat sederhana. Ini untuk meletakkan tag gambar pada halaman login, dan SRC menunjuk ke pengontrol. Pengontrol ini mengembalikan gambar yang dihasilkan dan mengembalikan aliran output ke halaman. Saat menghasilkan gambar, teks pada gambar ditempatkan di sesi. Saat masuk, bawa kode verifikasi yang dimasukkan dan keluarkan dari sesi. Bandingkan keduanya. Guru mengatakan bahwa menggunakan kode verifikasi terintegrasi Spring Security sama dengan apa yang saya katakan, tetapi lebih standar dan umum.
Spring Security adalah serangkaian rantai filter, jadi di sini kode verifikasi juga dinyatakan sebagai filter, ditambahkan sebelum filter login rantai filter, dan kemudian menyesuaikan kelas pengecualian untuk menanggapi pesan kesalahan kode verifikasi.
Struktur Kode:
Kode verifikasi ditempatkan dalam proyek inti dan konfigurasi dilakukan dalam proyek browser.
Kode utama:
1. Imagecode:
Pertama, kelas Imagecode merangkum gambar kode verifikasi, teks, dan waktu kedaluwarsa
Paket com.imooc.security.core.validate.code; import java.awt.image.bufferedImage; import java.time.localdateTime; import java.time.localtime;/*** kode verifikasi* classname: imagecode* @description: kode verifikasi* @Ahechoode {classname: Imagecode* @description: kode verifikasi* @Ahechor {classname: classname* @description: verifikasi kode verifikasi* @AhoD {classname: classname* @description: verifikasi Kode verifikasi* @AnOD {classname* @description* Gambar buferedImage; kode string pribadi; Private LocalDateTime EXPIRETIME; // Titik Waktu Kedaluwarsa/** * * <p> Deskripsi: </p> * @param gambar * @param kode * @param Expiretn Berapa banyak detik yang kedaluwarsa */public imagecode (gambar buferedImage, kode string, int expiretn) {super (); this.image = gambar; this.code = kode; // Waktu kedaluwarsa = Waktu saat ini + Jumlah detik yang kadaluwarsa this.expiretime = localDateTime.now (). Plusseconds (EXPIRETN); } public ImageCode (gambar buferedImage, kode string, localDateTime expiretime) {super (); this.image = gambar; this.code = kode; this.expiretime = kedaluwarsa; } / *** Apakah kode verifikasi telah kedaluwarsa* @description: apakah kode verifikasi telah kedaluwarsa* @param @return benar kedaluwarsa, false tidak kedaluwarsa* @return boolean true kedaluwarsa, false tidak kedaluwarsa* @throws* @author lohaoyang* @Date 2 Maret 2018* / public boolean iSexpired () {nadaf) @date. } public BufferedImage getImage () {return image; } public void setImage (BufferedImage Image) {this.image = Image; } public string getCode () {return code; } public void setCode (kode string) {this.code = kode; } public localDateTime getExpiretime () {return expiretime; } public void setExpiretime (localDateTime ExPiretime) {this.expiretime = ExPiretime; }}VerifikasiCode: Kelas alat untuk menghasilkan kode verifikasi. Di sini http://www.cnblogs.com/lihaoyang/p/7131512.html, tentu saja, Anda juga dapat menggunakan paket jar mitra ketiga, tidak masalah.
ValidateCodeException : Pengecualian kode verifikasi yang dienkapsulasi
/** * @title: validateCodeException.java * @package com.imooc.security.core.validate.code * @description: TODO * @Author LIHAOYANG * @Date 2 Maret 2018 */package com.imooc.security.core.validate.code; org.springframework. TODO */ SerialVersionuid Long Static Private Static = 1L; public validateCodeException (string msg) {super (msg); }}ValidateCodefilter : Filter Kode Verifikasi
Logika: Mewarisi OnterPerquestFilter memastikan bahwa filter akan dipanggil hanya sekali setiap kali (tidak yakin mengapa), disuntikkan ke dalam prosesor yang gagal otentikasi, dan dipanggil ketika verifikasi gagal.
Paket com.imooc.security.core.validate.code; import java.io.ioexception; import javax.servlet.filterchain; import javax.servlet.servletexception; import; simpitplletsvons; impor; org.apache.commons.lang.stringutils; impor org.springframework.security.web.authentication.AuthenticationFailureReHandler; Impor org.springframework.social. org.springframework.web.bind.servletrequestBindingException; impor org.springframework.web.bind.servletrequestutils; impor org.springframework * Process the login verification code filter* ClassName: ValidateCodeFilter * @Description: * OncePerRequestFilter: The tool provided by spring ensures that the filter will be called only once each time* @author lihaoyang * @date March 2, 2018*/public class ValidateCodeFilter extends OncePerRequestFilter{ //Authorization failed processor private AuthenticationFailureHandler AuthenticationFailureHandler; // Dapatkan Kelas Alat Sesi Sesi Privat Sesi Sesionstrategy = HttpsessiSessionstrategy () baru; @Override dilindungi void dofilterinternal (permintaan httpservletrequest, respons httpservletResponse, filterchain filterchain) melempar servletException, ioException {// jika itu permintaan login, jalankan if (stringutils.equals ("/authentikasi/formulir", permintaan. && stringutils.equalsignorecase (request.getMethod (), "post")) {coba {validate (servletwebRequest baru (request)); } catch (validateCodeException e) {// Memanggil penangan kesalahan, dan akhirnya memanggil otentikasi sendiriFailureHandler.onauthenticationFailure (permintaan, respons, e); return; // Mengakhiri metode, tidak lagi memanggil rantai filter}} // bukan permintaan login, hubungi filter filter filterChain.dofilter lainnya (permintaan, respons); } / ** * Kode verifikasi verifikasi * @description: Kode verifikasi verifikasi * @param @param permintaan * @param @throws servletRequestBindingException * @return void * @throws validateCodeException * @Author lohaoyang * @Date 2 March 2, 2018 / Private Void Validate * @Author LIHAOYANG) // Keluarkan objek ImageCode dalam sesi Imagecode ImageCodeInsession = (ImageCode) sesionstrategy.getAttribute (permintaan, validateCodecontroller.Session_key); // ambil kode verifikasi dalam string permintaan ImagecodeInRequest = servletRequestutils.getStringParameter (request.getRequest (), "ImageCode"); // periksa if (stringutils.isblank (imagecodeinRequest)) {lempar validateCodeException baru ("kode verifikasi tidak dapat kosong"); } if (ImageCodeInsession == null) {lempar validateCodeException baru ("Kode verifikasi tidak ada, harap segarkan kode verifikasi"); } if (imagecodeinsession.isexpired ()) {// Hapus kode verifikasi yang sudah kadaluwarsa dari sesi sesionstrategy.removeattribute (permintaan, validateCodecontroller.session_key); Lempar validateCodeException baru ("Kode verifikasi telah kedaluwarsa, silakan segarkan kode verifikasi"); } if (! stringutils.equalsignorecase (imagecodeinsession.getCode (), imagecodeinRequest)) {throw new validateCodeException ("kesalahan kode verifikasi"); } // Verifikasi dilewati, hapus kode verifikasi di sesi sesionstrategy.removeattribute (permintaan, validateCodecontroller.session_key); } public authenticationFailureHandler getAuthenticationFailureHandler () {return authenticationFailureHandler; } public void setAuthenticationFailureHandler (authenticationFailureHandler authenticationFailureHandler) {this.authenticationFailureHandler = authenticationFailureHandler; }}ValidateCodecontroller : Hasilkan Kontrol Kode Verifikasi
Paket com.imooc.security.core.validate.code; import java.io.ioException; import javax.imageio.imageio; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservlete; org.springframework.social.connect.web.HttpSessionSessionStrategy;import org.springframework.social.connect.web.SessionStrategy;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.context.request.ServletWebRequest;/** * Verification CodeControl * ClassName: ValidateCodeController * @Description: TODO * @author lihaoyang * @date March 1, 2018*/@RestControllerpublic class ValidateCodeController { public static final String SESSION_KEY = "Session_key_image_code"; // Dapatkan sesi private sesiStrategy sesionstrategy = httpsessionsionstrategy baru (); @GetMapping ("/verifyCode/image") public void createCode (permintaan httpservletRequest, respons httpservletResponse) melempar ioException {imagecode imagecode = createMageCode (request, response); sessionstrategy.setAttribute (servletWebRequest baru (permintaan), session_key, imagecode); ImageIO.Write (ImageCode.GetImage (), "JPEG", Response.GetOutputStream ()); } private ImageCode createImageCode (permintaan httpservletRequest, respons httpservletResponse) {verifyCode verifyCode = new verifyCode (); return new ImageCode (verifyCode.getImage (), verifyCode.getText (), 60); }}Konfigurasi Filter di BrowserSecurityConfig :
Paket com.imooc.security.browser; impor org.springframework.beans.factory.annotation.autowired; impor org.springframework.context.annotation.bean; impor org.springframework.notation.notation.onfigurasi; Konfigurasi Impor; Impor; org.springframework org.springframework com.imooc.security.core.properties.securityproperties; impor com.imooc.security.core.validate.code.validateCodefilter; @configuration /ini adalah konfigurasi page page page yang meluas ke WebSecurityConfiguration { /page page page. SecurityProperties; // prosesor yang disesuaikan setelah login yang berhasil @Autowired swasta authenticationuccesshandler imoocauthenticationuccesshandler; // Otentikasi Kustom Gagal Prosesor @Autowired Private AuthenticationFailureHandler IMOOCAuthenticationFailureHandler; // Perhatikan bahwa itu adalah org.springframework.security.crypto.password.passwordencoder @Bean Public PasswordEncoder PasswordCoder () {// bcryptpasswordEncoder mengimplementasikan Kata Sandi Return New BcryptPasswordEncoder (); } // Versi 2: Halaman login yang dapat dikonfigurasi @Override Protected void configure (httpsecurity http) melempar pengecualian {// validateCodefilter validateCodefilter validateCodefilter = new validateCodefilter (); // Gunakan penanganan kesalahan Anda sendiri di filter kode verifikasi ke validateCodefilter.setAuthenticationFailureHandler (imoocAuthenticationFailureHandler); // Menerapkan antarmuka yang membutuhkan otentikasi untuk melompat login formulir, keamanan = otentikasi + otorisasi //http.httpbasic () // Ini adalah otentikasi kotak pop-up default // http.addfilterbefore (validatecodefilter, verificswordswordauthenticationfilter./cl. Authentication.loginPage ("/otentikasi/membutuhkan") // Proses otentikasi pengguna browserSecurityController // login filter usernepasswordAuthenticationFilter URL login default adalah "/Formes"). authentication postprocessor.failureHandler(imoocAuthenticationFailureHandler) //Processing after login failure.and() .authorizeRequests() //The following are all authorized configurations///authentication/require: handle login, securityProperties.getBrowser().getLoginPage(): user-configured login page.antmatchers ("/otentikasi/memerlukan", SecurityProperties.getBrowser (). getLogInpage (), // Simpan halaman login tetapi tidak memfilter, jika tidak kesalahan "/verifycode/image"). identifikasi () () (). ADALED. // Perlindungan crypto dimatikan; }}Halaman login: Halaman login dibuat relatif kasar. Bahkan, kode verifikasi dapat diperiksa ketika input kode verifikasi kehilangan fokus. Anda juga dapat menggunakan gambar klik untuk menyegarkan fungsi kode verifikasi, jadi saya tidak akan melakukannya di sini.
Halaman login demo <body>. <br> <Form Action = "/Authentication/Form" Method = "Post"> <able> <tr> <td> Nama pengguna: </td> <td> <input type = "text" name = "Username"/> </td> <td> </tput> </tr> <TD> <TD> <TD> KEWATUNG </TD "</TR> </TR> <TR> <TD> <TD> KEWATUNG </TD" </TD "</TD" <td> </td> </tr> <tr> <td> Kode verifikasi: </td> <td> <input type = "text" name = "imagecode"/> </td> <td> <img src = "/verifycode/gambar"/> </td> </tr> <tr> <td colspan = "2"/> </td> </tr> <tr> <td colspan = "2" type = "Kirim"> Login </button> </td> </tr> </able> </form> </body>
Kunjungi http: // localhost: 8080/demo-gogin.html:
Tanggapi informasi pengecualian khusus
Fungsi umum tidak masalah. Tapi itu tidak cukup universal, seperti lebar dan tinggi gambar kode verifikasi, waktu kedaluwarsa, URL yang difilter, dan logika kode verifikasi semuanya ditulis sampai mati. Ini dapat dibuat hidup, dan sekarang manfaat dari membuat kode verifikasi menjadi filter tercermin. Kami dapat mengonfigurasi URL yang perlu difilter. Terkadang mungkin tidak hanya memerlukan kode verifikasi pada halaman login, yang lebih umum.
1. Parameter dasar kode verifikasi untuk modifikasi generalisasi dapat dicocokkan
Itu dibuat menjadi dapat dikonfigurasi, dan aplikasi mengacu pada modul dan mengkonfigurasinya sendiri. Jika tidak mengkonfigurasi, gunakan konfigurasi default. Selain itu, konfigurasi dapat dinyatakan dalam URL permintaan atau dalam aplikasi. Guru itu memang seorang guru, dan kodenya sangat fleksibel!
Efek yang ingin saya capai adalah membuat konfigurasi seperti itu di aplikasi. Properti:
Kode #Verifikasi Lebar gambar, tinggi, jumlah karakter imooc.security.code.image.width = 100imooc.security.code.image.height = 30imooc.security.code.image.length = 6
Maka Anda dapat mengontrol efek kode verifikasi. Karena kode verifikasi juga dibagi menjadi kode verifikasi gambar dan kode verifikasi SMS, Anda dapat menggunakan level .code.image, yang menggunakan file konfigurasi khusus Springboot dan perlu mendeklarasikan kelas Java yang sesuai:
Atribut kode perlu dinyatakan dalam SecurityProperties:
Paket com.imooc.security.core.properties; impor org.springframework.boot.context.properties.configurationproperties; impor org.springframework.context.annotation. imooc.security in application.properties * * imooc.security.browser.loginpage = /demo-gogin.html * Konfigurasi browser akan dibaca ke dalam browserProperties * ini dibagi dengan poin, dan level dan level sesuai dengan atribut kelas * @Author LiHaoy GRAYAG * @ 2018*/@configurationproperties (prefix = "imooc.security") kelas public securityproperties {private browserProperties browser = new browserProperties (); private validateCodeProPerties kode = validateCodeproPerties baru (); BrowserProperti Publik getBrowser () {return browser; } public void setBrowser (browserProperties browser) {this.browser = browser; } public validateCodeProPerties getCode () {return code; } public void setCode (kode validateCodeproPerties) {this.code = kode; }}ValidateCodeproPerties:
Paket com.imooc.security.core.properties;/*** Konfigurasi kode verifikasi* ClassName: ValidateCodeproPerties* @Description: Kode Verifikasi Konfigurasi, Kode Verifikasi Termasuk Kode Verifikasi Gambar, Kode Verifikasi SMS, dll. ImageCodeproPerties Image = ImageCodeproPerties baru (); Public ImageCodeProPerties getImage () {return image; } public void setImage (ImageCodeproPerties Image) {this.image = gambar; }}Imagecodeproperties:
Paket com.imooc.security.core.properties;/*** Kode Kode Kode Verifikasi Gambar Kelas* ClassName: ImagecodeproPerties* @Description: Kode Kode Verifikasi Gambar Kelas* @Author Lohaoyang* @Date 2 Maret 2018*/Kelas Publik Imagecodeproperies {// WELLE PICURTH PRIVER PRIVATE = CLASS PUBLIC PUBLIKA PUBLIK; // Tinggi Picture Int Tinggi Pribadi = 23; // Jumlah Kode Kode Verifikasi Private Int Length = 4; // Waktu kedaluwarsa pribadi int expirein = 60; publik int getWidth () {return width; } public void setWidth (int lebar) {this.width = width; } public int getHeight () {return height; } public void setHeight (int tinggi) {this.height = tinggi; } public int getLength () {panjang kembali; } public void setLength (int panjang) {this.length = length; } public int getExpireIN () {return expirein; } public void setExPireIN (int expirein) {this.expirein = expirein; }}Untuk konfigurasi tingkat permintaan, jika permintaan berisi parameter kode verifikasi, gunakan permintaan:
Metode CreateMageCode dari ValidateCodecontroller digunakan untuk mengontrolnya untuk menentukan apakah parameter permintaan memiliki parameter ini. Jika demikian, itu diteruskan ke kelas pembuatan kode verifikasi VerifikasiCode, yang dapat dikontrol secara dinamis selama pembuatan.
Private ImageCode createImageCode (permintaan httpservletRequest, respons httpservletResponse) {// Pertama baca panjang, lebar, dan parameter karakter dari permintaan, jika ada, gunakan, dan getsproper) (getsproper).) (permintaan). int height = servletRequestutils.getintparameter (permintaan, "tinggi", SecurityProperties.getCode (). getImage (). getHeight ()); int charlength = this.securityproperties.getCode (). getImage (). getLength (); VerifikasiCode verifikasiCode = new verifyCode (lebar, tinggi, charlength); return new ImageCode (verifyCode.getImage (), verifyCode.getText (), this.securityproperties.getCode (). getImage (). getExPireIN ()); }VerifikasiCode:
public verifyCode (int w, int h, int charlength) {super (); this.w = w; this.h = h; this.charlength = charlength; }Eksperimen: lakukan konfigurasi tingkat aplikasi dalam proyek demo
Masuk ke formulir untuk membuat konfigurasi tingkat permintaan
<img src = "/verifyCode/gambar? Lebar = 200"/>
mengakses:
Panjangnya adalah parameter 200 dari pita panggung yang meminta, ketinggiannya 30, dan karakternya 6 dikonfigurasi.
2. Antarmuka untuk intersepsi kode verifikasi modifikasi universal dapat dikonfigurasi
Efek pertama adalah untuk mengkonfigurasi secara dinamis antarmuka yang perlu dicegat di application.properties :
ImageCodeProperties telah menambahkan atribut baru: private String url ; // URL yang dicegat adalah untuk mencocokkan konfigurasi gambar di atas.
Inti, filter kode verifikasi perlu dimodifikasi:
1. Deklarasikan set di set dalam pencegat untuk menyimpan URL yang dikonfigurasi dalam file konfigurasi yang perlu dicegat.
2. Menerapkan antarmuka inisialisasi. TUJUAN: Ketika semua parameter lain dirakit, inisialisasi nilai URL yang perlu dicegat, dan tulis ulang metode AfterPropertiesset untuk mengimplementasikannya.
3. Suntikkan SecurityProperties dan baca file konfigurasi
4. Instantiate Kelas Alat Antpathmatcher, yang merupakan pencocokan
5. Atur BrowserSecurityConfig dalam proyek browser untuk memanggil metode AfterPropertiesset.
6. Mengkonfigurasi URL yang akan difilter dalam aplikasi. Properti proyek demo yang merujuk modul.
ValidateCodefilter:
/** * Proses filter kode verifikasi login * className: validatecodefilter * @description: * mewarisi alat yang disediakan oleh OnherPerquestFilter: Spring untuk memastikan bahwa filter akan dipanggil hanya sekali setiap kali * menerapkan tujuan interkinisasi yang dibutuhkan oleh pawai, * ketika parameter lain dikumpulkan, menginisialisasi nilai urls yang diperlukan untuk kebutuhan yang dibutuhkan untuk kebutuhan yang diperlukan untuk urls yang dibutuhkan dengan kebutuhan yang dibutuhkan dengan kebutuhan yang dibutuhkan dengan kebutuhan. 2018*/Public Class ValidateCodefilter memperluas sekalipun REVERQUESTFILTER mengimplementasikan inisialisasi {// otentikasi gagal prosesor autentikasi swastaFailureHandler authenticationFailureHandler; // Dapatkan Kelas Alat Sesi Sesi Privat Sesi Sesionstrategy = HttpsessiSessionstrategy baru (); // Koleksi URL yang perlu dicegat set privat <string> urls = hashset baru <> (); // Baca Konfigurasi Keamanan Pribadi SecurityProperties Security; // Kelas Alat Musim Semi Antpathmatcher Antpathmatcher = baru antpathmatcher (); @Override public void afterpropertiesset () melempar servletException {super.afterpropertiesset (); // Baca URL dari string interseped yang dikonfigurasi [] configurls = stringutils.splitbyWholesEparatorPreservealltokens (SecurityProperties.getCode (). GetImage (). GetUrl (), ","); untuk (string configurl: configurls) {urls.add (configurl); } // Masuk permintaan harus mencegat urls.add ("/otentikasi/formulir"); } @Override Protected void DofilterInternal (permintaan httpservletRequest, respons httpservletResponse, filterchain filterchain) melempar servletException, ioException { / *** Kode verifikasi yang dapat dikonfigurasi* Tekanan* URL yang diminta dan URL yang dikonfigurasi, filter itu jika itu mencocokkan jika itu mencocokkan Kode Verifikasi* untuk (string url: urls) {if (antpathmatcher.match (url, request.getRequesturi ())) {action = true; }} if (action) {coba {validate (servletwebRequest baru (request)); } catch (validateCodeException e) {// Memanggil penangan kesalahan, dan akhirnya memanggil otentikasi sendiriFailureHandler.onauthenticationFailure (permintaan, respons, e); return; // mengakhiri metode, tidak lagi memanggil rantai filter}} // bukan permintaan login, hubungi filter filter lainnya filterchain.dofilter (permintaan, respons); } // menghilangkan kode yang tidak relevan ,,}BrowsersecurityConfig:
Konfigurasikan URL:
Kode #Verifikasi Konfigurasi Antarmuka Intercept IMOOC.SECURTY.CODE.IMAGE.URL =/Pengguna,/Pengguna/*
Tes: /pengguna /pengguna /1 dicegat
Kunjungi halaman login tanpa menulis kode verifikasi:
Konsisten dengan harapan. Pada titik ini, konfigurasi dinamis dari antarmuka intersep telah selesai
3. Logika pembuatan kode verifikasi dapat dikonfigurasi
Program yang ditulis dengan lebih baik umumnya memiliki antarmuka terbuka, memungkinkan pengguna untuk menyesuaikan implementasi. Jika mereka tidak mengimplementasikannya, gunakan implementasi default. Mari kita lakukan ini sehingga generasi kode verifikasi dapat diimplementasikan sendiri. Jika Anda ingin membuat logika pembuatan kode verifikasi dapat dikonfigurasi, Anda tidak bisa hanya menulis kelas generator kode verifikasi gambar. Anda perlu mengekstrak pembuatan kode verifikasi ke antarmuka validateCodegenerator, metode untuk menghasilkan generator kode verifikasi (). Karena kode verifikasi juga memiliki kode verifikasi gambar, kode verifikasi SMS, dll., Kami membuat implementasi default dalam modul verifikasi kami, seperti implementasi kode verifikasi gambar ImageCodegenerator. Di ImageCodegenerator, kami tidak menambahkan anotasi @Component ke kelas ini. Kemudian gunakan kelas konfigurasi ValidateCodeBeanConfig yang menulis Kode Verifikasi Bean. Kelas konfigurasi ini mengkonfigurasi berbagai kacang implementasi kode verifikasi yang diperlukan, seperti implementasi kode verifikasi gambar ImageCodegenerator, kode verifikasi SMS, dll. Jenis pengembaliannya semuanya validateCodegenerator. Gunakan anotasi @ConditionAnonMissingBean (name = "ImageCodegenerator"). Dapat dinilai bahwa jika wadah musim semi saat ini memiliki kacang bernama ImageCodegenerator, itu akan digunakan, dan jika tidak ada konfigurasi, jadi jika orang lain merujuk pada modul Anda, jika orang lain mengimplementasikan kode verifikasi untuk menghasilkan antarmuka validateCodegenerator, mereka mengkonfigurasi nama kelas implementasi adalah Imagecodegenerator, dan menggunakan implementasi mereka sendiri, sehingga mereka sendiri.
Kode utama:
Antarmuka generator kode validateCodegenerator:
Paket com.imooc.security.core.validate.code; impor org.springframework.web.context.Request.ServletWebRequest;/*** antarmuka generasi kode verifikasi* classname: validateCodenator* @description: TODO* @author LIHAOYAGE/@DATECEDECE/@DESCRIPTION: TODO* @AUTHOR LIHAOYANG* @DATECEDECE/POMUNTURE 2, POMUNCICE (TODO/TODO* @AUTHOR LIHAOYANG* @DATECECEDECE {@DEATED {@DOOD @Author {@AUTHOR {@AUTHOR @Author @Author* Antarmuka generasi kode verifikasi gambar * @description: TODO * @param @param permintaan * @param @return * @return imagecode * @throws * @author lohaoyang * @date 2 Maret 2018 */ generator imagecode (permintaan servletwebRequest);}Generator kode verifikasi gambar mengimplementasikan ImageCodegenerator:
Paket com.imooc.security.core.validate.code; impor org.springframework.beans.factory.annotation.Autowired; impor org.springframework.stereotype.stereTypone; impor org.springframework.web.bind.bind.servletreestuteTils; org.springframework.web.context.request.servletwebRequest; impor com.imooc.security.core.properties.securityproperties;/** * class verifikasi classname: ImagecodeGenerator * @description: TODO * @Auten LiMenen @Auten.MACHEGENTER * @description: TODO * @Auten LiMenen LIEHOUNER * Imagecenator * @description: TODO * @Auten LIEHOUNER * ImagEpenor * @description: TODO * @Auten LiNOUNEGENTE @2, ValidateCodegenerator {@Autowired swasta privateProperties SecurityProperties; @Override Public Imagecode Generator (Permintaan ServletWebRequest) {// Baca pertama dari permintaan apakah ada parameter panjang, lebar, dan karakter. Jika ada, gunakan itu, dan lebar int default = servletRequestutils.getintparameter (request.getRequest (), "width", SecurityProperties.getCode (). GetImage (). GetWidth ()); int height = servletRequestutils.getintparameter (request.getRequest (), "height", SecurityProperties.getCode (). getImage (). getHeight ()); int charlength = this.securityproperties.getCode (). getImage (). getLength (); VerifikasiCode verifikasiCode = new verifyCode (lebar, tinggi, charlength); return new ImageCode (verifyCode.getImage (), verifyCode.getText (), this.securityproperties.getCode (). getImage (). getExPireIN ()); } Public SecurityProperties getSecurityProperties () {return SecurityProperties; } public void setSecurityProperties (SecurityProperties SecurityProperties) {this.securityProperties = SecurityProperties; }}ValidateCodeBeanConfig:
Paket com.imooc.security.core.validate.code; impor org.springframework.beans.factory.annotation.autowired; impor org.springframework.boot.condition.condition.condition.condition.condition.condition.condition.condition.condition.condition.condition.condition.condition org.springframework.context.annotation.bean; impor org.springframework.context.annotation.configuration; impor com.imooc.security.core.properties.securityproperties;/** * Configure The Bean dari Kelas Implementasi Aktual dari ValidateCodener @ValideGeregen @ValidErg; Konfigurasikan kacang dari kelas implementasi aktual dari validateCodegenerator * seperti implementasi kode verifikasi gambar dan implementasi kode verifikasi SMS * @author lohaoyang * @date 5 Maret 2018 */ @ConfigurationPublic Class PublicProdErperBeanConfig {@Autowired Private Security SecurityProperies SecurityProPerties SecurityProPerTerPerTerPerTerPerTerPerTer; /** * @description: * @ConditionAnonMissingBean Anotasi berarti bahwa ketika wadah musim semi tidak memiliki imagecodegenerator, fungsinya adalah membuat program lebih mudah diperluas. Kelas konfigurasi dikonfigurasi dalam modul inti. Ini berarti bahwa jika proyek yang mengacu pada modul * memiliki implementasinya sendiri, yang mengimplementasikan antarmuka validateCodegenerator dan mendefinisikan implementasinya sendiri. Nama ini juga disebut ImageCodegenerator, * digunakan untuk mengimplementasikan implementasi tingkat aplikasi, dan jika tidak ada implementasi seperti itu, gunakan implementasi default ini. * @param @return * @return ValidateCodeGenerator * @throws * @author lihaoyang * @date March 5, 2018*/ @Bean @ConditionalOnMissingBean(name="imageCodeGenerator") public ValidateCodeGenerator imageCodeGenerator(){ ImageCodeGenerator codeGenerator = new ImageCodeGenerator(); codegenerator.setsecurityproperties (SecurityProperties); mengembalikan codegenerator; }}Dengan cara ini, jika suatu modul mengacu pada modul kode verifikasi ini, ia menyesuaikan implementasi, seperti:
Paket com.imooc.code; impor org.springframework.stereotype.sconponent; impor org.springframework.web.context.request.servletwebRequest; impor com.imooc.security.core.validate.code.imageCode; impor; com.imooc.security.core.validate.code.ValidateCodeGenerator;@Component("imageCodeGenerator")public class DemoImageCodeGenerator implements ValidateCodeGenerator { @Override public ImageCode generator(ServletWebRequest request) { System.err.println("generated verification code for the demo project implementation,,"); kembali nol; }}Dengan cara ini, ketika ValidAtecodeBeanConfig mengkonfigurasi kacang verifikasi, itu akan menggunakan implementasi khusus pengguna.
Kode lengkap ditempatkan di github: https://github.com/lhy1234/spring-security
Meringkaskan
Di atas adalah contoh kode fungsi kode verifikasi gambar keamanan musim semi yang diperkenalkan kepada Anda oleh editor. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!