1. 程式人生 > 其它 >使用kaptcha生產純數字驗證碼

使用kaptcha生產純數字驗證碼

使用kaptcha生產純數字驗證碼錄

1引入依賴

    <dependency>
        <groupId>com.github.axet</groupId>
        <artifactId>kaptcha</artifactId>
        <version>0.0.9</version>
    </dependency>

2編寫容器配置類

package com.hengquanrui.controller;

import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import java.awt.image.BufferedImage;

@Controller
@RequestMapping("/kaptcha")
public class CaptchaController {

@Autowired
private Producer captchaProducer;

@CrossOrigin
@RequestMapping("getKaptchaImage")
public ModelAndView getKaptchaImage(HttpServletRequest request, HttpServletResponse response) throws Exception {
    HttpSession session = request.getSession();

    response.setDateHeader("Expires", 0);

    // Set standard 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).
    response.addHeader("Cache-Control", "post-check=0, pre-check=0");

    // Set standard HTTP/1.0 no-cache header.
    response.setHeader("Pragma", "no-cache");

    // return a jpeg
    response.setContentType("image/jpeg");

    // create the text for the image
    String capText = captchaProducer.createText();

    // store the text in the session
    session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);

// String code = (String)session.getAttribute(Constants.KAPTCHA_SESSION_KEY);
// System.out.println("******************驗證碼是: " + code + “******************”);

    // create the image with the text
    BufferedImage bi = captchaProducer.createImage(capText);
    ServletOutputStream out = response.getOutputStream();

    // write the data out
    ImageIO.write(bi, "jpg", out);
    try {
        out.flush();
    } finally {
        out.close();
    }
    return null;
}

}

3生產驗證碼工具類

package com.hengquanrui.controller;

import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.Producer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;

@Controller
@RequestMapping("/kaptcha")
public class CaptchaController {

@Autowired
private Producer captchaProducer;

@Autowired
private static Logger logger = LoggerFactory.getLogger(CaptchaController.class);

@CrossOrigin
@RequestMapping("getImage")
public ModelAndView getKaptchaImage(HttpServletRequest request, HttpServletResponse response) throws Exception {
    HttpSession session = request.getSession();

    response.setDateHeader("Expires", 0);

    // Set standard 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).
    response.addHeader("Cache-Control", "post-check=0, pre-check=0");

    // Set standard HTTP/1.0 no-cache header.
    response.setHeader("Pragma", "no-cache");

    // return a jpeg
    response.setContentType("image/jpeg");

    // create the text for the image
    String capText = captchaProducer.createText();

    // store the text in the session
    session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);

// String code = (String)session.getAttribute(Constants.KAPTCHA_SESSION_KEY);
// System.out.println("******************驗證碼是: " + code + “******************”);

    // create the image with the text
    BufferedImage bi = captchaProducer.createImage(capText);
    ServletOutputStream out = response.getOutputStream();

    // write the data out
    ImageIO.write(bi, "jpg", out);
    try {
        out.flush();
    } finally {
        out.close();
    }
    return null;
}

}

4控制層邏輯

@RequestMapping(value = "/login", method = RequestMethod.POST)
@ResponseBody
public Map loginVerification(HttpServletRequest request, String username, String password,  @RequestParam("code")String code){
    HashMap<String, Object> map = new HashMap<>();

    String sessionCode = (String)request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
    System.out.println(" session中獲取的驗證碼:  " + sessionCode);
    if (!code.equalsIgnoreCase(sessionCode)){
        map.put("code",404);
        map.put("msg","驗證碼錯誤!");
        return map;
    }
    //1.獲取Subject
    Subject user = SecurityUtils.getSubject();
    //2.封裝使用者資訊
    UsernamePasswordToken token = new UsernamePasswordToken(username, password);
    //3.執行登入方法
    try {
        user.login(token);
        map.put("code",200);
        map.put("msg","登陸成功!");
        return map;
    } catch (AuthenticationException e) {
        e.printStackTrace();
    }
    map.put("code",404);
    map.put("msg","登陸失敗!");
    return map;
}

5登陸頁面設定

前端核心程式碼

<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>

                <div class="form-group">
                    <input type="text" class="form-control" name="code" placeholder="驗證碼" required="">
                    <span class="p-new-code l-mar-r15"> <img src="http://127.0.0.1:8081/kaptcha/getImage" class="reloadImage" id="reloadImage"
                                                             width="121" height="40"/> </span>
                    <a href="javaScript:;" class="l-color9 reloadImage">看不清楚,換一張</a>
                </div>

6 訪問你的登入介面測試

在這裡插入圖片描述
注意問題:1,以上如出現圖片載入不出來,可以嘗試把生成圖片介面訪問許可權放開。
2,如果涉及到跨域問題,可以把127.0.0.1改成localhost。
3,可以在properties.setProperty(…),設定純數字驗證碼,或者文字驗證碼。