Spring与jcaptcha集成

来源:互联网 发布:苹果mac电脑办公软件 编辑:程序博客网 时间:2024/05/16 08:18

需求:

验证码非常常见,那么在spring中使用jcaptcha进行认证那么需要集成

实现:

mvn:

<!-- code check captcha start --><dependency>  <groupId>com.octo.captcha</groupId>  <artifactId>jcaptcha</artifactId>  <version>1.0</version></dependency><!-- code check captcha end -->

一般仓库中没有对应的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>

基于注解mvc,那么图片的请求路径为Controller,流程为请求path:/anon/getcode产生验证码

这样spring的配置信息为:

<context:component-scan base-package="com.someabcd.csr" /><!-- check code start --><bean id="captchaService"  class="com.octo.captcha.service.multitype.GenericManageableCaptchaService">  <description>验证码服务</description>  <constructor-arg index="0">    <ref bean="com.someabcd.csr.web.crsCaptchaEngine" />  </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.someabcd.csr.web.crsCaptchaEngine类为:

@Component("com.someabcd.csr.web.crsCaptchaEngine")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));  }}

处理请求的Controller:

@Controller@RequestMapping("anon")public class AnonController {  @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;    }  }}

验证码的显示:

<tr>  <td colspan="2" align="center">    <img         src="${basePath}anon/getcode"        onclick="this.src='${basePath}anon/getcode?d='+new Date()*1" width="160" height="30"/>  </td></tr><tr>  <td height="40" align="right">    <strong>      验证码:    </strong>  </td>  <td>    <input name="code" type="text" id="code" vld="{required:true}" class="input"/>  </td></tr>

验证码验证代码块:

Boolean isCorrect = Boolean.FALSE;String captchaId = request.getSession().getId();String code = request.getParameter("code");try {  isCorrect = captchaService.validateResponseForID(captchaId,      code);  if (!isCorrect) {    log.info("check code error!");    return "usr/tologin";  }} catch (Exception e) {  log.error(e.getMessage());}

备注:

可以把CaptchaEngine也配置的配置文件中,好处是可以随时修改,缺点是20%的事情缺耗费了80%时间,且这20%不重要

转自http://www.tuicool.com/articles/rMre63

0 0
原创粉丝点击