1. 前台页面代码:  页面刷新时会自动请求 ${pageContext.request.contextPath}/yanzheng?yz=&time=-1111 这个action

<form name="f" action="" method="post">
用户名 : <input id="name" type="text" name="userDTO.userName" /><br>
密 码 : <input type="password" name="userDTO.passWord" /><br>
验证码 : <input type="checkCode" name="userDTO.checkCode" /><br>
<img id="myzmDiv" src="${pageContext.request.contextPath}/yanzheng?yz=&time=-1111" onClick="yanZhengMa()" style="width: 80px; height: 40px; border-radius: 4px">
<input type="button" value="submit1" onclick="javascript:document.f.action='user/login';document.f.submit();" />
</form>
<!-- 点击图片同样请求这个 action 进行刷新验证码,  需要传入一个当前时间戳,  避免缓存不更新,   变量yz没用,  懒得删 -->
<script type="text/javascript">
function yanZhengMa(){
var yz = "";
$("#myzmDiv").attr("src","${pageContext.request.contextPath}/yanzheng?yz="+yz+"&time="+new Date());
}
</script>

2. struts.xml配置文件   不需要result标签返回,   会自动返回到 请求页面

  <package name="user2" namespace="/" extends="struts-default">
<action name="yanzheng" class="com.test.actions.YanzhengAction" method="yanzhengma" />
</package>

3.  yanzhengma   方法实现   会将随机生成的数字图片发回到请求页面,  并且会将生成的数字存储到 session中, key 和 value 都是生成的随机数

public String yanzhengma() throws IOException {
//"{\"code\":501,\"info\":\"已经在业务中使用,不能删除\"}";
HttpSession session = ServletActionContext.getRequest().getSession();
String code="";
Captcha cha=new SpecCaptcha();
char[] shu=cha.alphas();
for(int i=0;i<shu.length;i++){
code+=shu[i]+"";
}
Captcha captcha = new SpecCaptcha(58,28,4,shu);// gif格式动画验证码
HttpServletResponse response = ServletActionContext.getResponse();
ServletOutputStream out = response.getOutputStream();
captcha.out(out);
session.setAttribute(code, code);
out.flush();
out.close();
return null;
}

  3-1 >    附属类: Captcha.java

package com.test.Util;

import java.awt.Color;
import java.awt.Font;
import java.io.OutputStream; public abstract class Captcha
{
protected Font font = new Font("Verdana", Font.ITALIC|Font.BOLD, 18); // 字体
protected int len = 4; // 验证码随机字符长度
protected int width = 78; // 验证码显示跨度
protected int height = 30; // 验证码显示高度
private String chars = null; // 随机字符串
protected char[] shu;
/**
* 生成随机字符数组
* @return 字符数组
*/
public char[] alphas()
{
char[] cs = new char[len];
for(int i = 0;i<len;i++)
{
cs[i] = Randoms.alpha();
}
chars = new String(cs);
return cs;
}
public Font getFont()
{
return font;
} public void setFont(Font font)
{
this.font = font;
} public int getLen()
{
return len;
} public void setLen(int len)
{
this.len = len;
} public int getWidth()
{
return width;
} public void setWidth(int width)
{
this.width = width;
} public int getHeight()
{
return height;
} public void setHeight(int height)
{
this.height = height;
} public String getChars() {
return chars;
}
public void setChars(String chars) {
this.chars = chars;
}
public char[] getShu() {
return shu;
}
public void setShu(char[] shu) {
this.shu = shu;
}
/**
* 给定范围获得随机颜色
* @return Color 随机颜色
*/
protected Color color(int fc, int bc)
{
if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + Randoms.num(bc - fc);
int g = fc + Randoms.num(bc - fc);
int b = fc + Randoms.num(bc - fc);
return new Color(r, g, b);
}
/**
* 验证码输出,抽象方法,由子类实现
* @param os 输出流
*/
public abstract void out(OutputStream os); /**
* 获取随机字符串
* @return string
*/
public String text()
{
return chars;
}
}

  3-2 >    附属类: Randoms.java

package com.test.Util;

import java.util.Random;

