package com.baizhi.action; import java.io.ByteArrayInputStream; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import cn.hutool.captcha.CaptchaUtil; import cn.hutool.captcha.LineCaptcha; public class CodeAction { private ByteArrayInputStream imageStream; //画验证码,并通过流返回到调用位置,将验证码对象放入session中 public String code() { LineCaptcha captcha = CaptchaUtil.createLineCaptcha(150, 50, 4, 6); imageStream = new ByteArrayInputStream(captcha.getImageBytes()); HttpSession session = ServletActionContext.getRequest().getSession(); session.setAttribute("cap", captcha);
//将验证码写进浏览器
Response response = ServletActionContext.getResponse();
ServletOutputStream outputStream = response.getOutputStream();
captcha.write(outputStream);
//return "ok";
return null; } public ByteArrayInputStream getImageStream() { return imageStream; } public void setImageStream(ByteArrayInputStream imageStream) { this.imageStream = imageStream; } }
package com.baizhi.action; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import cn.hutool.captcha.LineCaptcha; public class UserAction { private String code; public String login() { //判断账号和密码 //从session中获取验证码对象 HttpSession session = ServletActionContext.getRequest().getSession(); LineCaptcha captcha = (LineCaptcha)session.getAttribute("cap"); //判断验证码是否输入正确 boolean verify = captcha.verify(code); System.out.println("用户输入的验证码为:"+verify); return "loginOk"; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } }
package com.baizhi.test; import java.util.Scanner; import cn.hutool.captcha.CaptchaUtil; import cn.hutool.captcha.CircleCaptcha; import cn.hutool.captcha.LineCaptcha; import cn.hutool.captcha.ShearCaptcha; public class CodeTest { public static void main(String[] args) { //使用糊涂工具包画验证码 //CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 80, 4, 100); LineCaptcha captcha = CaptchaUtil.createLineCaptcha(200, 80, 6, 6); //ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(200, 80, 4, 1); //将验证码保存到d://a.jpg captcha.write("D://a.jpg"); Scanner sc = new Scanner(System.in); String next = sc.next(); //判断用户输入是否正确 boolean verify = captcha.verify(next); System.out.println(verify); } }
jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="${pageContext.request.contextPath }/user/login"> 账户:<input type="text" /><br/> 密码:<input type="text" /><br/> <img src='${pageContext.request.contextPath}/vericode/Code_showCode' alt="" id="sr" onclick='chance()' height='50px' > <input type="submit" /> </form> </body> </html>
mapper.xml
<package name="code" extends="struts-default"> <action name="code" class="com.baizhi.action.CodeAction" method="code"> <!-- <result name="ok" type="stream"> <param name="contentType">image/jpeg</param> <param name="inputName">imageStream</param> <param name="bufferSize">2048</param> </result> --> </action> </package>
其实利用的是src可以的路径可以请求action
利用jQuery绑定点击事件可以实现点击更换验证码
<script type="text/javascript"> function chance() { var img=document.getElementById("sr"); img.src="${pageContext.request.contextPath }/validateCode?a="+ Math.random(); } </script>