在傳統 Java Web 開發中,驗證碼與二維碼生成往往需要引入工具類、編寫 Servlet、處理圖片流。本文介紹一種零 Java 代碼、純 XML 配置的輕量級方案——利用 jelly-core-1.7.0.GA.jar,僅需在 web.xml 註冊 Servlet 即可實現多樣式驗證碼與可定製二維碼生成,極大簡化開發流程。
jelly-core-1.7.0.GA.jar 放入項目 WEB-INF/lib 目錄。web.xml 即可生效。核心 Servlet:org.jelly.image.ValidateCode,映射路徑如 /idCode。通過 <init-param> 的 style 參數切換樣式:
| 樣式 | style 值 | 視覺效果 | 配置片段 |
|---|---|---|---|
| 波紋(默認) | wave | 背景波浪干擾,字符扭曲 | 無需 init-param,直接註冊 Servlet |
| 陰影 | shadow | 字符帶陰影立體感 | <param-name>style</param-name><param-value>shadow</param-value> |
| 魚眼 | fishEye | 中心凸起魚眼鏡頭效果 | <param-name>style</param-name><param-value>fishEye</param-value> |
<servlet>
<servlet-name>ValidateCode</servlet-name>
<servlet-class>org.jelly.image.ValidateCode</servlet-class>
<init-param>
<param-name>style</param-name>
<param-value>shadow</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ValidateCode</servlet-name>
<url-pattern>/idCode</url-pattern>
</servlet-mapping>
<img src="<%=request.getContextPath()%>/idCode" onclick="this.src=this.src+'?'+Math.random()" />
所有參數均在 <init-param> 中設置,屬性名區分大小寫:
| 參數名 | 說明 | 默認值 | 可選值/範例 |
|---|---|---|---|
| border | 是否顯示邊框 | no | yes / no |
| borderColor | 邊框顏色 | black | RGB值 / 顏色名稱(red, #FF0000) |
| borderThickness | 邊框粗細 | 1 | 數值 |
| width | 圖片寬度(不建議修改) | 230 | 數值 |
| height | 圖片高度(不建議修改) | 90 | 數值 |
| fontSize | 字體大小(不建議修改) | 70 | 數值 |
| fontColor | 字體顏色 | black | RGB / 顏色名稱 |
| fontFamily | 字體名稱 | Arial,Helvetica... | 字體名稱列表 |
| charString | 字符集類型 | NU | N(數字) L(小寫) U(大寫) NL NU LU NLU |
| charLength | 字符長度 | 4 | 數值 |
| charSpace | 字符間距 | 1 | 數值 |
| noiseColor | 干擾線顏色 | black | RGB / 顏色名稱 |
| sessionKey | Session 存儲鍵名 | idCode | 自定義字符串 |
提示:
width/height/fontSize標註「不建議配置」,因為庫內部已根據字符長度自動計算最佳尺寸,強制修改可能導致顯示異常。
核心 Servlet:org.jelly.image.Qrcode,映射路徑如 /qrcode。通過參數定製:
| 參數名 | 說明 | 默認值 | 可選值 |
|---|---|---|---|
| size | 圖片大小(模塊數) | 7 | 數值(越大越清晰) |
| imageType | 輸出圖片格式 | jpg | png, bmp, gif, jpg, jpeg |
| foreground | 前景色(碼色) | black | RGB / 顏色名稱 |
| background | 背景色 | white | RGB / 顏色名稱 |
| errorCorrect | 容錯等級 | H (30%) | L(7%) M(15%) Q(25%) H(30%) |
<servlet>
<servlet-name>Qrcode</servlet-name>
<servlet-class>org.jelly.image.Qrcode</servlet-class>
<init-param>
<param-name>foreground</param-name>
<param-value>pink</param-value>
</init-param>
<init-param>
<param-name>errorCorrect</param-name>
<param-value>H</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Qrcode</servlet-name>
<url-pattern>/qrcode</url-pattern>
</servlet-mapping>
二維碼內容通過請求參數 data 傳遞:
<img src="<%=request.getContextPath()%>/qrcode?data=HelloWorld" />
表單提交時,從 Session 取出驗證碼比對:
String inputCode = request.getParameter("validateCode");
String sessionCode = (String) session.getAttribute("idCode"); // 對應 sessionKey
if (sessionCode != null && sessionCode.equalsIgnoreCase(inputCode)) {
// 校驗通過
} else {
// 校驗失敗
}
kaptcha、google-zxing 或 hutool 等活躍庫。對於中小型項目、快速原型、內部管理系統,jelly-core 以「零代碼、純配置」極致簡化了驗證碼與二維碼接入成本。只需丟 JAR、改 web.xml、寫一行 <img> 標籤即可上線。若業務演進至高定製、高併發、分布式場景,再引入成熟庫重構即可——技術選型的核心,始終是「當下足夠用,未來好擴展」。