更新時間:2022-08-05 10:18:13 來源:動力節(jié)點(diǎn) 瀏覽3889次
Java郵箱驗(yàn)證方法有哪些?動力節(jié)點(diǎn)小編來告訴大家。
幾乎每個有用戶注冊的應(yīng)用程序都需要電子郵件驗(yàn)證。
電子郵件地址分為三個主要部分:本地部分、@符號和域。例如,如果“ username@domain.com ”是一封電子郵件,那么:
本地部分 = 用戶名
@=@
域 = domain.com
通過字符串操作技術(shù)驗(yàn)證電子郵件地址可能需要花費(fèi)大量精力,因?yàn)槲覀兺ǔP枰?jì)算和檢查所有字符類型和長度。但是在 Java 中,通過使用Java正則表達(dá)式,它會容易得多。
眾所周知,正則表達(dá)式是用于匹配模式的字符序列。在以下部分中,我們將了解如何使用幾種不同的正則表達(dá)式方法來執(zhí)行電子郵件驗(yàn)證。
驗(yàn)證電子郵件地址的最簡單的正則表達(dá)式是^(.+)@(\S+) $。
它僅檢查電子郵件地址中是否存在@符號。如果存在,則驗(yàn)證結(jié)果返回true,否則結(jié)果為false。但是,此正則表達(dá)式不會檢查電子郵件的本地部分和域。
例如,根據(jù)這個正則表達(dá)式,username @domain.com 將通過驗(yàn)證,但username#domain.com將失敗驗(yàn)證。
讓我們定義一個簡單的輔助方法來匹配正則表達(dá)式模式:
public static boolean patternMatches(String emailAddress, String regexPattern) {
return Pattern.compile(regexPattern)
.matcher(emailAddress)
.matches();
}
我們還將編寫代碼以使用此正則表達(dá)式驗(yàn)證電子郵件地址:
@Test
public void testUsingSimpleRegex() {
emailAddress = "username@domain.com";
regexPattern = "^(.+)@(\\S+)$";
assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}
電子郵件地址中缺少@符號也會導(dǎo)致驗(yàn)證失敗。
現(xiàn)在讓我們編寫一個更嚴(yán)格的正則表達(dá)式來檢查本地部分以及電子郵件的域部分:
^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@[^-][A-Za- z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$
使用此正則表達(dá)式在電子郵件地址的本地部分施加以下限制:
它允許從 0 到 9 的數(shù)值。
允許從 a 到 z 的大寫和小寫字母。
允許使用下劃線“_”、連字符“-”和點(diǎn)“.”
本地部分的開頭和結(jié)尾不允許使用點(diǎn)。
不允許使用連續(xù)的點(diǎn)。
對于本地部分,最多允許 64 個字符。
此正則表達(dá)式中域部分的限制包括:
它允許從 0 到 9 的數(shù)值。
我們允許從 a 到 z 的大寫和小寫字母。
連字符“-”和點(diǎn)“.” 不允許在域部分的開頭和結(jié)尾。
沒有連續(xù)的點(diǎn)。
我們還將編寫代碼來測試這個正則表達(dá)式:
@Test
public void testUsingStrictRegex() {
emailAddress = "username@domain.com";
regexPattern = "^(?=.{1,64}@)[A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*@"
+ "[^-][A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})$";
assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}
因此,通過這種電子郵件驗(yàn)證技術(shù)有效的一些電子郵件地址是:
用戶名@domain.com
用戶名@domain.com
用戶名@domain.com
用戶名@domain.co.in
用戶名@domain.com
以下是通過此電子郵件驗(yàn)證無效的一些電子郵件地址的候選名單:
用戶名.@domain.com
.user.name@domain.com
用戶名@domain.com。
用戶名@.com
正則表達(dá)式適用于用英語編寫的電子郵件地址,但不適用于非拉丁語電子郵件地址。
所以我們將編寫一個正則表達(dá)式,我們也可以使用它來驗(yàn)證 unicode 字符:
^(?=.{1,64}@)[\\p{L}0-9_-]+(\\.[\\p{L}0-9_-]+)*@[^-][ \\p{L}0-9-]+(\\.[\\p{L}0-9-]+)*(\\.[\\p{L}]{2,})$
我們可以使用此正則表達(dá)式來驗(yàn)證 Unicode 或非拉丁電子郵件地址以支持所有語言。
讓我們通過編寫測試來檢查這個正則表達(dá)式:
@Test
public void testUsingUnicodeRegex() {
emailAddress = "用戶名@領(lǐng)域.電腦";
regexPattern = "^(?=.{1,64}@)[\\p{L}0-9_-]+(\\.[\\p{L}0-9_-]+)*@"
+ "[^-][\\p{L}0-9-]+(\\.[\\p{L}0-9-]+)*(\\.[\\p{L}]{2,})$";
assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}
此正則表達(dá)式不僅提供了一種更嚴(yán)格的電子郵件地址驗(yàn)證方法,而且還支持非拉丁字符。
我們可以使用 RFC 標(biāo)準(zhǔn)提供的,而不是編寫自定義正則表達(dá)式來驗(yàn)證電子郵件地址。
RFC 5322是RFC 822的更新版本,為電子郵件驗(yàn)證提供了正則表達(dá)式。
讓我們來看看:
^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-] +@ [a-zA-Z0-9.-]+$
正如我們所看到的,這是一個非常簡單的正則表達(dá)式,它允許電子郵件中的所有字符。
但是,它不允許使用豎線字符 (|) 和單引號 ('),因?yàn)樗鼈冊趶目蛻舳苏军c(diǎn)傳遞到服務(wù)器時存在潛在的SQL 注入風(fēng)險(xiǎn)。
讓我們編寫代碼以使用此正則表達(dá)式驗(yàn)證電子郵件:
@Test
public void testUsingRFC5322Regex() {
emailAddress = "username@domain.com";
regexPattern = "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$";
assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}
我們編寫了正則表達(dá)式來驗(yàn)證電子郵件地址的本地和域部分。現(xiàn)在我們還將編寫一個正則表達(dá)式來檢查電子郵件的頂級域。
以下正則表達(dá)式驗(yàn)證電子郵件地址的頂級域部分:
^[\\w!#$%&'*+/=?`{|}~^-]+(?:\\.[\\w!#$%&'*+/=?`{|} ~^-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$
此正則表達(dá)式主要檢查電子郵件地址是否只有一個點(diǎn),以及頂級域中是否存在最少兩個和最多六個字符。
我們還將編寫一些代碼來使用這個正則表達(dá)式來驗(yàn)證電子郵件地址:
@Test
public void testTopLevelDomain() {
emailAddress = "username@domain.com";
regexPattern = "^[\\w!#$%&'*+/=?`{|}~^-]+(?:\\.[\\w!#$%&'*+/=?`{|}~^-]+)*"
+ "@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}$";
assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}
現(xiàn)在讓我們編寫一個正則表達(dá)式來限制電子郵件地址中點(diǎn)的使用:
^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+(?:\\.[a-zA-Z0-9_!#$%&'* +/=?`{|}~^-]+)*@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$
上面的正則表達(dá)式用于限制連續(xù)點(diǎn)、前導(dǎo)點(diǎn)和尾隨點(diǎn)。因此,一封電子郵件可以包含多個點(diǎn),但在本地和域部分中不連續(xù)。
讓我們看一下代碼:
@Test
public void testRestrictDots() {
emailAddress = "username@domain.com";
regexPattern = "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+(?:\\.[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+)*@"
+ "[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$";
assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}
此正則表達(dá)式由OWASP 驗(yàn)證正則表達(dá)式存儲庫提供,用于檢查電子郵件驗(yàn)證:
^[a-zA-Z0-9_+&*-] + (?:\\.[a-zA-Z0-9_+&*-] + )*@(?:[a-zA-Z0-9- ]+\\.) + [a-zA-Z]{2, 7}
此正則表達(dá)式還支持標(biāo)準(zhǔn)電子郵件結(jié)構(gòu)中的大多數(shù)驗(yàn)證。
讓我們使用以下代碼驗(yàn)證電子郵件地址:
@Test
public void testOwaspValidation() {
emailAddress = "username@domain.com";
regexPattern = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}
有一種特殊情況僅適用于 Gmail 域:允許在電子郵件的本地部分使用字符 + 字符。對于 Gmail 域,兩個電子郵件地址username+something@gmail.com和username@gmail.com是相同的。
此外,username @gmail.com類似于user+name@gmail.com。
我們必須實(shí)現(xiàn)一個稍微不同的正則表達(dá)式,它也將通過這種特殊情況的電子郵件驗(yàn)證:
^(?=.{1,64}@)[A-Za-z0-9_-+]+(\\.[A-Za-z0-9_-+]+)*@[^-][A- Za-z0-9-+]+(\\.[A-Za-z0-9-+]+)*(\\.[A-Za-z]{2,})$
讓我們寫一個例子來測試這個用例:
@Test
public void testGmailSpecialCase() {
emailAddress = "username+something@domain.com";
regexPattern = "^(?=.{1,64}@)[A-Za-z0-9\\+_-]+(\\.[A-Za-z0-9\\+_-]+)*@"
+ "[^-][A-Za-z0-9\\+-]+(\\.[A-Za-z0-9\\+-]+)*(\\.[A-Za-z]{2,})$";
assertTrue(EmailValidation.patternMatches(emailAddress, regexPattern));
}
Apache Commons Validator是一個包含標(biāo)準(zhǔn)驗(yàn)證規(guī)則的驗(yàn)證包。所以通過導(dǎo)入這個包,我們可以應(yīng)用電子郵件驗(yàn)證。
我們可以使用EmailValidator類來驗(yàn)證電子郵件,它使用 RFC 822 標(biāo)準(zhǔn)。此驗(yàn)證器包含用于驗(yàn)證電子郵件的自定義代碼和正則表達(dá)式的混合。它不僅支持特殊字符,還支持我們討論過的 Unicode 字符。
讓我們在項(xiàng)目中添加commons-validator依賴項(xiàng):
<dependency>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
<version>${validator.version}</version>
</dependency>
現(xiàn)在我們可以使用以下代碼驗(yàn)證電子郵件地址:
@Test
public void testUsingEmailValidator() {
emailAddress = "username@domain.com";
assertTrue(EmailValidator.getInstance()
.isValid(emailAddress));
}
以上就是關(guān)于“Java郵箱驗(yàn)證方法”的介紹,大家如果對此比較感興趣,想了解更多相關(guān)知識,可以關(guān)注一下動力節(jié)點(diǎn)的Java在線學(xué)習(xí),里面的課程內(nèi)容從入門到精通,細(xì)致全面,通俗易懂,適合沒有基礎(chǔ)的小伙伴學(xué)習(xí),希望對大家能夠有所幫助。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743