`

J2ee Web 项目验证码

阅读更多
在J2ee Web 项目中经常用到验证码,现在总结下

1.生成验证码的Servlet PictureCheckCode.java

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import tools.MD5;

public class PictureCheckCode extends HttpServlet{

private static final long serialVersionUID = 1L;

private Random rand=new Random();


/**
* 生成随机颜色
*
* @param   start  [int]
* @param   end    [int]
* @return  Color  [object]
*/
public Color getRandColor(int start,int end){
int randNum;
if(start>255) start=255;
if(end>255) end=255;
if(start>end) randNum=start-end;
else randNum=end-start;
int r=start+rand.nextInt(randNum);
int g=start+rand.nextInt(randNum);
int b=start+rand.nextInt(randNum);
return new Color(r,g,b);
}


/**
* 着色\旋转\缩放
*
* @param word 文字
* @param g    图片对象
*/
public void coloredAndRotation(String word,int i,Graphics g){
/**着色**/
g.setColor(new Color(20+rand.nextInt(110),20+rand.nextInt(110),20+rand.nextInt(110)));
/**旋转**/
Graphics2D g2d=(Graphics2D)g;
AffineTransform trans=new AffineTransform();
trans.rotate(rand.nextInt(45)*3.14/180,15*i+8,7);
/**缩放**/
float scaleSize=rand.nextFloat()+0.8f;
if(scaleSize>1f) scaleSize=1f;
trans.scale(scaleSize, scaleSize);
g2d.setTransform(trans);
g.drawString(word,15*i+20,20);
}

/**
* 生成100条干扰线
*
* @param g2d
* @param width
* @param height
*/
public void getRandLine(Graphics2D g2d,int width,int height){
for(int i=0;i<100;i++){
int x=rand.nextInt(width-1);
int y=rand.nextInt(height-1);
int z=rand.nextInt(6)+1;
int w=rand.nextInt(12)+1;

BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
Line2D line=new Line2D.Double(x,y,x+z,y+w);
g2d.setStroke(bs);
g2d.draw(line);
}
}

/**
* 获取随机文字
*
* @param  length [int]        验证码长度
* @param  g      [Graphics]   图片对象
* @return String
* @case1:A-Z
* @case2:chinese
* @default:0-9
*/
@SuppressWarnings("unused")
public String getRandWord(int length,Graphics g){
String finalWord="",firstWord="";
int tempInt=0;
String[] array={
"0","1","2","3",
"4","5","6","7",
"8","9","a","b",
"c","d","e","f"};

for(int i=0;i<length;i++){
switch(rand.nextInt(2)){
case 1:
tempInt=rand.nextInt(26)+65;
firstWord=String.valueOf((char)tempInt);
break;
/*case 2:
int r1,r2,r3,r4;
String strH,strL;//high&low
r1=rand.nextInt(3)+11; //前闭后开[11,14)
if(r1==13){
r2=rand.nextInt(7);
}else{
r2=rand.nextInt(16);
}

r3=rand.nextInt(6)+10;
if(r3==10){
r4=rand.nextInt(15)+1;
}else if(r3==15){
r4=rand.nextInt(15);
}else{
r4=rand.nextInt(16);
}

strH=array[r1]+array[r2];
strL=array[r3]+array[r4];

byte[] bytes=new byte[2];
bytes[0]=(byte)(Integer.parseInt(strH,16));
bytes[1]=(byte)(Integer.parseInt(strL,16));

firstWord=new String(bytes);
break;*/
default:
tempInt=rand.nextInt(10)+48;
firstWord=String.valueOf((char)tempInt);
break;
}
finalWord+=firstWord;
this.coloredAndRotation(firstWord,i, g);
}

return finalWord;
}

protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

//设制不缓存图片
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","No-cache");
response.setDateHeader("Expires",0);

//生成图片
response.setContentType("image/jpeg");
int width=100;
int height=40;
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

Graphics g=image.getGraphics();
Graphics2D g2d=(Graphics2D)g;
Font mFont=new Font("宋体",Font.BOLD,22);
g.setColor(this.getRandColor(200,250));
g.fillRect(0, 0, width, height);
g.setFont(mFont);
g.setColor(this.getRandColor(180,200));

this.getRandLine(g2d, width, height);

String randCode=this.getRandWord(4, g);

HttpSession session=request.getSession();
session.setAttribute("randCode",MD5.code(randCode.toLowerCase()));

g.dispose();

ImageIO.write(image,"JPEG",response.getOutputStream());

}

}

2.Structs2 web.xml 配置
因为要使Structs2和servlet 共存,所以要配置下 web.xml
<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

  <display-name>JJBC6</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>*.do</url-pattern>
<url-pattern>*.htm</url-pattern>
<url-pattern>*.action</url-pattern>
<url-pattern>*.jsp</url-pattern>
  </filter-mapping>

  <servlet>
<servlet-name>RandImg</servlet-name>
<servlet-class>web.PictureCheckCode</servlet-class>
  </servlet>

  <servlet-mapping>
<servlet-name>RandImg</servlet-name>
<url-pattern>/RandImg</url-pattern>
  </servlet-mapping>
 
  <welcome-file-list>
        <welcome-file>/jsp/index.jsp</welcome-file>
  </welcome-file-list>
 
 
</web-app>


3.前台Jsp页面的应用

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>论坛登陆</title>
    <script type="text/javascript" src="js/jquery-latest.js"></script>
   <script type="text/javascript">
      function refresh() {
      $("#randimg").attr("src","RandImg?time="+ new Date().getTime());
   };
  function showCode(){
     $(".varcode").show();
   };   
    </script>  
</head>
<body>
        <h3>论坛登陆 </h3>
        <s:form action="/Login" validate="true">
          用户名  <s:textfield name="user.name" key="name"/><br>
            <s:textfield name="user.date" key="date"/><br>
            密码   <s:password name="user.password" key="password"/>
            <s:submit/>
        </s:form>
       
       
   <div class="varcodeinput">
   验证码:  <input type="text" id="code" name="code" onfocus="showCode();" onclick="showCode();" size="4" maxlength="4"/>
[  点击输入框获取验证码,不区分大小写  ]
   </div>
   <div class="varcode" style="display:none">
   <img src="RandImg" id="randimg" />
  <a href="javascript:refresh()" title="看不清左边的字符?点下换个!">看不清?换一个</a>
   </div>

  </body>
  </html>
分享到:
评论

相关推荐

    J2EE用户注册与登录简单示例

    总的来说,J2EE用户注册与登录简单示例是一个综合性的学习项目,它涵盖了Web开发中的基础概念和技术,如MVC设计模式、XML处理、数据库操作、安全机制等。通过实践这个示例,开发者可以更好地理解如何在实际项目中...

    j2ee项目,网上书店,登录系统,学生系统等那

    在本项目中,我们将深入探讨基于J2EE技术构建的网上书店系统,其中包括登录系统以及学生管理系统等多个核心功能模块。J2EE(Java 2 Platform, Enterprise Edition)是Oracle公司提供的一个用于开发和部署企业级应用...

    j2ee组件(包括验证码、上传下载、分页、导出excel)

    本压缩包包含的四个主要组件——验证码、上传下载、分页和导出Excel,都是Web应用中不可或缺的元素。接下来,我们将深入探讨这些组件的实现原理与应用。 1. **验证码模块**: 验证码是一种防止机器自动操作的安全...

    基于J2EE企业人事管理系统最终源码

    J2EE平台包含了Web服务器、应用服务器以及数据库等组件,能够处理复杂的业务逻辑,提供高可用性和可扩展性。在这个系统中,J2EE的主要功能可能包括用户认证、权限管理、事务处理以及与数据库的交互。 人事管理模块...

    jsp j2ee 验证码技术

    关于jsp验证码生成,显示,验证和刷新: 1:四位数据的验证图片生成,用servlet实现 2:在web.xmlli配置servlet 3:页面上显示servlet生成的图片 4:关于验证码输入数据的验证 5:验证码的刷新

    J2EE案例《网络在线考试系统》

    总结来说,《网络在线考试系统》项目是一个典型的J2EE Struts应用,它展示了如何使用Struts框架来构建一个完整的Web应用,涵盖了用户交互、数据处理和视图展现等多个层面,同时体现了对安全性、性能和用户体验的考虑...

    登陆web java j2ee

    在Web开发领域,Java J2EE(Java 2 Platform, Enterprise Edition)是一个广泛使用的平台,用于构建企业级的分布式应用程序,特别适合开发大型、多层架构的Web应用。本话题聚焦于"登陆web java j2ee",我们将深入...

    J2EE项目–Servelt+jsp构建在线音乐网站(实现短信验证码+分页)Music_web.zip

    前端开发:HTML、CSS、JavaScript等用于构建网页和Web应用程序的技术。 后端开发:涉及服务器端编程、API开发、数据库集成等技术。 移动应用开发:包括iOS开发(使用Swift或Objective-C)和Android开发(使用Java或...

    WEB注册项目

    2. **Web容器**:为了运行J2EE应用,需要一个Web容器,如Tomcat、Jetty等。这些容器负责管理Servlet生命周期,处理HTTP请求,并为应用提供运行环境。 3. **数据库连接**:用户注册信息通常会存储在数据库中,因此...

    J2EE小例子

    本示例是一个基于J2EE平台的简单论坛用户登录系统,它采用了经典的SSH(Struts、Spring、Hibernate)架构。SSH框架是Java Web开发中广泛使用的技术栈,它将表现层、业务逻辑层和数据访问层有效地解耦,实现了良好的...

    j2ee 登录小程序

    如果你对这个项目感兴趣,你可以尝试搭建环境,理解代码逻辑,并根据需求进行改进,例如添加验证码、记住密码、多因素认证等功能,进一步提升登录系统的用户体验和安全性。同时,不要忘记分享你的见解和建议,这将有...

    j2ee框架技术课设报告.doc

    ### J2EE框架技术课程设计知识点汇总 #### 一、J2EE框架技术概述 ...以上知识点基于“j2ee框架技术课设报告”文件的信息进行了详细的总结和扩展,旨在帮助读者更好地理解J2EE框架技术和该课程设计项目的具体细节。

    java 验证码 框架

    Java验证码框架是Web开发中用于安全验证的重要工具,主要用于防止恶意自动化的机器人或者爬虫进行非法操作,如注册、登录等。在J2EE环境中,验证码框架能够为开发者提供便捷的方式来实现这一功能。"附带example比较...

    基于j2ee的论文资料管理系统

    总的来说,基于J2EE的论文资料管理系统是一个综合性的项目,涉及到了Web开发的多个方面,包括后端开发、前端设计、数据库管理、安全策略以及系统运维。通过这样的平台,学术交流可以变得更加高效和便捷。

    J2EE实验报告

    在J2EE项目中,过滤器(Filter)是一种用于拦截客户端发送到服务器端的请求以及服务器端返回给客户端的响应的技术。过滤器能够执行预处理和后处理操作,例如设置字符编码、添加HTTP头、执行认证和授权等。 **1.2 熟悉...

    一个基于J2ee模式的图书管理系统

    首先,J2EE模式是一种面向企业级应用的开发架构,它以Java语言为基础,提供了分布式、多层架构的平台,支持Web服务和应用程序服务器,具备良好的可扩展性和安全性。在图书管理系统中,J2EE模式能够实现服务器端的...

    验证码组件

    环境的搭建: ... 6、如果要显示汉字验证码信息,需要把getimg.java中注释掉的汉字验证码部分释放出来,同时将数字和字符验证码部分注释。 运行注意事项: 1、注意包名的大小写情况 2、注意页面的编码问题

    j2ee 实现判断登陆查询

    在J2EE(Java 2 Platform, Enterprise Edition)开发中,实现登录查询是构建Web应用程序的基本环节,尤其在企业级应用中,用户身份验证和权限管理至关重要。MyEclipse是一款强大的Java集成开发环境,它提供了丰富的...

    jsp 详细讲解 如何加入验证码

    在Web开发中,验证码(CAPTCHA)是一种常用的安全机制,用于防止恶意自动程序(如机器人)进行非法操作,比如批量注册、恶意登录等。本教程将深入讲解如何在JSP(JavaServer Pages)中实现验证码功能,以确保用户...

Global site tag (gtag.js) - Google Analytics