在jeecms v5中验证码采用的是jcaptcha实现。具体使用如下:
验证码采用请求servlet方式更新实现。
package com.jeecms.common.captcha; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.output.ByteArrayOutputStream; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import com.octo.captcha.service.CaptchaServiceException; import com.octo.captcha.service.image.ImageCaptchaService; /** * 提供验证码图片的Servlet */ @SuppressWarnings("serial") public class JcaptchaServlet extends HttpServlet { public static final String CAPTCHA_IMAGE_FORMAT = "jpeg"; private ImageCaptchaService captchaService; @Override public void init() throws ServletException { WebApplicationContext appCtx = WebApplicationContextUtils .getWebApplicationContext(getServletContext()); captchaService = (ImageCaptchaService) BeanFactoryUtils .beanOfTypeIncludingAncestors(appCtx, ImageCaptchaService.class); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { byte[] captchaChallengeAsJpeg = null; // the output stream to render the captcha image as jpeg into ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream(); try { // get the session id that will identify the generated captcha. // the same id must be used to validate the response, the session id // is a good candidate! String captchaId = request.getSession(true).getId(); BufferedImage challenge = captchaService.getImageChallengeForID( captchaId, request.getLocale()); // Jimi.putImage("image/jpeg", challenge, jpegOutputStream); ImageIO.write(challenge, CAPTCHA_IMAGE_FORMAT, jpegOutputStream); } catch (IllegalArgumentException e) { response.sendError(HttpServletResponse.SC_NOT_FOUND); return; } catch (CaptchaServiceException e) { response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); return; } // catch (JimiException e) { // response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); // return; // } captchaChallengeAsJpeg = jpegOutputStream.toByteArray(); // flush it in the response response.setHeader("Cache-Control", "no-store"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); response.setContentType("image/" + CAPTCHA_IMAGE_FORMAT); ServletOutputStream responseOutputStream = response.getOutputStream(); responseOutputStream.write(captchaChallengeAsJpeg); responseOutputStream.flush(); responseOutputStream.close(); } }
captcha-context.xml xml配置如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" default-lazy-init="true"> <!--kaptcha验证码 <bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha"> <property name="config"> <bean class="com.google.code.kaptcha.util.Config"> <constructor-arg type="java.util.Properties"> <value>kaptcha.border=yes</value> </constructor-arg> </bean> </property> </bean> --> <bean id="captchaService" class="com.octo.captcha.service.multitype.GenericManageableCaptchaService"> <constructor-arg index="0" ref="imageEngine"/> <constructor-arg type="int" index="1" value="180"/> <constructor-arg type="int" index="2" value="100000"/> <constructor-arg type="int" index="3" value="75000"/> </bean> <bean id="imageEngine" class="com.octo.captcha.engine.GenericCaptchaEngine"> <constructor-arg index="0"> <list> <ref bean="captchaFactory"/> </list> </constructor-arg> </bean> <bean id="captchaFactory" class="com.octo.captcha.image.gimpy.GimpyFactory"> <constructor-arg> <ref bean="wordgen"/> </constructor-arg> <constructor-arg> <ref bean="wordtoimage"/> </constructor-arg> </bean> <bean id="wordgen" class= "com.octo.captcha.component.word.wordgenerator.RandomWordGenerator"> <!--可选字符--> <constructor-arg> <value>aabbccddeefgghhkkmnnooppqqsstuuvvwxxyyzz</value> </constructor-arg> </bean> <bean id="wordtoimage" class="com.octo.captcha.component.image.wordtoimage.ComposedWordToImage"> <constructor-arg index="0"> <ref bean="fontGenRandom"/> </constructor-arg> <constructor-arg index="1"> <ref bean="backGenUni"/> </constructor-arg> <constructor-arg index="2"> <ref bean="decoratedPaster"/> </constructor-arg> </bean> <bean id="fontGenRandom" class="com.octo.captcha.component.image.fontgenerator.RandomFontGenerator"> <!--最小字体--> <constructor-arg index="0"> <value>26</value> </constructor-arg> <!--最大字体--> <constructor-arg index="1"> <value>34</value> </constructor-arg> <constructor-arg index="2"> <list> <bean class="java.awt.Font"> <constructor-arg index="0"><value>Arial</value></constructor-arg> <constructor-arg index="1"><value>0</value></constructor-arg> <constructor-arg index="2"><value>32</value></constructor-arg> </bean> </list> </constructor-arg> </bean> <bean id="backGenUni" class="com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator"> <!--背景宽度--> <constructor-arg index="0"> <value>110</value> </constructor-arg> <!--背景高度--> <constructor-arg index="1"> <value>50</value> </constructor-arg> </bean> <bean id="decoratedPaster" class="com.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster"> <!--最大字符长度--> <constructor-arg type="java.lang.Integer" index="0"> <value>4</value> </constructor-arg> <!--最小字符长度--> <constructor-arg type="java.lang.Integer" index="1"> <value>4</value> </constructor-arg> <!--文本颜色--> <constructor-arg index="2"> <ref bean="colorGen"/> </constructor-arg> <!--文本混淆--> <constructor-arg index="3"> <list> <!--<ref bean="baffleDecorator"/>--> </list> </constructor-arg> </bean> <bean id="baffleDecorator" class="com.octo.captcha.component.image.textpaster.textdecorator.BaffleTextDecorator"> <constructor-arg type="java.lang.Integer" index="0"><value>1</value></constructor-arg> <constructor-arg type="java.awt.Color" index="1"><ref bean="colorWrite"/></constructor-arg> </bean> <bean id="colorGen" class="com.octo.captcha.component.image.color.SingleColorGenerator"> <constructor-arg type="java.awt.Color" index="0"> <ref bean="colorBlack"/> </constructor-arg> </bean> <bean id="colorWrite" class="java.awt.Color"> <constructor-arg type="int" index="0"> <value>255</value> </constructor-arg> <constructor-arg type="int" index="1"> <value>255</value> </constructor-arg> <constructor-arg type="int" index="2"> <value>255</value> </constructor-arg> </bean> <bean id="colorBlack" class="java.awt.Color"> <constructor-arg type="int" index="0"> <value>50</value> </constructor-arg> <constructor-arg type="int" index="1"> <value>50</value> </constructor-arg> <constructor-arg type="int" index="2"> <value>50</value> </constructor-arg> </bean> </beans>
web.xml配置如下:
<servlet> <servlet-name>Jcaptcha</servlet-name> <servlet-class>com.jeecms.common.captcha.JcaptchaServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Jcaptcha</servlet-name> <url-pattern>/captcha.svl</url-pattern> </servlet-mapping>
验证过程如下:
com.jeecms.cms.action.admin.CmsLoginAct
@RequestMapping(value = "/login.do", method = RequestMethod.POST) public String submit(String username, String password, String captcha, String message, HttpServletRequest request, HttpServletResponse response, ModelMap model) { Integer errorRemaining = unifiedUserMng.errorRemaining(username); WebErrors errors = validateSubmit(username, password, captcha, errorRemaining, request, response); if (!errors.hasErrors()) { try { String ip = RequestUtils.getIpAddr(request); Authentication auth = authMng.login(username, password, ip, request, response, session); // 是否需要在这里加上登录次数的更新?按正常的方式,应该在process里面处理的,不过这里处理也没大问题。 cmsUserMng.updateLoginInfo(auth.getUid(), ip); CmsUser user = cmsUserMng.findById(auth.getUid()); if (user.getDisabled()) { // 如果已经禁用,则退出登录。 authMng.deleteById(auth.getId()); session.logout(request, response); throw new DisabledException("user disabled"); } cmsLogMng.loginSuccess(request, user, "login.log.loginSuccess"); removeCookieErrorRemaining(request, response); if(user!=null){ //登录成功返回后台首页 return "redirect:index.do"; }else{ return "redirect:login.do"; } } catch (UsernameNotFoundException e) { errors.addErrorString(e.getMessage()); cmsLogMng.loginFailure(request, "login.log.loginFailure", "username=" + username ); } catch (BadCredentialsException e) { errors.addErrorString(e.getMessage()); cmsLogMng.loginFailure(request, "login.log.loginFailure", "username=" + username ); } catch (DisabledException e) { errors.addErrorString(e.getMessage()); cmsLogMng.loginFailure(request, "login.log.loginFailure", "username=" + username ); } } // 登录失败 writeCookieErrorRemaining(errorRemaining, request, response, model); errors.toModel(model); if (!StringUtils.isBlank(message)) { model.addAttribute(MESSAGE, message); } return "login"; }
相关推荐
在Jeecms v9.2这个内容管理系统上,我们可以通过修改源码来实现验证码的屏蔽,以便更有效地执行性能测试。 Jeecms是一款基于Java开发的企业级内容管理框架,它提供了丰富的功能和高度的定制性。在Jeecms v9.2中,...
jeecms安装完毕后,找到项目对应的目录,把三个文件进行替换,就可以在注册、登录、留言时免验证码。登录密码错误三次后显示验证码,输入任意数如123就行。注明:jeecms9.2版本已验证通过。
**JEECMS V6系统使用说明书** 江西金磊科技发展有限公司在2014年8月30日推出了基于JEECMS V6版本的系统使用说明书,为用户提供详尽的操作指南。JEECMS是一个功能强大的Java内容管理系统,适用于企业级网站的建设和...
JEECMS系统使用说明书
### JEECMS 2012 系统使用手册核心知识点总结 #### 一、系统简介 JEECMS是一款基于Java EE技术栈构建的内容管理系统(Content Management System, CMS),旨在为用户提供一套完整且易于操作的网站建设解决方案。该...
### Jeecms2012系统使用手册知识点详解 #### 一、系统简介与环境搭建 **Jeecms2012系统概述** Jeecms2012是一款基于Java技术构建的内容管理系统(Content Management System, CMS)。它利用Java语言的强大特性,提供...
JEECMS v2012用户手册 ...JEECMS v2012用户手册提供了Jeecms系统的使用说明书,指导用户如何使用Jeecms系统,包括系统简介、环境搭建、后台管理篇等多个方面。用户可以通过本手册了解Jeecms系统的使用方法和技术架构。
### JEECMS-V7系统使用说明书关键知识点解析 #### 一、系统简介 **1.1 JEECMS V7 版本概述** JEECMS V7 是一款基于 Java 技术构建的内容管理系统(CMS),该系统由江西金磊科技发展有限公司开发。它是一款在国内...
### JEECMS系统标签使用概述 #### 一、引言 JEECMS是一款基于Java语言开发的开源内容管理系统(Content Management System, CMS),广泛应用于企业门户、政府网站、新闻媒体等多种类型的网站建设。对于JEECMS系统的...
Jeecms开源内容管理系统是一款基于Java技术开发的内容管理框架,专为互联网和企业内部网站提供高效、便捷的内容管理和发布服务。这款系统以其高度可定制化、易用性和强大的功能著称,深受开发者和运维人员的喜爱。 ...
这些文档是学习和使用Jeecms标签的重要参考资料,包含了标签的属性介绍、示例代码以及实际应用场景,可以帮助开发者快速理解和掌握Jeecms的标签系统。 总之,Jeecms标签是其强大功能的关键组成部分,通过熟练掌握和...
**JEECMS V6系统使用说明书** JEECMS是一款基于Java EE(JEE6)技术栈的开源内容管理系统,专为构建企业级网站提供高效、安全的解决方案。它结合了内容管理、用户权限控制、模板引擎、搜索引擎优化等功能,旨在简化...
**JEECMS 2012 系统使用手册**是江西金磊科技发展有限公司为用户提供的一款详尽的在线内容管理系统(CMS)的操作指南。该手册涵盖了从系统基础到高级功能的所有方面,旨在帮助用户更好地理解和使用JEECMS v2012版本。 ...
【CMS程序】JEECMS 2.4.2 系统程序是一款基于Java技术和JSP(JavaServer Pages)的应用程序,适用于构建内容管理系统。这款源码Demo是几年前的作品,主要目的是为了帮助计算机科学与技术专业的学生进行毕业设计学习...
Jeecms内容管理系统是一款专为网站内容管理设计的开源软件,它提供了强大的后台管理功能,包括文章发布、图片管理、用户管理、权限控制等。在深入理解Jeecms之前,我们首先需要关注的是如何顺利地编译其源码,因为这...
Jeecms2012是一款基于Java技术的开源内容管理系统,它提供了丰富的标签库供开发者在构建网站时使用。这个“jeecms2012标签使用教程”应该是指导用户如何有效利用这些标签来提高开发效率和提升网站功能的专业资料。 ...
【CMS程序】JEECMS 2.4.2 系统源码是一个基于Java和JSP技术的开源内容管理系统(CMS)源代码示例,主要用于教育目的,特别是针对计算机科学和软件工程专业的学生进行毕业设计学习。这个版本的JEECMS提供了一个实际的...
本文档将深入讲解Jeecms 3.0.4版本的源码安装与使用过程,帮助开发者全面了解其内部机制,以便更好地进行二次开发和系统维护。 首先,我们需要准备的环境包括: 1. **Java运行环境(JRE)**:确保计算机已安装JRE ...