博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
struts2生成随机验证码图片
阅读量:6591 次
发布时间:2019-06-24

本文共 5167 字,大约阅读时间需要 17 分钟。

之前想做一个随机验证码的功能,自己也搜索了一下别人写的代码,然后自己重新用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);    }    @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;    }}

以上是生成随机验证码图片的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;    }    @Override    public String execute() throws Exception    {        return SUCCESS;    }        @Override    public void validate()    {        HttpSession session = ServletActionContext.getRequest().getSession();                String checkCode2 = (String)session.getAttribute("checkCode");                if(!checkCode.equals(checkCode2))        {            this.addActionError("输入的验证码不正确,请重新输入!");        }    }}

下面是struts.xml配置部分代码:

      
image/jpeg
inputStream
      
/success.jsp
/login.jsp

最后就是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+"/";%>              My JSP 'login.jsp' starting page        

带有验证码的登陆界面

用户名:
密码 :
验证码:
           

到此,就完成用struts2生成随机验证码图片以及实现登陆验证啦!

转载地址:http://hazio.baihongyu.com/

你可能感兴趣的文章
图片加载框架之Fresco
查看>>
Spotify开源其Cassandra编排工具cstar
查看>>
高性能web建站规则(将js放在页面底部)
查看>>
Java EnumMap工作原理及实现
查看>>
阐述Spring框架中Bean的生命周期?
查看>>
虚拟内存管理
查看>>
注水、占坑、瞎掰:起底机器学习学术圈的那些“伪科学”
查看>>
大数据小视角1:从行存储到RCFile
查看>>
JavaScript常用设计模式
查看>>
第18天:京东网页头部制作
查看>>
好消息:Dubbo & Spring Boot要来了
查看>>
面向对象封装的web服务器
查看>>
南开大学提出新物体分割评价指标,相比经典指标错误率降低 69.23%
查看>>
初创公司MindMaze研发情绪反应VR,让VR关怀你的喜怒哀乐
查看>>
绕开“陷阱“,阿里专家带你深入理解C++对象模型的特殊之处
查看>>
ElasticSearch
查看>>
9-51单片机ESP8266学习-AT指令(测试TCP服务器--51单片机程序配置8266,C#TCP客户端发信息给单片机控制小灯的亮灭)...
查看>>
物联网安全形势严峻——除严加管控外别无选择
查看>>
香港设计师带来仿生机器人,其身体 70% 构造均由3D打印完成
查看>>
bootstrap16-上下文表格布局
查看>>