S2SH框架中的无刷新验证码功能实现
暑假期间在实验室做使用S2SH框架的项目,其中登录和注册需要验证码,实现了一个没有实现刷新验证码功能的简单版本,代码如下:
1 package com.sem.action;
2
3 import java.io.*;
4 import java.util.Map;
5
6 import javax.imageio.ImageIO;
7 import javax.imageio.stream.ImageOutputStream;
8 //import javax.servlet.http.HttpServletRequest;
9 import javax.servlet.http.HttpServletResponse;
10
11 //import org.apache.struts2.interceptor.ServletRequestAware;
12 import org.apache.struts2.interceptor.ServletResponseAware;
13 //import org.springframework.context.annotation.Scope;
14
15 import com.opensymphony.xwork2.ActionContext;
16 import com.opensymphony.xwork2.ActionSupport;
17
18 import java.awt.*;
19 import java.awt.image.BufferedImage;
20
21
22 public class ImageCodeAction extends ActionSupport implements ServletResponseAware {
23
24 private ByteArrayInputStream inputStream;
25 private HttpServletResponse response;
26
27 //生成4个0~9的随机数,放在一个字符串里
28 public String createRandomString() {
29 String str = "";
30 for (int i = 0; i < 4; i++) {
31 str += Integer
32 .toString((new Double(Math.random() * 10)).intValue());
33 }
34 return str;
35 }
36
37 //随机生成一种颜色
38 public Color createsRandomColor() {
39 int r = (new Double(Math.random() * 256)).intValue();
40 int g = (new Double(Math.random() * 256)).intValue();
41 int b = (new Double(Math.random() * 256)).intValue();
42 return new Color(r, g, b);
43 }
44
45 //生成一个内存图片,将四个随机数写在图片上
46 public BufferedImage createImage(String str) {
47 int width = 60;
48 int height = 20;
49 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
50 //获取图形上下文
51 Graphics g = image.getGraphics();
52 //设定背景色
53 g.setColor(Color.WHITE);
54 g.fillRect(0, 0, width, height);
55 //画边框
56 g.setColor(Color.black);
57 g.drawRect(0, 0, width - 1, height - 1);
58 //将验证码显示到图像中
59 g.setFont(new Font("Atlantic Inline", Font.PLAIN, 18));
60 //使用随机颜色
61 g.setColor(this.createsRandomColor());
62 //将随机字符串的每个数字分别写到图片上
63 g.drawString(Character.toString(str.charAt(0)), 8, 17);
64 g.drawString(Character.toString(str.charAt(1)), 20, 17);
65 g.drawString(Character.toString(str.charAt(2)), 33, 17);
66 g.drawString(Character.toString(str.charAt(3)), 45, 17);
67 //图像生效
68 g.dispose();
69 return image;
70 }
71
72 //将图片以字节形式写到InputStream里
73 public ByteArrayInputStream createInputStream() throws Exception {
74 //获取随机字符串
75 String str = this.createRandomString();
76 BufferedImage image = this.createImage(str);
77 //将产生的字符串写入session,供校验时使用
78 ActionContext actionContext = ActionContext.getContext();
79 Map session = actionContext.getSession();
80 session.put("random", str);
81 System.out.print("str: " + str + " session: " + (String)session.get("random") + "\n");
82 ByteArrayOutputStream output = new ByteArrayOutputStream();
83 ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);
84 ImageIO.write(image, "JPEG", imageOut);
85 imageOut.close();
86 ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
87 output.close();
88 return input;
89 }
90
91 //传入action后执行该方法生成图片验证码
92 public String createCodeImage() throws Exception {
93 response.setHeader("Pragma","No-cache");
94 response.setHeader("Cache-Control","no-cache");
95 response.setDateHeader("Expires", 0);
96 setInputStream(createInputStream());
97 return SUCCESS;
98 }
99
100 public ByteArrayInputStream getInputStream() {
101 return inputStream;
102 }
103
104 public void setInputStream(ByteArrayInputStream inputStream) {
105 this.inputStream = inputStream;
106 }
107
108 public void setServletResponse(HttpServletResponse response) {
109 this.response = response;
110 }
111 }
如果想要实现刷新功能,利用JavaScript可以很容易做到。
S2SH框架中的无刷新验证码功能实现的更多相关文章
- ASP.NET MVC3实现无刷新验证码
在MVC中进行留言,评论等功能时,不可避免会用到表单提交时的验证码问题,有时,我们的作法是,当表单被提交后,在controller里去判断验证码的正确与否,但我认为这种用户体验是很差的,今天正好有后时 ...
- [Ajax] AJAX初体验之-在博客中添加无刷新搜索
现在博客很流行,相信应该上网时间稍微长点的朋友都会在这或者在那的有一个自己的博客.对于一些有一定能力的朋友,可能更喜欢自己去下载一个博客程序来架设一个自己的博客,而不是使用一些博客网站提供的服务.而大 ...
- (转)ASP.net中Timer无刷新定时器.
Timer控件要实现无刷新,得用到ajax技术 首先得添加一个ScriptManager控件,然后再添加一个UpdatePanel用于存放Timer控件内容的,就可以实现无刷新了.下面是详细的内容: ...
- SpringCloud 详解配置刷新的原理 使用jasypt自动加解密后 无法使用 springcloud 中的自动刷新/refresh功能
之所以会查找这篇文章,是因为要解决这样一个问题: 当我使用了jasypt进行配置文件加解密后,如果再使用refresh 去刷新配置,则自动加解密会失效. 原因分析:刷新不是我之前想象的直接调用conf ...
- LigerUi框架+jquery+ajax无刷新留言板系统的实现
前些天发布了LigerUi框架的增.删.改代码,一堆代码真的也没一张图片.有的网友推荐上图,所有今天把涉及到这个框架的开源的留言板共享给大家.在修改的过程中可能有些不足的地方希望大家拍砖. 因为留言板 ...
- 不用jquery等框架实现ajax无刷新登录
<script type="text/javascript"> window.onload = function () { document.getElementByI ...
- MVC无刷新分页(即局部刷新,带搜索,页数选择,排序功能)
我查看了很多网站,大部分评论分页都是局部刷新的,可大部分电商商品展示分页都是有刷新页面的,于是我便做了一个商品展示无刷新分页的例子.接下来我就将做一个模仿淘宝已买到的宝贝功能,不过我的是无刷新分页的. ...
- Servlet案例3:验证码功能
这里介绍简单的验证码功能 动态生成图片 一个简单的页面: <!DOCTYPE html> <html> <head> <meta charset=" ...
- MVC无刷新分页
MVC无刷新分页(即局部刷新,带搜索,页数选择,排序功能) 我查看了很多网站,大部分评论分页都是局部刷新的,可大部分电商商品展示分页都是有刷新页面的,于是我便做了一个商品展示无刷新分页的例子.接下 ...
随机推荐
- 使用Berkeley Parser进行句法分析
一.句法分析 1.定义 句法分析判断输入的单词序列(一般为句子)的构成是否合乎给定的语法,并通过构造句法树来确定句子的结构以及各层次句法成分之间的关系,即确定一个句子中的哪些词构成一个短语,哪些词是动 ...
- Boost scoped_ptr scoped_array 以及scoped_ptr与std::auto_ptr对比
boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放.下列代码演示了该指针的基本应用: #include <str ...
- appium的初始化准备工作
文章出处http://blog.csdn.net/jiuzuidongpo/article/details/51790455 Appium在接收到客户端脚本的连接之后的初始化准备工作列表(细节部分详细 ...
- Java集合(2):LinkedList
一.LinkedList介绍 LinkedList也和ArrayList一样实现了List接口,但是它执行插入和删除操作时比ArrayList更加高效,因为它是基于链表的.基于链表也决定了它在随机访问 ...
- 测试Windows live Writer
private String GetRandomint(int codeCount) { Random random = new Random(); string min = "" ...
- 2018 ACM 国际大学生程序设计竞赛上海大都会 F - Color it (扫描线)
题意:一个N*M的矩形,每个点初始都是白色的,有Q次操作,每次操作将以(x,y)为圆心,r为半径的区域涂成黑点.求最后剩余白色点数. 分析:对每行,将Q次操作在该行的涂色视作一段区间,那么该行最后的白 ...
- CodeForces - 919D Substring (拓扑排序+dp)
题意:将一个字符串上的n个字符视作点,给出m条有向边,求图中路径上最长出现的相同字母数. 分析:首先如果这张图中有环,则可以取无限大的字符数,在求拓扑排序的同时可以确定是否存在环. 之后在拓扑排序的结 ...
- 在linux下打开文件出现^M,^H
0 Problem 在服务器上跑keras实验,然后用tee指令把实验结果保存在文本文件中. 文本文件在本机linux下用vim打开文件时会出现^M,^H.用sublime打开也会出现奇怪的字符. 1 ...
- linux 安装 maven
一.下载 1.创建下载软件包目录 mkdir /home/install 2.在/home/install下载maven包,或者将下载好的maven压缩包上传至/home/install wget ...
- Linux网络相关命令firewalld和netfilter、iptables 使用(6/22)
iptables和netfilter的关系: netfilter在内核空间的代码根据table中的rules,完成对packet的分析和处置.但是这些table中的具体的防火墙rules,还是必须由系 ...