之前想做一个随机验证码的功能,自己也搜索了一下别人写的代码,然后自己重新用struts2实现了一下,现在将我自己实现代码贴出来!大家有什么意见都可以指出来!
首先是生成随机验证码图片的action:
CreateImageAction:
package com.xiaoluo.action;import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.Random;import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport;public class CreateImageAction extends ActionSupport {private ByteArrayInputStream inputStream;private static int WIDTH = 60;private static int HEIGHT = 20;public ByteArrayInputStream getInputStream(){return inputStream;}public void setInputStream(ByteArrayInputStream inputStream){this.inputStream = inputStream;}
private static String createRandom(){String str = "0123456789qwertyuiopasdfghjklzxcvbnm";char[] rands = new char[4];Random random = new Random();for (int i = 0; i < 4; i++){rands[i] = str.charAt(random.nextInt(36));}return new String(rands);}private void drawBackground(Graphics g){// 画背景g.setColor(new Color(0xDCDCDC));g.fillRect(0, 0, WIDTH, HEIGHT);// 随机产生 120 个干扰点for (int i = 0; i < 120; i++){int x = (int) (Math.random() * WIDTH);int y = (int) (Math.random() * HEIGHT);int red = (int) (Math.random() * 255);int green = (int) (Math.random() * 255);int blue = (int) (Math.random() * 255);g.setColor(new Color(red, green, blue));g.drawOval(x, y, 1, 0);}}private void drawRands(Graphics g, String rands){g.setColor(Color.BLACK);g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));// 在不同的高度上输出验证码的每个字符g.drawString("" + rands.charAt(0), 1, 17);g.drawString("" + rands.charAt(1), 16, 15);g.drawString("" + rands.charAt(2), 31, 18);g.drawString("" + rands.charAt(3), 46, 16);System.out.println(rands);}@Overridepublic String execute() throws Exception{HttpServletResponse response = ServletActionContext.getResponse();// 设置浏览器不要缓存此图片response.setHeader("Pragma", "no-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);String rands = createRandom();BufferedImage image = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);Graphics g = image.getGraphics();// 产生图像drawBackground(g);drawRands(g, rands);// 结束图像 的绘制 过程, 完成图像g.dispose();ByteArrayOutputStream outputStream = new ByteArrayOutputStream();ImageIO.write(image, "jpeg", outputStream);ByteArrayInputStream input = new ByteArrayInputStream(outputStream.toByteArray());this.setInputStream(input);HttpSession session = ServletActionContext.getRequest().getSession();session.setAttribute("checkCode", rands);input.close();outputStream.close();return SUCCESS;} }
以上是生成随机验证码图片的action,将生成的随机数放到session里,然后页面提交到验证随机数的action:
LoginValidateAction:
package com.xiaoluo.action;import javax.servlet.http.HttpSession;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class LoginValidateAction extends ActionSupport {private String checkCode;public String getCheckCode(){return checkCode;}public void setCheckCode(String checkCode){this.checkCode = checkCode;}@Overridepublic String execute() throws Exception{return SUCCESS;}@Overridepublic void validate(){HttpSession session = ServletActionContext.getRequest().getSession();String checkCode2 = (String)session.getAttribute("checkCode");if(!checkCode.equals(checkCode2)){this.addActionError("输入的验证码不正确,请重新输入!");}} }
下面是struts.xml配置部分代码:
<action name="createImageAction" class="com.xiaoluo.action.CreateImageAction"><result name="success" type="stream"><param name="contentType">image/jpeg</param><param name="inputName">inputStream</param></result></action><action name="loginValidateAction" class="com.xiaoluo.action.LoginValidateAction"><result name="success">/success.jsp</result><result name="input">/login.jsp</result></action>
最后就是jsp部分的代码:
login.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %><html><head><base href="<%=basePath%>"><title>My JSP 'login.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><h3><font color="blue">带有验证码的登陆界面</font></h3><s:form action="loginValidateAction.action" theme="simple">用户名:<s:textfield name="username"></s:textfield><br>密码 :<s:password name="password"></s:password><br>验证码:<s:textfield name="checkCode"></s:textfield>
<!--若要点击图片刷新,重新得到一个验证码,要在后面加上个随机数,这样保证每次提交过去的都是不一样的path,防止因为缓存而使图片不刷新--><img src="createImageAction.action" οnclick="this.src='createImageAction.action?'+ Math.random()" title="点击图片刷新验证码"/><br><s:actionerror cssStyle="color:red"/><s:submit value="提交"></s:submit></s:form></body> </html>
到此,就完成用struts2生成随机验证码图片以及实现登陆验证啦!