1. 生成图片和验证码

package com.jmu.code;

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; /**
* 生成图片和验证码类
*
* @author Sky
* @date 2017年3月4日 上午10:18:08
*
*/
public class CreateImageAction extends ActionSupport
{
private static final long serialVersionUID = 1L; 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;
} /**
* 产生随机数
* @return
*/
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);
} @Override
public 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;
}
}

2. 前台jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function refreshImage(obj){
/**
* 每次请求需要一个不同的参数,否则可能会返回同样的验证码
* 这和浏览器的缓存机制有关系,也可以把页面设置为不缓存,这样就不用这个参数了。
*/
var timeNow = new Date().getTime();
obj.src="createImageAction.action?" + timeNow;
}
</script>
</head>
<body>
<form action="loginValidateAction" method="post">
<!--若要点击图片刷新,重新得到一个验证码,要在后面加上个随机数,这样保证每次提交过去的都是不一样的path,防止因为缓存而使图片不刷新-->
验证码:<input type="text" name="checkCode" />
<img src="createImageAction.action" onclick="refreshImage(this)" title="点击图片刷新验证码" />
<br>
<button>提交</button>
</form>
</body>
</html>

3. strut2.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<package name="default" namespace="/" extends="struts-default"> <action name="createImageAction" class="com.jmu.code.CreateImageAction" method="execute">
<result name="success" type="stream">
<param name="contentType">image/jpeg</param>
<param name="inputName">inputStream</param>
</result>
</action> <action name="loginValidateAction" class="com.jmu.code.LoginValidateAction">
<result name="success">/success.jsp</result>
<result name="input">/login.jsp</result>
</action>
</package>
</struts>

4. web.xml 要加上strut2的过滤

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>code</display-name> <filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter> <filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> </web-app>

5. 后台检查输入验证码是否正确

package com.jmu.code;

import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class LoginValidateAction extends ActionSupport
{
private static final long serialVersionUID = 1L;
private String checkCode; @Override
public String execute() throws Exception
{
if(checkCode()){
System.out.println("check success");
}else {
System.out.println("check false");
}
return SUCCESS;
} /**
* 验证验证码是否正确
* @return true or false
*/
public boolean checkCode()
{
HttpSession session = ServletActionContext.getRequest().getSession();
String checkCode2 = (String)session.getAttribute("checkCode"); if(!checkCode.equals(checkCode2))
{
this.addActionError("输入的验证码不正确,请重新输入!");
return false;
}
return true;
} public String getCheckCode()
{
return checkCode;
}
public void setCheckCode(String checkCode)
{
this.checkCode = checkCode;
}
}

目录结构:

最新文章

  1. iOS 7 与 Xamarin - MultiPeer Connectivity(转载)
  2. IIS下打印报表到Excel
  3. Mvc3提交表格验证(转载)
  4. GL_Oracle Erp常用的报表(汇总)
  5. UVa 1593 (水题 STL) Alignment of Code
  6. C# 之 判断或设置以管理员身份运行程序
  7. apache2.4的安装与卸载
  8. Java学习笔记之:Java数组
  9. SqlBulkCoy和普通数据库操作执行速度对比
  10. Git branch (分支学习)
  11. COJ 0986 WZJ的数据结构(负十四) 区间动态k大
  12. SQLite错误总结 error code 19: constraint failed
  13. 小白读iOS冗余资源扫描脚本
  14. JavaWeb之response响应中文乱码问题
  15. Ambari Auto Start(进程自动拉起)
  16. python 路飞模块一考核总结
  17. 浅谈Spring
  18. JS 如何将 HTML 页面导出为多页 PDF
  19. 潭州课堂25班:Ph201805201 django 项目 第三十五课 后台用户权限的添加 mixins 课堂笔记)
  20. &lt;记录&gt; Ubuntu16.04 安装Redis以及phpredis扩展

热门文章

  1. 多线程并行请求问题及SplashActivity预加载问题解决方案
  2. Java初学者最近三次作业的心得体会
  3. Codeforces Round 623(Div. 2,based on VK Cup 2019-2020 - Elimination Round,Engine)D. Recommendations
  4. 【Layui__监听button】在form中监听按钮事件
  5. gulp插件学习01
  6. 王颖奇 20171010129《面向对象程序设计(java)》第十五周学习总结
  7. 基于胜率矩阵的PageRank排序
  8. 排序算法整理(Python实现)
  9. fork...join的用法
  10. [hdu4629 Burning]三角形面积并,扫描线