- 浏览: 735692 次
- 性别:
- 来自: 重庆
文章分类
- 全部博客 (173)
- JAVA (54)
- ORACLE (3)
- JAVASCRIPT (7)
- STRUCT2 (4)
- SPRING (12)
- EXTJS (7)
- JQUERY (4)
- SQLSERVER (10)
- IBATIS (1)
- MYSQL (6)
- JS (1)
- HTML5 (1)
- TOMCAT (3)
- JSP (1)
- HTML (1)
- 数据库 (2)
- HTTP (3)
- MAVEN (2)
- MyBatis (2)
- IDEA (1)
- spring boot (24)
- spring security (1)
- RestEasy (1)
- KAFKA (4)
- MongoDB (2)
- NODEJS (1)
- 非技术 (3)
- logback (1)
- DSL (1)
- thymeleaf (1)
- RedisTemplate (12)
- spring cloud (39)
- fastdfs (1)
- Disruptor (2)
- JAVAFX (1)
- exe4j (1)
- JVM (1)
- ZOOKEEPER (4)
- activiti (1)
- GRADLE (1)
- spring cloud config (7)
- poi (1)
- spring cloud eureka (7)
- Rabbit MQ (1)
- MQ (1)
- Centos (1)
- nifi (1)
- dubbo (1)
最新评论
-
yangganboy:
yangganboy 写道可以看我简书写的 java 运行时修 ...
java动态添加外部jar包到classpath -
yangganboy:
可以看我简书写的 java 运行时修改classpath 添加 ...
java动态添加外部jar包到classpath -
neufjava:
感谢您的分享!参考您的文章解决了困扰我一天的配置问题。再次感谢 ...
FastDFS文件系统的安装使用及代码的调用(单个节点) -
wo_niu:
写的非常
RedisTemplate常用集合使用说明-boundSetOps(九) -
wangyudong:
新版本 Wisdom RESTClienthttps://gi ...
部分介绍使用IDEA的rest client
在我们做web相关的项目时,用户登录的页面是必不可少的,在用户进行页面登录时,除了用户名和密码外,我们一般情况下都会去生成一个验证码来,让用户输入用户名和密码的同时输入验证码来进行用户的登录,在这里我们为什么一般要使用验证码呢?其实道理很简单,就是防止黑客的“暴力”登录,在用户没有使用验证码的时候,黑客可以通过不断的试探用户名和密码来进行系统的登录,使用验证码过后,由于验证码是随机生成的,所以黑客使用暴力的方式进行登录是基本不会成功的,下面就来说说怎么使用SSH的时候来生成随机验证码。
首先是书写一个生成随机验证码的类,其实这个类的实现是比较简单的,当然对于初学者或没有书写过验证码的人来说还是有那么点难度的。这个类的名字是AuthImg.java,由于使用的是Structs2进行页面与逻辑之间的转换,所以继承了Struct2的ActionSupport类。具体代码如下:
package com.ebuy.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 验证码类
* @author kjgj
*
*/
public class AuthImg extends ActionSupport{
//设置图片验证码的字符串的字体和大小
private Font mfont = new Font("Arial Black", Font.PLAIN, 16);
//生成随机颜色
Color getRandColor(int fc,int bc){
Random rand = new Random();
if(fc > 255){
fc = 255;
}
if(bc > 255){
bc = 255;
}
int r = fc + rand.nextInt(bc - fc);
int g = fc + rand.nextInt(bc - fc);
int b = fc + rand.nextInt(bc - fc);
return new Color(r, g, b);
}
public String execute() throws Exception{
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
//防止页面缓存,保证生成的随机码都是新的
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "No-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
//指定验证码图片大小
int width = 100,height = 18;
//生成一张新图片
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//在图片中绘制内容
Graphics g = image.getGraphics();
Random random = new Random();
g.setColor(getRandColor(200, 250));
g.fillRect(1, 1, width-1, height-1);
g.setColor(new Color(102, 102, 102));
g.drawRect(0, 0, width-1, height-1);
g.setFont(mfont);
//随机生成线条,使图片看起来更加杂乱
g.setColor(getRandColor(160, 200));
for(int i = 0; i < 155;i++){
int x = random.nextInt(width - 1);
int y = random.nextInt(height -1);
int x1 = random.nextInt(6) + 1;
int y1 = random.nextInt(12) + 1;
g.drawLine(x, y, x+x1, y+y1);
}
for(int j = 0;j < 70;j++){
int x = random.nextInt(width - 1);
int y = random.nextInt(height -1);
int x1 = random.nextInt(12) + 1;
int y1 = random.nextInt(6) + 1;
g.drawLine(x, y, x-x1, y-y1);
}
//用于保存生成的随机字符串
String sRand = "";
for(int k = 0;k < 6;k++){
//取得一个随机字符
String tmp = getRandomChar();
sRand += tmp;
//将生成的随机字符串添加到验证码图片上
g.setColor(new Color(20+random.nextInt(110), 20+random.nextInt(110), 20+random.nextInt(110)));
g.drawString(tmp, 15*k+10, 15);
}
//取得用户session
HttpSession session = request.getSession(true);
//将生成的随机码放到session中
session.setAttribute("rand", sRand);
g.dispose();
//输出验证码图片
ImageIO.write(image, "JPEG", response.getOutputStream());
return null;
}
//生成随机字符串的方法
private String getRandomChar(){
int rand = (int)Math.round(Math.random()*2);
long ltmp = 0;
char ctmp = '\u0000';
//根据rand的值来生成一个大\小写字母,数字
switch(rand){
//生成大写字母
case 1:
ltmp = Math.round(Math.random() * 25 + 65);
ctmp = (char)ltmp;
return String.valueOf(ctmp);
//生成小写字母
case 2:
ltmp = Math.round(Math.random() * 25 + 97);
ctmp = (char)ltmp;
return String.valueOf(ctmp);
//生成数字
default:
ltmp = Math.round(Math.random() * 9);
return String.valueOf(ltmp);
}
}
}
Structs2的配置文件structs.xml的配置如下:
<constant name="struts.objectFactory" value="spring"></constant>
<package name="demo" extends="struts-default">
<action name="authImg" class="authImg">
<result>/welcome.jsp</result>
</action>
</package>
spring的配置文件applicationContext.xml的配置如下:
<bean id="authImg" class="com.ebuy.util.AuthImg" />
进行展示的welcome.jsp页面的实现如下:
验证码如图:<img alt="" src="authImg.action" id="authImg">看不清楚?<a href="#" onclick="refersh()">单击此处刷新</a>
<script type="text/javascript">
//刷新验证码
function refersh(){
alert("av");
document.getElementById("authImg").src='authImg.action?now=' +(new Date()).getTime();
}
</script>
以上就是实现一个验证码的主要过程
首先是书写一个生成随机验证码的类,其实这个类的实现是比较简单的,当然对于初学者或没有书写过验证码的人来说还是有那么点难度的。这个类的名字是AuthImg.java,由于使用的是Structs2进行页面与逻辑之间的转换,所以继承了Struct2的ActionSupport类。具体代码如下:
package com.ebuy.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 验证码类
* @author kjgj
*
*/
public class AuthImg extends ActionSupport{
//设置图片验证码的字符串的字体和大小
private Font mfont = new Font("Arial Black", Font.PLAIN, 16);
//生成随机颜色
Color getRandColor(int fc,int bc){
Random rand = new Random();
if(fc > 255){
fc = 255;
}
if(bc > 255){
bc = 255;
}
int r = fc + rand.nextInt(bc - fc);
int g = fc + rand.nextInt(bc - fc);
int b = fc + rand.nextInt(bc - fc);
return new Color(r, g, b);
}
public String execute() throws Exception{
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
//防止页面缓存,保证生成的随机码都是新的
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "No-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
//指定验证码图片大小
int width = 100,height = 18;
//生成一张新图片
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//在图片中绘制内容
Graphics g = image.getGraphics();
Random random = new Random();
g.setColor(getRandColor(200, 250));
g.fillRect(1, 1, width-1, height-1);
g.setColor(new Color(102, 102, 102));
g.drawRect(0, 0, width-1, height-1);
g.setFont(mfont);
//随机生成线条,使图片看起来更加杂乱
g.setColor(getRandColor(160, 200));
for(int i = 0; i < 155;i++){
int x = random.nextInt(width - 1);
int y = random.nextInt(height -1);
int x1 = random.nextInt(6) + 1;
int y1 = random.nextInt(12) + 1;
g.drawLine(x, y, x+x1, y+y1);
}
for(int j = 0;j < 70;j++){
int x = random.nextInt(width - 1);
int y = random.nextInt(height -1);
int x1 = random.nextInt(12) + 1;
int y1 = random.nextInt(6) + 1;
g.drawLine(x, y, x-x1, y-y1);
}
//用于保存生成的随机字符串
String sRand = "";
for(int k = 0;k < 6;k++){
//取得一个随机字符
String tmp = getRandomChar();
sRand += tmp;
//将生成的随机字符串添加到验证码图片上
g.setColor(new Color(20+random.nextInt(110), 20+random.nextInt(110), 20+random.nextInt(110)));
g.drawString(tmp, 15*k+10, 15);
}
//取得用户session
HttpSession session = request.getSession(true);
//将生成的随机码放到session中
session.setAttribute("rand", sRand);
g.dispose();
//输出验证码图片
ImageIO.write(image, "JPEG", response.getOutputStream());
return null;
}
//生成随机字符串的方法
private String getRandomChar(){
int rand = (int)Math.round(Math.random()*2);
long ltmp = 0;
char ctmp = '\u0000';
//根据rand的值来生成一个大\小写字母,数字
switch(rand){
//生成大写字母
case 1:
ltmp = Math.round(Math.random() * 25 + 65);
ctmp = (char)ltmp;
return String.valueOf(ctmp);
//生成小写字母
case 2:
ltmp = Math.round(Math.random() * 25 + 97);
ctmp = (char)ltmp;
return String.valueOf(ctmp);
//生成数字
default:
ltmp = Math.round(Math.random() * 9);
return String.valueOf(ltmp);
}
}
}
Structs2的配置文件structs.xml的配置如下:
<constant name="struts.objectFactory" value="spring"></constant>
<package name="demo" extends="struts-default">
<action name="authImg" class="authImg">
<result>/welcome.jsp</result>
</action>
</package>
spring的配置文件applicationContext.xml的配置如下:
<bean id="authImg" class="com.ebuy.util.AuthImg" />
进行展示的welcome.jsp页面的实现如下:
验证码如图:<img alt="" src="authImg.action" id="authImg">看不清楚?<a href="#" onclick="refersh()">单击此处刷新</a>
<script type="text/javascript">
//刷新验证码
function refersh(){
alert("av");
document.getElementById("authImg").src='authImg.action?now=' +(new Date()).getTime();
}
</script>
以上就是实现一个验证码的主要过程
发表评论
-
如何保证在Java多线程中的原子性操作?
2019-08-27 18:46 922在单线程的模 ... -
Java内存模型简单介绍
2019-08-19 19:52 792说到Java内存 ... -
java中线程挂起的几种方式
2019-08-16 18:43 1120在Java中使用线程的时候肯定会有线程挂起的 ... -
自定义线程池简单介绍
2019-08-16 11:37 910线程池的相关概念就不在这里说明了,百度一下有很 ... -
实现自己的spring boot starter
2019-04-04 14:59 932在使用spring boot开发的时候,我 ... -
使用POI实现合并行的导入
2019-03-01 17:24 2689在我们进行导入的时候难免不会遇到合并行的导入 ... -
Spring IOC设计原理解析
2019-01-08 14:02 1044摘自https://www.cnblogs.com/ITt ... -
SpringBoot集成自定义HandlerMethodArgumentResolver参数初始值解析
2018-12-13 09:25 2247大部分摘抄自https://www.cnblogs.com/ ... -
关于spring cloud config加密EncryptionTooWeakException异常说明
2018-11-05 16:00 2148今天在使用spring cloud confi ... -
gradle使用mybatis-generator生成user表相关文件只生成mysql..user的原因说明
2018-07-23 15:42 4170在gradle中使用 ... -
SpringBoot+Activiti的serviceTask注入异常问题
2018-07-13 11:51 7549在使用springboot+activiti ... -
16进制与字符串的互转及转换为byte数组
2018-05-25 14:42 3247import java.io.ByteArrayOutput ... -
JVM学习总结
2018-01-29 17:00 1083JVM作为java的重要组成部分,在j ... -
利用JavaFX创建一个可以订阅发布的MQTT客户端桌面程序
2017-12-08 11:34 2104利用JavaFX我们可以创建出像Swing那样 ... -
java8新特性time类相关介绍
2017-10-30 15:46 1673java8已经出来 ... -
java动态添加外部jar包到classpath
2017-08-17 16:38 3154在项目开发过程中我们有时候需要动态的添加 ... -
java 10进制转16进制带ox格式输出
2017-07-14 16:36 2931摘自https://yq.aliyun.com/wenzha ... -
SpringBoot+thymeleaf简单实现登陆注册及记账功能
2017-06-26 10:58 12534本项目主要是使用了SpringBoot及其 ... -
Java 8的新特性—终极版
2017-05-25 16:42 927前言: Java 8 已经发 ... -
对\\uxx转换为unicode编码的\uxx
2017-03-10 16:17 1476在业务过程中难免会遇到字符串转换为16进制的u ...
相关推荐
在Struts2框架中,实现验证码功能主要是为了增强网站的安全性,防止自动化脚本或恶意用户进行批量、无意义的注册或登录尝试。以下将详细解释如何在Struts2环境中设置验证码并展示其核心组件: 1. **HTML 页面**: ...
Struts2是一个强大的MVC(Model-...总结起来,Struts2实现验证码功能涉及到Java类的编写、session管理、Struts2配置、JSP页面设计以及用户交互逻辑的处理。掌握这些步骤,可以帮助开发者构建安全且用户友好的Web应用。
- "jsp,struts使用struts2.0实现的验证码功能"标签可能指代在JSP页面中使用Struts2的标签库,例如`<s:form>`,`<s:textfield>`,`<s:submit>`等,这些标签简化了表单和Action之间的数据绑定。 6. **struts-...
要实现Struts2中的中文验证码Action,我们需要以下步骤: 1. **配置Struts2**: 首先,确保你的项目已经集成了Struts2框架,并且在`struts.xml`配置文件中添加了Action的配置。Action的配置应包含一个对应的Action类...
通过以上步骤,我们就能在Struts2应用中实现一个完整的验证码功能。这不仅提高了网站的安全性,也为用户提供了更好的交互体验。在实际开发中,还需要根据项目需求进行相应的定制和优化,确保验证码系统既有效又易于...
Struts2作为一款流行的Java Web应用框架,支持多种方式来实现验证码功能。本文将详细介绍如何在Struts2项目中生成并显示验证码。 #### 二、核心概念 1. **验证码**:一种用于区分用户是人还是计算机程序的技术手段...
在本文中,我们将深入探讨如何在Struts2框架中实现验证码功能,并结合JavaScript和session技术来增强用户体验。 首先,验证码的核心是生成一个随机的、难以自动识别的图像。这通常涉及到以下几个步骤: 1. **生成...
在Struts2框架下实现验证码功能,可以帮助提升用户体验和系统安全性。以下将详细讲解如何在Struts2中创建前端注册验证码。 首先,验证码的实现通常包括两个主要部分:后端生成验证码和前端展示及验证。 1. **后端...
### Struts2 下实现图片验证码的关键技术点 #### 一、引言 在现代Web应用中,验证码(CAPTCHA)是一种常见的用户验证机制,用于区分真实用户与自动化软件(如爬虫)。Struts2框架因其丰富的插件支持及灵活性,在...
总结来说,Struts2实现图片验证码主要涉及生成随机字符串、绘制图片、配置Action、定义结果类型以及处理用户验证。这个过程需要结合Java图形编程、HTTP响应处理和会话管理等多个方面的知识。通过实践,你可以更好地...
"struts2-生成图片验证码"的主题表明我们将探讨如何在Struts2框架中实现图片验证码的功能。 验证码通常由随机生成的一串字符组成,这些字符以图像形式显示,用户需要输入他们看到的字符以完成验证。在Struts2中实现...
**标题:“登陆验证码(struts2实现)”,描述中提到的博文链接:https://ewf-momo.iteye.com/blog/1678220** 验证码(CAPTCHA)是一种用于防止自动化程序(如机器人)滥用服务的技术。在登录过程中,验证码能够确保...
1. **生成随机验证码**:首先,我们需要创建一个服务或者Action,生成一个随机字符串作为验证码。这个字符串可以包含字母、数字,甚至符号,长度可以根据需求来设定。生成的验证码通常要存储在一个会话(session)...
在Struts2中实现验证码功能,通常涉及到生成随机字符串、显示图像以及验证用户输入是否与生成的验证码匹配。 本压缩包"struts2做的验证码(区分数字和字母).rar"可能包含了一个实现了数字和字母混合的验证码生成器...
接着,表单中有一个`s:text`标签,用于显示生成的随机验证码,以及一个`s:textfield`让用户输入验证码。验证码图像通过`<img>`标签加载,其`src`属性指向`rand.action`,这是Struts2的Action配置,负责处理验证码的...
在这个"struts2+spring3验证码登录实例"中,验证码功能是一个重要的安全措施,它可以防止恶意的自动登录尝试或机器人攻击。验证码通常由一串随机生成的字符或数字组成,用户需要在输入框中正确输入才能完成登录。...
### Struts2 图片验证码实现解析 #### 一、引言 在Web应用程序中,图片验证码(CAPTCHA)被广泛用于防止自动化攻击和机器人操作,确保用户是真实的人类。Struts2框架提供了丰富的功能来集成这样的安全特性,本文将...
在Struts2中,验证码的实现通常涉及到以下几个关键知识点: 1. **Action类**:在Struts2中,Action类是处理用户请求的核心组件。你需要创建一个专门的Action类来处理验证码的生成和验证。这个类通常会包含两个方法...
总的来说,Struts2图片验证码的实现涉及了Action的逻辑处理、图像生成、session管理、表单验证等多个方面,体现了Struts2框架在构建复杂业务逻辑时的强大能力。通过熟练掌握这一技术,开发者可以为Web应用提供更为...
7. **安全注意事项**:在实现过程中,要考虑到安全性问题,比如防止CSRF攻击,确保只有合法的请求能触发验证码的验证。 8. **性能优化**:为提高用户体验,验证码应有合理的过期时间,避免用户长时间未操作后仍需...