【工具,元件類】登入,評論的驗證碼通過kaptcha的實現的方式
阿新 • • 發佈:2019-02-02
有理走遍天下
先說原理,驗證碼生成邏輯如下:
首先請求地址,服務端返回一個頁面地址,頁面端頁面內容包含以下內容:
其中<img />標籤屬性的src指向一個後端controller,該後端內容負責生成驗證碼並放入session中,然後返回至頁面(兩個作用:1,用來前端顯示 2,用來返回至登入controller和使用者輸入的驗證碼做比較),(我們知道session會在一整個會話過程結束之後才會銷燬),當用戶輸入驗證碼之後,會把使用者輸入的內容,和session中存放生成驗證碼資訊做比較。整個過程如上。下面說說具體實現。
第一:要用到kaptcha,那麼必須先匯入相關jar,這裡只說maven專案為例,那麼必須現在pom.xml檔案
中寫入kaptcha相關配置檔案:如下:
<dependency>
<groupId>com.google.code.kaptcha</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
接下來配置appliCationContext.xml檔案加入一下配置,<!--登入頁面校驗碼配置 使用com.google.code.kaptcha -->
<bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha">
<property name="config">
<bean class="com.google.code.kaptcha.util.Config">
<constructor-arg>
<props>
<prop key="kaptcha.border">no</prop> 圖片邊框(yes/no)
<prop key="kaptcha.border.color">105,179,90</prop> 邊框顏色
<prop key="kaptcha.textproducer.font.color">blue</prop> 字型顏色
<prop key="kaptcha.textproducer.font.size">30</prop> 字型大小
<prop key="kaptcha.textproducer.char.space">10</prop> 字型間隔
<prop key="kaptcha.session.key">code</prop> session key
<prop key="kaptcha.textproducer.char.length">4</prop> 驗證碼長度
<prop key="kaptcha.image.width">93</prop> 圖片寬
<prop key="kaptcha.image.height">37</prop> 圖片高
</props>
</constructor-arg>
</bean>
</property>
</bean>
接下來開下相應的Controller程式碼:
//隨機生成驗證碼的控制層
@Controller
@RequestMapping("/kaptcha")
public class CaptchaController {
@Autowired
private Producer captchaProducer/* = null */;
@RequestMapping(value = "/image", method = RequestMethod.GET)
public void getKaptchaImage(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpSession session = request.getSession();
String code = (String)session.getAttribute(Constants.KAPTCHA_SESSION_KEY);
System.out.println("*****session中獲取的驗證碼是: " + code + "*****");
response.setDateHeader("Expires", 0); //禁止服務快取
// Set standard HTTP/1.1 no-cache headers. 設定標準的的HTTP/1.1 no-cache headers
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
// Set IE extended HTTP/1.1 no-cache headers (use addHeader). 設定IE擴充套件 HTTP/1.1
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
// Set standard HTTP/1.0 no-cache header. 設定HTTP/1.0不快取圖片
response.setHeader("Pragma", "no-cache");
// return a jpeg 返回一個jpeg,預設為text/html
response.setContentType("image/jpeg");
// create the text for the image 為圖片建立文字
String capText = captchaProducer.createText();
// store the text in the session 將文字儲存到session中,這裡就包含了保中的靜態變數
session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);
// create the image with the text 差UN關鍵帶有文字的圖片
BufferedImage bi = captchaProducer.createImage(capText);
ServletOutputStream out = response.getOutputStream();
// write the data out 圖片輸出流
ImageIO.write(bi, "JPEG", out);
try {
out.flush();
} finally {
out.close();
}
}
}