/**  

  * <p>随机工具类</p>  

  *  

  * @author: wuhongjun  

  * @version:1.0  

  */ 

 public class Randoms  

 {  

     private static final Random RANDOM = new Random();  

     //定义验证码字符.去除了O和I等容易混淆的字母  

    /* public static final char ALPHA[]={'A','B','C','D','E','F','G','H','G','K','M','N','P','Q','R','S','T','U','V','W','X','Y','Z' 

             ,'a','b','c','d','e','f','g','h','i','j','k','m','n','p','q','r','s','t','u','v','w','x','y','z','2','3','4','5','6','7','8','9'};  */

     public static final char ALPHA[]={'1','2','3','4','5','6','7','8','9'};  

     /**  

      * 产生两个数之间的随机数  

      * @param min 小数  

      * @param max 比min大的数  

      * @return int 随机数字  

      */ 

     public static int num(int min, int max)  

     {  

         return min + RANDOM.nextInt(max - min);  

     }  

     /**  

      * 产生0--num的随机数,不包括num  

      * @param num 数字  

      * @return int 随机数字  

      */ 

     public static int num(int num)  

     {  

         return RANDOM.nextInt(num);  

     }  

     public static char alpha()  

     {  

         return ALPHA[num(0, ALPHA.length)];  

     }  

 } 

  3-3 >    附属类: SpecCaptcha.java

package com.test.Util;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream; import javax.imageio.ImageIO; /**
* <p>png格式验证码</p>
*
* @author: wuhongjun
* @version:1.0
*/
public class SpecCaptcha extends Captcha
{
public SpecCaptcha()
{
}
public SpecCaptcha(int width, int height)
{
this.width = width;
this.height = height;
}
public SpecCaptcha(int width, int height, int len,char[] shu){
this(width,height);
this.len = len;
this.shu=shu;
}
public SpecCaptcha(int width, int height, int len, Font font,char[] shu){
this(width,height,len,shu);
this.font = font;
}
/**
* 生成验证码
* @throws java.io.IOException IO异常
*/
@Override
public void out(OutputStream out){
graphicsImage(this.shu, out);
} /**
* 画随机码图
* @param strs 文本
* @param out 输出流
*/
private boolean graphicsImage(char[] strs, OutputStream out){
boolean ok = false;
try
{
BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D)bi.getGraphics();
AlphaComposite ac3;
Color color ;
int len = strs.length;
g.setColor(Color.WHITE);
g.fillRect(0,0,width,height);
// 随机画干扰的蛋蛋
for(int i=0;i<15;i++){
color = color(150, 250);
g.setColor(color);
g.drawOval(Randoms.num(width), Randoms.num(height), 5+Randoms.num(10), 5+Randoms.num(10));// 画蛋蛋,有蛋的生活才精彩
color = null;
}
g.setFont(font);
int h = height - ((height - font.getSize()) >>1),
w = width/len,
size = w-font.getSize()+1;
/* 画字符串 */
for(int i=0;i<len;i++)
{
ac3 = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f);// 指定透明度
g.setComposite(ac3);
color = new Color(20 + Randoms.num(110), 20 + Randoms.num(110), 20 + Randoms.num(110));// 对每个字符都用随机颜色
g.setColor(color);
g.drawString(strs[i]+"",(width-(len-i)*w)+size, h-4);
color = null;
ac3 = null;
}
ImageIO.write(bi, "png", out);
out.flush();
ok = true;
}catch (IOException e){
ok = false;
}finally
{
Streams.close(out);
}
return ok;
}
}

  3-3 >    附属类: Streams.java

