如何用Jpatchca和Spring MVC实现验证码?这篇文章运用了实例代码展示,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
Jpatchca不支持集群环境,默认的验证码不是保存在session中,如果想做个性化的处理很麻烦。其实我想要的就是一个声称图片的流就ok了,剩下的事情就交给程序员自己实现吧。
最终,选择了patchca(另一个开源的组件)来实现,这个验证码是放到session中的,也可以自己指定。很灵活。
这里对Jpatchca做个备忘:
<dependency> <groupId>com.octo.captcha</groupId> <artifactId>jcaptcha</artifactId> <version>2.0-alpha-1</version> </dependency> <dependency> <groupId>com.octo.captcha</groupId> <artifactId>jcaptcha-integration-simple-servlet</artifactId> <version>2.0-alpha-1</version> <exclusions> <exclusion> <artifactId>servlet-api</artifactId> <groupId>javax.servlet</groupId> </exclusion> </exclusions> </dependency>
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name>Lrtech_framework</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:framework/spring-front.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/spring-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
<?xml version="1.0" encoding="UTF-8"?> <!--suppress XmlUnboundNsPrefix --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <mvc:annotation-driven/> <context:annotation-config/> <context:component-scan base-package="com.lavasoft.ntv.web"/> <mvc:resources mapping="/backui/**" location="/backui/"/> <mvc:resources mapping="/frontui/**" location="/frontui/"/> <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> <property name="favorPathExtension" value="true" /> <property name="favorParameter" value="true" /> <property name="parameterName" value="format" /> <property name="ignoreAcceptHeader" value="true" /> <property name="mediaTypes"> <value> json=application/json xml=application/xml html=text/html </value> </property> <property name="defaultContentType" value="text/html" /> </bean> <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="order" value="1" /> <property name="contentNegotiationManager" ref="contentNegotiationManager"/> <property name="defaultViews"> <list> <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"> <property name="prettyPrint" value="true"/> <property name="extractValueFromSingleKeyModel" value="true"/> </bean> </list> </property> </bean> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="contentType" value="text/html;charset=UTF-8" /> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/pages/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
<?xml version="1.0" encoding="UTF-8"?> <beans default-autowire="byName" 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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" xmlns:context="http://www.springframework.org/schema/context"> <import resource="classpath:/framework/spring-back.xml"/> <bean id="fastHashMapCaptchaStore" class="com.octo.captcha.service.captchastore.FastHashMapCaptchaStore"/> <bean id="captchaEngineEx" class="com.lavasoft.ntv.web.captchea.MyCaptchaEngine"/> <bean id="p_w_picpathCaptchaService" class="com.octo.captcha.service.p_w_picpath.DefaultManageableImageCaptchaService"> <constructor-arg type="com.octo.captcha.service.captchastore.CaptchaStore" index="0"> <ref bean="fastHashMapCaptchaStore"/> </constructor-arg> <constructor-arg type="com.octo.captcha.engine.CaptchaEngine" index="1"> <ref bean="captchaEngineEx"/> </constructor-arg> <constructor-arg index="2"> <value>180</value> </constructor-arg> <constructor-arg index="3"> <value>100000</value> </constructor-arg> <constructor-arg index="4"> <value>75000</value> </constructor-arg> </bean> </beans>
package com.lavasoft.ntv.web.captchea; import com.octo.captcha.component.p_w_picpath.backgroundgenerator.BackgroundGenerator; import com.octo.captcha.component.p_w_picpath.backgroundgenerator.UniColorBackgroundGenerator; import com.octo.captcha.component.p_w_picpath.color.RandomListColorGenerator; import com.octo.captcha.component.p_w_picpath.deformation.ImageDeformation; import com.octo.captcha.component.p_w_picpath.deformation.ImageDeformationByFilters; import com.octo.captcha.component.p_w_picpath.fontgenerator.FontGenerator; import com.octo.captcha.component.p_w_picpath.fontgenerator.RandomFontGenerator; import com.octo.captcha.component.p_w_picpath.textpaster.DecoratedRandomTextPaster; import com.octo.captcha.component.p_w_picpath.textpaster.TextPaster; import com.octo.captcha.component.p_w_picpath.textpaster.textdecorator.TextDecorator; import com.octo.captcha.component.p_w_picpath.wordtop_w_picpath.DeformedComposedWordToImage; import com.octo.captcha.component.p_w_picpath.wordtop_w_picpath.WordToImage; import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator; import com.octo.captcha.component.word.wordgenerator.WordGenerator; import com.octo.captcha.engine.p_w_picpath.ListImageCaptchaEngine; import com.octo.captcha.p_w_picpath.gimpy.GimpyFactory; import java.awt.*; import java.awt.p_w_picpath.ImageFilter; /** * 生成验证码引擎实现 * * @author leizhimin 14-5-4 上午10:55 */ public class MyCaptchaEngine extends ListImageCaptchaEngine { protected void buildInitialFactories() { int minWordLength = 4; int maxWordLength = 4; int fontSize = 16; int p_w_picpathWidth = 120; int p_w_picpathHeight = 28; WordGenerator wordGenerator = new RandomWordGenerator("23456789abcdefghjkmnpqrstuvwxyz"); 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(p_w_picpathWidth, p_w_picpathHeight, 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 word2p_w_picpath = new DeformedComposedWordToImage(font, background, randomPaster, backDef, textDef, postDef); addFactory(new GimpyFactory(wordGenerator, word2p_w_picpath)); } }
package com.lavasoft.ntv.web; import com.octo.captcha.service.CaptchaServiceException; import com.octo.captcha.service.p_w_picpath.ImageCaptchaService; import com.sun.p_w_picpath.codec.jpeg.JPEGCodec; import com.sun.p_w_picpath.codec.jpeg.JPEGImageEncoder; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.p_w_picpath.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; /** * 登录逻辑 * * @author leizhimin 14-5-4 上午11:00 */ @Controller public class LoginController { @Resource(name = "p_w_picpathCaptchaService") private ImageCaptchaService p_w_picpathCaptchaService; /** * 生成验证码图片io流 */ @RequestMapping(value = "/generateImage") public void ImageCaptcha(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("------------------- /generateImage"); byte[] captchaChallengeAsJpeg = null; ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream(); try { String sessionid = request.getSession().getId(); BufferedImage challenge = p_w_picpathCaptchaService.getImageChallengeForID(sessionid, request.getLocale()); JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream); jpegEncoder.encode(challenge); } catch (Exception e) { e.printStackTrace(); } captchaChallengeAsJpeg = jpegOutputStream.toByteArray(); response.setHeader("Cache-Control", "no-store"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); response.setContentType("p_w_picpath/jpeg"); ServletOutputStream responseOutputStream = response.getOutputStream(); responseOutputStream.write(captchaChallengeAsJpeg); responseOutputStream.flush(); responseOutputStream.close(); } /** * 验证验证码,并进行登录 */ @RequestMapping("/login") private String LoginAction(HttpServletRequest request, HttpServletResponse response, String username, String password, String yzm) { boolean flag = false; String sessionid = request.getSession().getId(); String captcha_value = request.getParameter("yzm"); System.out.println("反馈的验证码:" + captcha_value); try { flag = p_w_picpathCaptchaService.validateResponseForID(sessionid, captcha_value); } catch (CaptchaServiceException e) { } System.out.println("验证结果为:" + flag + ",sessionID=" + sessionid + ",验证码=" + captcha_value); if (flag) { //todo:验证用户名和密码逻辑, } return flag ? "good" : "error"; } @RequestMapping("/hello") private String hello() { System.out.println("-------hello!------"); return "hello"; } @RequestMapping("/mp") private ModelMap mp() { System.out.println("-------ModelMap!------"); ModelMap map = new ModelMap(); map.put("as", "sadfas"); map.put("as1", "sadfas"); map.put("as2", "sadfas"); return map; } @RequestMapping("/mp2") private ModelAndView mp2() { System.out.println("-------ModelMap!------"); ModelAndView mv = new ModelAndView(); ModelMap map = mv.getModelMap(); map.put("as1", "sadfas1"); map.put("as2", "sadfas2"); mv.setViewName("mp2"); return mv; } }
<html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <link href="../backui/ligerUI/skins/Aqua/css/ligerui-all.css" rel="stylesheet" type="text/css"/> <link href="../backui/ligerUI/skins/Tab/css/form.css" rel="stylesheet" type="text/css"/> <script src="../backui/jquery/jquery-1.4.4.min.js" type="text/javascript"></script> <script src="../backui/ligerUI/js/ligerui.all.js" type="text/javascript"></script> <script src="../backui/jquery-validation/jquery.validate.min.js" type="text/javascript"></script> <script src="../backui/jquery-validation/jquery.metadata.js" type="text/javascript"></script> <script src="../backui/jquery-validation/messages_cn.js" type="text/javascript"></script> <style type="text/css"> input.error { border: 1px dotted red; } label.error { background-p_w_picpath: url('../backui/jquery-validation/pic/error.png'); background-repeat: no-repeat; padding-left: 18px; color: red; } .align-center1{ margin:0 auto; /* 居中 这个是必须的,,其它的属性非必须 */ width: 400px; background-color: #9AC6FF; text-align:left; /* 文字等内容居中 */ } </style> <script> function chanage(srcObj){ srcObj.src="/ntv/generateImage?"+Math.random(); } $().ready(function () { $.metadata.setType("attr", "validate"); $("#bt_login"). alert("bt_login"); }) $("#signupForm").validate(); }); </script> </head> <body> <div class="align-center1">sdfasdf</div> <div class="align-center1"> <form id="signupForm" method="get" action="/ntv/login"> <p> <label for="firstname">username</label> <input id="firstname" name="firstname" validate="{required:true}"/> <p> <p> <label for="password">password</label> <input id="password" name="password" type="password" validate="{required:true,minlength:1}"/> </p> <p> <label for="confirm_password">确认密码</label> <input id="confirm_password" name="confirm_password" type="password" validate="{equalTo:'#password'}"/> </p> <p> <label for="confirm_password">验证码</label> <input id="yzm" name="yzm" type="text"validate="{required:true"/> <img id="img_yzm" src="/ntv/generateImage" </p> <p> <%--<input class="submit" type="submit" value="登录"/>--%> <input type="button" id="bt_login" name="bt_login" value="登录"/> </p> </form> </div> </body> </html>
上述就是小编为大家分享的用Jpatchca和Spring MVC实现验证码的方法了,如果您也有类似的疑惑,不妨参照上述方法进行尝试。如果想了解更多相关内容,请关注亿速云行业资讯。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。