/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.web.portal.captcha; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.enonic.cms.core.Path; import com.enonic.cms.core.captcha.CaptchaRepository; import com.enonic.cms.web.portal.PortalWebContext; import com.enonic.cms.web.portal.handler.WebHandlerBase; @Component public final class CaptchaHandler extends WebHandlerBase { private CaptchaRepository captchaRepository; @Override protected boolean canHandle( final Path localPath ) { return localPath.containsSubPath( "_captcha" ); } @Override protected void doHandle( final PortalWebContext context ) throws Exception { final HttpServletRequest request = context.getRequest(); final HttpServletResponse response = context.getResponse(); try { byte[] captchaChallengeAsJpeg; ByteArrayOutputStream imageOutputStream = new ByteArrayOutputStream(); HttpSession session = request.getSession(); BufferedImage challenge = captchaRepository.createCaptcha( session ).getImage(); ImageIO.write( challenge, "png", imageOutputStream ); captchaChallengeAsJpeg = imageOutputStream.toByteArray(); // flush it in the response response.setHeader( "Cache-Control", "no-store" ); response.setHeader( "Pragma", "no-cache" ); response.setDateHeader( "Expires", 0 ); response.setContentType( "image/png" ); ServletOutputStream responseOutputStream = response.getOutputStream(); responseOutputStream.write( captchaChallengeAsJpeg ); responseOutputStream.flush(); responseOutputStream.close(); } catch ( IllegalArgumentException e ) { response.sendError( HttpServletResponse.SC_NOT_FOUND ); } } @Autowired public void setCaptchaRepository( CaptchaRepository captchaRepository ) { this.captchaRepository = captchaRepository; } }