package com.test.Util;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; public class Streams { /** * 关闭输入流 * @param in 输入流 */ public static void close(InputStream in) { if (in != null) { try { in.close(); } catch (IOException ioex) { // ignore } } } /** * 关闭输出流 * @param out 输出流 */ public static void close(OutputStream out) { if (out != null) { try { out.flush(); } catch (IOException ioex) { // ignore } try { out.close(); } catch (IOException ioex) { // ignore } } } }

4.  点击登录按钮后   后台action 校验 验证码是否正确 (userDTO.getCheckCode()   获取前台页面传递过来的 用户输入的验证码)

public String login() {
HttpSession session2 = ServletActionContext.getRequest().getSession();
String checkCode = (String)session2.getAttribute(userDTO.getCheckCode());
if(checkCode == null) {
return "login";
}else {
return "welcome";
}
}

web 页面 验证码 实现的更多相关文章

  1. web页面 验证码 生成

    web页面 验证码 生成 kaptcha 是一个非常实用的验证码生成工具.有了它,你可以生成各种样式的验证码,因为它是可配置的.kaptcha工作的原理是调用 com.google.code.kapt ...

  2. 活动 Web 页面人机识别验证的探索与实践

    在电商行业,线上的营销活动特别多.在移动互联网时代,一般为了活动的快速上线和内容的即时更新,大部分的业务场景仍然通过 Web 页面来承载.但由于 Web 页面天生“环境透明”,相较于移动客户端页面在安 ...

  3. python之web自动化验证码识别解决方案

    验证码识别解决方案 对于web应用程序来讲,处于安全性考虑,在登录的时候,都会设置验证码,验证码的类型种类繁多,有图片中辨别数字字母的,有点击图片中指定的文字的,也有算术计算结果的,再复杂一点就是滑动 ...

  4. Microsoft.Office.Interop.Excel的用法以及利用Microsoft.Office.Interop.Excel将web页面转成PDF

    1.常见用法           using Microsoft.Office.Interop.Excel; 1)新建一个Excel ApplicationClass ExcelApp = New A ...

  5. IOS客户端UIwebview下web页面闪屏问题

    基于ios客户端uiwebview下的web页面,在其内容高度大于视窗高度时,如果点击超过视窗下文档的底部按钮,收缩内容高度,会发生闪屏问题. 外因是由文档的高度大于视窗的高度所致,本质原因未知. 解 ...

  6. DWR实现后台推送消息到web页面

    DWR简介 DWR(Direct Web Remoting)可用于实现javascript直接调用java函数和后台直接调用页面javascript代码,后者可用作服务端推送消息到Web前端. (服务 ...

  7. web页面放到手机页面,缩放问题

    有时候写页面样式不规范,很多页面元素写死尺寸时,web页面尺寸比较大放到移动端访问时,就背缩放了,div或者按钮变得好小 可以加段js,效果会好点 <script> ! function( ...

  8. 微信开发之移动手机WEB页面(HTML5)Javascript实现一键拨号及短信发送功能

    在做一个微信的微网站中的一个便民服务电话功能的应用,用到移动web页面中列出的电话号码,点击需要实现调用通讯录,网页一键拨号的拨打电话功能. 如果需要在移动浏览器中实现拨打电话,发送email,美国服 ...

  9. 移动端WEB页面

    百度前端技术学院第一阶段任务十一,关于移动端WEB页面布局,参考资料如下(都是一些网页链接): MDN:手机网页开发 MDN:在移动浏览器中使用viewport元标签控制布局 移动前端开发和 Web ...

随机推荐

  1. Luogu 3237 [HNOI2014]米特运输

    BZOJ 3573 发现当一个点的权值确定了,整棵树的权值也会随之确定,这个确定关系表现在根结点的总权值上,如果一个点$x$的权值为$v$,那么一步步向上跳后,到根节点的权值就会变成$x*$每一个点的 ...

  2. ShopNc登录验证码

  3. TreeView的绑定与读取

    /// <summary>        /// 绑定TreeView        /// </summary>        public void BindTreeVie ...

  4. Linux下安装memcache PHP扩展

    [root@centos memcache-2.2.4]# wget http://pecl.php.net/get/memcache-2.2.4.tgz [root@centos memcache- ...

  5. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(2):SSM+Redis概念理解

    一.SSM+Redis的结构图 在Java互联网中,以Spring+SpringMVC+MyBatis(SSM)作为主流框架,SSM+Redis的结构图如下: 二.下面介绍它们各自承担的功能: 1.S ...

  6. cad转shapefile文件

    private ESRI.ArcGIS.Controls.AxTOCControl axTOCControl1; private ESRI.ArcGIS.Controls.AxLicenseContr ...

  7. 关于在datepicker中,只选年月

    有这么个需求,datepicker默认是选某个具体的日子的,但是现在只选到年月为止, solution: html如下: <div> <label for="startDa ...

  8. indexOf(String.indexOf 方法)

    字符串的IndexOf()方法搜索在该字符串上是否出现了作为参数传递的字符串,如果找到字符串,则返回字符的起始位置 (0表示第一个字符,1表示第二个字符依此类推)如果说没有找到则返回 -1 返回 St ...

  9. 数据库去重与join连表

    join连表删除的效率与检测存在之后删除的效率比,后者的效率低了很多

  10. .Net Core 项目区域请求设置

    .net core 和asp.net MVC区域请求有个区别,这里重点记录一下 asp.net MVC 区域请求直接是/区域名称/控制名称/方法名称,其他不需要设置任何东西,而Core 项目这样请求路 ...