1. 程式人生 > >【工具,元件類】登入,評論的驗證碼通過kaptcha的實現的方式

【工具,元件類】登入,評論的驗證碼通過kaptcha的實現的方式

有理走遍天下   

先說原理,驗證碼生成邏輯如下:

首先請求地址,服務端返回一個頁面地址,頁面端頁面內容包含以下內容:

其中<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();
		}
	}

}