第一種
第一步: JSP
<li><input name="validCode" id="validCode" type="text" class="loginvalid" value="" onclick="JavaScript:this.value=''"/><img src="${path}/patchca.htm" id = "patchca" style="display:inline-block; float:right;width:100px; height:48px;line-height:48px;margin-right:100px;padding:0;"></li>
第二步: 后台
@RequestMapping("/patchca.htm")
public void patchca(HttpServletResponse response,HttpSession session) throws IOException
{
CaptchaService cs = new CaptchaService();
response.setContentType("image/png");
response.setHeader("cache", "no-cache");
OutputStream os = response.getOutputStream();
String patchca = EncoderHelper.getChallangeAndWriteImage(cs, "png", os);
session.setAttribute("PATCHCA", patchca);
os.flush();
os.close();
cs = null;
}
第二種
Controller:生成驗證碼
- @RequestMapping("/user/check.jpg")
- public void createCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
- // 通知瀏覽器不要緩存
- response.setHeader("Expires", "-1");
- response.setHeader("Cache-Control", "no-cache");
- response.setHeader("Pragma", "-1");
- CaptchaUtil util = CaptchaUtil.Instance();
- // 將驗證碼輸入到session中,用來驗證
- String code = util.getString();
- request.getSession().setAttribute(“code”, code);
- // 輸出打web頁面
- ImageIO.write(util.getImage(), "jpg", response.getOutputStream());
- }
jsp:顯示驗證碼
- <img id="img" src="<%=basePath%>user/check.jpg" onclick="refresh()">
- function refresh() {
- var url = $("#basePath").val() + "user/check.jpg?number="+Math.random();
- $("#img").attr("src",url);
- }
驗證:
獲取session中的code與前台傳回的code是否一致
- /**
- * 驗證碼驗證
- *
- * @param session
- * @param code
- */
- private void checkCode(HttpSession session, String code) {
- String codeSession = (String) session.getAttribute(“code”);
- if (StringUtils.isEmpty(codeSession)) {
- log.error("沒有生成驗證碼信息");
- throw new IllegalStateException("ERR-01000");
- }
- if (StringUtils.isEmpty(code)) {
- log.error("未填寫驗證碼信息");
- throw new BussinessException("ERR-06018");
- }
- if (codeSession.equalsIgnoreCase(code)) {
- // 驗證碼通過
- } else {
- log.error("驗證碼錯誤");
- throw new BussinessException("ERR-06019");
- }
- }
工具類:
- import java.awt.Color;
- import java.awt.Font;
- import java.awt.Graphics;
- import java.awt.image.BufferedImage;
- import java.util.Random;
- /**
- * 驗證碼生成工具
- * @author HXL
- *
- */
- public class CaptchaUtil {
- private BufferedImage image;// 圖像
- private String str;// 驗證碼
- private static char code[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789".toCharArray();
- public static final String SESSION_CODE_NAME="code";
- private CaptchaUtil() {
- init();// 初始化屬性
- }
- /*
- * 取得RandomNumUtil實例
- */
- public static CaptchaUtil Instance() {
- return new CaptchaUtil();
- }
- /*
- * 取得驗證碼圖片
- */
- public BufferedImage getImage() {
- return this.image;
- }
- /*
- * 取得圖片的驗證碼
- */
- public String getString() {
- return this.str;
- }
- private void init() {
- // 在內存中創建圖象
- int width = 85, height = 20;
- BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
- // 獲取圖形上下文
- Graphics g = image.getGraphics();
- // 生成隨機類
- Random random = new Random();
- // 設定背景色
- g.setColor(getRandColor(200, 250));
- g.fillRect(0, 0, width, height);
- // 設定字體
- g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
- // 隨機產生155條干擾線,使圖象中的認證碼不易被其它程序探測到
- g.setColor(getRandColor(160, 200));
- for (int i = 0; i < 155; i++) {
- int x = random.nextInt(width);
- int y = random.nextInt(height);
- int xl = random.nextInt(12);
- int yl = random.nextInt(12);
- g.drawLine(x, y, x + xl, y + yl);
- }
- // 取隨機產生的認證碼(4位數字)
- String sRand = "";
- for (int i = 0; i < 4; i++) {
- String rand = String.valueOf(code[random.nextInt(code.length)]);
- sRand += rand;
- // 將認證碼顯示到圖象中
- g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
- // 調用函數出來的顏色相同,可能是因為種子太接近,所以只能直接生成
- g.drawString(rand, 13 * i + 6, 16);
- }
- // 賦值驗證碼
- this.str = sRand;
- // 圖象生效
- g.dispose();
- // ByteArrayInputStream input = null;
- // ByteArrayOutputStream output = new ByteArrayOutputStream();
- // try {
- // ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);
- // ImageIO.write(image, "JPEG", imageOut);
- // imageOut.close();
- // input = new ByteArrayInputStream(output.toByteArray());
- // } catch (Exception e) {
- // System.out.println("驗證碼圖片產生出現錯誤:" + e.toString());
- // }
- // this.image = input
- this.image = image;/* 賦值圖像 */
- }
- /*
- * 給定范圍獲得隨機顏色
- */
- private Color getRandColor(int fc, int bc) {
- Random random = new Random();
- if (fc > 255)
- fc = 255;
- if (bc > 255)
- bc = 255;
- int r = fc + random.nextInt(bc - fc);
- int g = fc + random.nextInt(bc - fc);
- int b = fc + random.nextInt(bc - fc);
- return new Color(r, g, b);
- }
- }
最后展示: