1. 程式人生 > >spring mvc 整合 jcaptcha 生成圖形驗證碼

spring mvc 整合 jcaptcha 生成圖形驗證碼

jcaptcha是一個開源的用來生成驗證碼的Java開源元件

maven依賴

<dependency>  
    <groupId>com.octo.captcha</groupId>  
    <artifactId>jcaptcha</artifactId>  
    <version>1.0</version>  
</dependency>  

一般倉庫中沒有對應的jar,比如imaging-01012005.jar那麼需要手動新增倉庫

<repository>  
    <id
>
atlassian</id> <name>atlassian</name> <url>http://maven.jahia.org/maven2</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots>
</repository>

spring配置bean

<context:component-scan base-package="com.pobaicn.ai" />
<bean id="captchaService"  
    class="com.octo.captcha.service.multitype.GenericManageableCaptchaService">  
    <description>驗證碼服務</description>  
    <constructor-arg index
="0">
<ref bean="com.pobaicn.ai.component.CSRCaptchaEngine" /> </constructor-arg> <constructor-arg index="1"> <value>300</value> </constructor-arg><!--超時時間 秒 --> <constructor-arg index="2"> <value>20000</value> </constructor-arg><!--最大併發數 --> <constructor-arg index="3"> <value>20000</value> </constructor-arg> </bean>

com.pobaicn.ai.component.CSRCaptchaEngine類

@Component("com.pobaicn.ai.component.CSRCaptchaEngine")
public class CSRCaptchaEngine extends ListImageCaptchaEngine {

    @Override
    protected void buildInitialFactories() {
        int minWordLength = 4;
        int maxWordLength = 5;
        int fontSize = 50;
        int imageWidth = 152;
        int imageHeight = 100;
        WordGenerator wordGenerator = new RandomWordGenerator(
                "0123456789abcdefghijklmnopqrstuvwxyz");
        TextPaster randomPaster = new DecoratedRandomTextPaster(minWordLength,
                maxWordLength, new RandomListColorGenerator(new Color[] {
                        new Color(23, 170, 27), new Color(220, 34, 11),
                        new Color(23, 67, 172) }), new TextDecorator[] {});
        BackgroundGenerator background = new UniColorBackgroundGenerator(
                imageWidth, imageHeight, Color.white);
        FontGenerator font = new RandomFontGenerator(fontSize, fontSize,
                new Font[] { new Font("nyala", Font.BOLD, fontSize),
                        new Font("Bell MT", Font.PLAIN, fontSize),
                        new Font("Credit valley", Font.BOLD, fontSize) });

        ImageDeformation postDef = new ImageDeformationByFilters(
                new ImageFilter[] {});
        ImageDeformation backDef = new ImageDeformationByFilters(
                new ImageFilter[] {});
        ImageDeformation textDef = new ImageDeformationByFilters(
                new ImageFilter[] {});

        WordToImage word2image = new DeformedComposedWordToImage(font,
                background, randomPaster, backDef, textDef, postDef);
        addFactory(new GimpyFactory(wordGenerator, word2image));

    }

JPEGImageEncoder 這個不是jdk標準類,位於com.sun.image.codec.jpeg; 只需將jdk還成jre即可

controller層

@Controller
@RequestMapping("api")
public class ApiController extends BaseController {
    @Autowired
    private GenericManageableCaptchaService captchaService;

    @RequestMapping(value = "getCode", method = RequestMethod.GET)
    public void getCode(HttpServletRequest httpServletRequest,
            HttpServletResponse httpServletResponse) {
        byte[] captchaChallengeAsJpeg = null;
        // 輸出jpg的位元組流
        ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
        try {
            String captchaId = httpServletRequest.getSession().getId();
            BufferedImage challenge = (BufferedImage) captchaService
                    .getChallengeForID(captchaId,
                            httpServletRequest.getLocale());

            // a jpeg encoder
            JPEGImageEncoder jpegEncoder = JPEGCodec
                    .createJPEGEncoder(jpegOutputStream);
            jpegEncoder.encode(challenge);
            captchaChallengeAsJpeg = jpegOutputStream.toByteArray();

            // flush it in the response
            httpServletResponse.setHeader("Cache-Control", "no-store");
            httpServletResponse.setHeader("Pragma", "no-cache");
            httpServletResponse.setDateHeader("Expires", 0);
            httpServletResponse.setContentType("image/jpeg");
            ServletOutputStream responseOutputStream = httpServletResponse
                    .getOutputStream();
            responseOutputStream.write(captchaChallengeAsJpeg);
            responseOutputStream.flush();
            responseOutputStream.close();
        } catch (Exception e) {
            try {
                httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            return;
        }
    }
}

呼叫方法

<img src="domin/api/getcode"  
                onclick="this.src='domin/api/getcode?d='+new Date()*1" width="160" height="30"/>  

後臺校驗

Boolean isCorrect = Boolean.FALSE;  
String captchaId = request.getSession().getId();  
String code = request.getParameter("code");  
try {  
    isCorrect = captchaService.validateResponseForID(captchaId,code);//true is right  
    //...dosomething
} catch (Exception e) {  
    log.error(e.getMessage());  
}