`
endual
  • 浏览: 3558144 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java jsp 验证码登录

    博客分类:
  • java
 
阅读更多

很多网站注册或者登录是需要验证码的,这是为了防止机器人注册。本文是采用 servlet + html的方式,

展现一个demo,从登录到验证到跳转的整个过程,其他的代码细细品味,有些不懂,无需搞懂,

比如生成随机码的过程,但是有一点,随机码的图片的高度和宽度至少需要设置吧。

 

1.工程图片



 

----------------------------------------------

2.流程

 

登录到index.html中,有一个对话框,需要填写用户名,密码,验证码,填写完毕,登录,

首先验证码会到filter中去验证,当然了,也可以在loginservlet中验证(我这是为了想用下filter),

如果验证码错误,那么跳转到index.html中,如果正确,进入到LoginServlet中,再对用户名和密码

进行验证,如果正确的话,那么跳转到index.jsp页面,如果错误的话,只能是跳转到index.html中,

重写的验证。(验证码是放在session中的)

 

 

代码:

生成验证码图片的 YanZhengMaBean.java

只有知道生成了BufferedImage,一张图片,然后servlet把图片通过方法发射到html中去

你真心无需知道图片怎么产生,只要知道这个bean是生成验证码图片的,并且把验证码字符串放入

到rand的session中了,高和宽改改就行

package com.endual.bean;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class YanZhengMaBean {

	public BufferedImage getBuffImg (HttpServletRequest request) {
		// 验证码图片的宽度。
		int width = 70;
		// 验证码图片的高度。
		int height = 30;
		BufferedImage buffImg = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_RGB);
		Graphics2D g = buffImg.createGraphics();
		// 创建一个随机数生成器类。
		Random random = new Random();
		// 设定图像背景色(因为是做背景,所以偏淡)
		g.setColor(getRandColor(200, 250));
		g.fillRect(0, 0, width, height);
		// 创建字体,字体的大小应该根据图片的高度来定。
		Font font = new Font("Times New Roman", Font.HANGING_BASELINE, 28);
		// 设置字体。
		g.setFont(font);
		// 画边框。
		g.setColor(Color.BLACK);
		g.drawRect(0, 0, width - 1, height - 1);
		// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到。
		// g.setColor(Color.GRAY);
		g.setColor(getRandColor(160, 200));
		for (int i = 0; i < 155; i++) {
			int x = random.nextInt(width);
			int y = random.nextInt(height);
			int xl = random.nextInt(12);
			int yl = random.nextInt(12);
			g.drawLine(x, y, x + xl, y + yl);
		}
		// randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
		StringBuffer randomCode = new StringBuffer();
		// 设置默认生成4个验证码
		int length = 4;
		// 设置备选验证码:包括"a-z"和数字"0-9"
		String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
		int size = base.length();
		// 随机产生4位数字的验证码。
		for (int i = 0; i < length; i++) {
			// 得到随机产生的验证码数字。
			int start = random.nextInt(size);
			String strRand = base.substring(start, start + 1);
			// 用随机产生的颜色将验证码绘制到图像中。
			// 生成随机颜色(因为是做前景,所以偏深)
			// g.setColor(getRandColor(1, 100));
			// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
			g.setColor(new Color(20 + random.nextInt(110), 20 + random
					.nextInt(110), 20 + random.nextInt(110)));
			g.drawString(strRand, 15 * i + 6, 24);
			// 将产生的四个随机数组合在一起。
			randomCode.append(strRand);
		}
		// 将四位数字的验证码保存到Session中。
		HttpSession session = request.getSession();
		session.setAttribute("rand", randomCode.toString());
		// 图象生效
		g.dispose();
		// 禁止图像缓存。
		return buffImg ;
	}
	
	private Color getRandColor(int fc, int bc) {// 给定范围获得随机颜色
		Random random = new Random();
		if (fc > 255)
			fc = 255;
		if (bc > 255)
			bc = 255;
		int r = fc + random.nextInt(bc - fc);
		int g = fc + random.nextInt(bc - fc);
		int b = fc + random.nextInt(bc - fc);
		return new Color(r, g, b);
	}

	
}

 

   把验证码的字符串放入到到名叫rand的session中了

 

2.发射验证码图片的servlet

 

 

package com.endual.servlets;

import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.endual.bean.YanZhengMaBean;
public class YanZhengMaServlet extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request,response) ;
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

			YanZhengMaBean bean = new YanZhengMaBean() ;
			BufferedImage buffImg = bean.getBuffImg(request) ;
			response.setHeader("Pragma", "no-cache");
			response.setHeader("Cache-Control", "no-cache");
			response.setDateHeader("Expires", 0);
			response.setContentType("image/jpeg");
			// 将图像输出到Servlet输出流中。
			ServletOutputStream sos = response.getOutputStream();
			ImageIO.write(buffImg, "jpg", sos);
			sos.flush();
			sos.close();
	}



}

 

这里要插话:

1.response.setHeader("Cache-Control", "no-cache");

2.ImageIO.write(buffImg, "jpg", sos);

你懂的,发射图片要用ImageIO,不是发射字符串或者json的方法了

 

3. Filter 过滤下验证码,貌似直接写在loginservlet中更好吧??

 

 

package com.endual.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class YanZhengMaFilter implements Filter  {

	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
			FilterChain filterChain) throws IOException, ServletException {
		// TODO Auto-generated method stub
	    HttpServletRequest requestHttp = (HttpServletRequest) servletRequest;   
		String yazhengma = servletRequest.getParameter("yazhengma") ;
	    HttpSession session = requestHttp.getSession();
	    String buf = (String)session.getAttribute("rand") ;
		if (buf==null) {
			//跳转到登录页面中去
			RequestDispatcher requestDispatcher = servletRequest.getRequestDispatcher("/index.html");   
            requestDispatcher.forward(servletRequest, servletResponse);   
		}else  {
			if (buf.toLowerCase().equals(yazhengma.toLowerCase())) {
				//进入到页面中
				//RequestDispatcher requestDispatcher = servletRequest.getRequestDispatcher("/index.jsp");   
	            //requestDispatcher.forward(servletRequest, servletResponse);   
	            filterChain.doFilter(servletRequest, servletResponse); 
			}else {
				//跳转到登录页面中去
				RequestDispatcher requestDispatcher = servletRequest.getRequestDispatcher("/index.html");   
	            requestDispatcher.forward(servletRequest, servletResponse);   
			}
		}
		
	}

	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}

 

 

 过滤,验证下验证码

 

4.登录的servlet

   LoginServlet.java

 

 

package com.endual.servlets;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		
		String username = request.getParameter("username") + "" ;
		String password = request.getParameter("password") + "";
		RequestDispatcher requestDispatcher = null ;
		if (username.equals("chenwei")) {
			//跳转到登录页面中去
			 requestDispatcher = request.getRequestDispatcher("/index.jsp");   
           
		}else {
			 requestDispatcher = request.getRequestDispatcher("/index.html");   
        
		}
	    requestDispatcher.forward(request, response); 
		
	}

	

}

 

 

5.注册的web.xml

 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<filter>
		<filter-name>session-timeout</filter-name>
		<filter-class>com.endual.filter.YanZhengMaFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>session-timeout</filter-name>
		<url-pattern>/LoginServlet.do</url-pattern>
	</filter-mapping>



	<servlet>
		<description>
			This is the description of my J2EE component
		</description>
		<display-name>
			This is the display name of my J2EE component
		</display-name>
		<servlet-name>YanZhengMaServlet</servlet-name>
		<servlet-class>
			com.endual.servlets.YanZhengMaServlet
		</servlet-class>
	</servlet>
	<servlet>
		<description>
			This is the description of my J2EE component
		</description>
		<display-name>
			This is the display name of my J2EE component
		</display-name>
		<servlet-name>LoginServlet</servlet-name>
		<servlet-class>com.endual.servlets.LoginServlet</servlet-class>
	</servlet>


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

 

 

6.登录的界面

 

最好么用到js,可以做个刷新验证码用的,但是我不写了,不会写,要google抄代码啊

index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>index.html</title>

		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="this is my page">
		<meta http-equiv="content-type" content="text/html; charset=UTF-8">
		<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
		<meta http-equiv="pragma" content="no-cache" />
		<meta http-equiv="cache-control" content="no-cache" />
		<meta http-equiv="expires" content="0" />
		<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
		</head>

	<body>

		<form action="LoginServlet.do" method="get">
		username : <input type="text" name="username"/><br/>
		password :<input type="text" name="password" /><br/>
		yazhengma: <input type="text" name="yazhengma"><img src="YanZhengMaServlet.do"/>
		<br/> <input type="submit" value="subimt"/>
		</form>

	</body>
</html>

 登录界面看看



 

7.登录成功的index.jsp

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  
  <body>
    登录成功
  </body>
</html>

 

 

 

这下完全OK了

 

 

   http://download.csdn.net/download/endual/4484949

 

   完全工程下载,2分,付钱,谢谢

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 7.5 KB
  • 大小: 11.5 KB
分享到:
评论
1 楼 itway 2013-06-18  
资源不存在

相关推荐

    JAVA JSP版验证码

    JAVA JSP版验证码 JAVA JSP版验证码 JAVA JSP版验证码 JAVA JSP版验证码

    java jsp验证码例子源码

    Java JSP验证码是一种常见的网页安全机制,用于防止自动化的机器人或者恶意用户进行非法操作,比如批量注册、恶意登录等。这个源码例子是关于如何在Java JSP环境中实现验证码功能的教程。 首先,验证码的核心在于...

    jsp验证码登录

    在`jsp验证码登录`这个主题中,我们将探讨如何在用户登录过程中引入验证码机制,增强系统的安全性。 首先,当用户尝试登录时,我们需要检查输入的用户名和密码。在JSP中,这可以通过`request.getParameter()`方法...

    JSP验证码登录程序

    **JSP验证码登录程序详解** 验证码(CAPTCHA)是一种用于防止自动机器人或恶意脚本进行非法操作的安全机制,常用于用户登录、注册等场景。在JSP(Java Server Pages)中,结合Servlet实现验证码功能,可以有效提升...

    java 登录验证码制作

    本教程将详细讲解如何在Java JSP环境下制作一个简单的登录验证码。 首先,我们需要理解验证码的基本原理。验证码通常由随机生成的一串字符(包括字母、数字)组成,并通过图像展示出来,用户需要在输入框中正确输入...

    JAVA+jsp 版验证码

    一款用java+jsp编写的验证码插件,可以在web项目中直接应用。

    实验五 AJAX开发及JSP验证码

    实验五主要涵盖了AJAX技术的运用以及JSP验证码的开发,这两个知识点对于前端开发者来说是至关重要的。AJAX,即Asynchronous JavaScript and XML(异步JavaScript和XML),它允许网页在不重新加载整个页面的情况下与...

    java 实现验证码(servlet+jsp)

    在Java Web开发中,我们可以使用Servlet和JSP来实现一个简单的图形验证码。以下将详细介绍如何利用这两个技术进行验证码的实现。 首先,理解验证码的基本原理:验证码是一种通过图像显示随机字符或数字的方式,用户...

    java登录验证码生成代码

    一个登录验证生成验证码用struts 后台生成验证码在jsp页面输出生成图片

    java jsp 生成彩色验证码+验证功能代码,可直接运行,没有数据库

    - **使用`&lt;jsp:include&gt;`标签**:将生成验证码的Java代码包含到JSP页面中。 - **`&lt;img&gt;`标签**:生成的验证码图片以HTTP响应的方式返回,通过`&lt;img&gt;`标签显示在网页上。 - **session管理**:使用`session....

    java生成验证码源码包括彩色验证码

    java生成验证码源码包括彩色验证码 包括jsp生成验证码和彩色验证码

    java彩色验证码例子

    Java生成彩色验证码是一种常见的安全措施,用于防止自动化脚本或恶意机器人进行非法操作,例如注册、登录等。在Web开发中,JSP(JavaServer Pages)可以用来创建动态的网页内容,包括验证码图像。以下是对标题和描述...

    jsp验证码刷新功能

    ### jsp验证码刷新功能 在Web开发中,验证码(CAPTCHA)被广泛应用于表单提交、用户登录等场景,以防止自动化的恶意攻击或垃圾信息的提交。而在JSP技术中实现验证码的刷新功能,不仅可以提升用户体验,还能进一步...

    jsp 验证码(servlet)

    【JSP验证码(Servlet)详解】 验证码是一种常用的安全机制,用于防止自动化的恶意程序,如机器人,进行非法操作。在Web开发中,JSP(JavaServer Pages)与Servlet结合使用可以实现动态生成并验证验证码的功能。这...

    java,jsp 生成验证码

    采用jsp 生成验证码,我自己使用过的。使用方法: &lt;img src="./../function/imagejsp.jsp" style="float: left"&gt;

    jspupload.rar_OCR_java ocr_jsp_jsp 验证码_验证码 识别

    【标题】"jspupload.rar_OCR_java ocr_jsp_jsp 验证码_验证码 识别" 提供了一个基于JSP和Servlet实现的OCR(Optical Character Recognition,光学字符识别)系统,主要用于处理验证码的识别。这个系统允许用户通过...

    jsp用户登录验证码

    ### jsp用户登录验证码知识点详解 #### 一、概述 在Web应用开发中,为了防止自动化工具或恶意脚本对登录系统的频繁尝试,通常会在登录界面加入验证码功能。验证码(CAPTCHA)是一种用来区分人与计算机的技术手段。...

    3个java登录验证码的例子全网最全

    在Java开发中,实现验证码功能是常见的需求,尤其在登录系统中。下面将详细探讨标题和描述中提到的3个Java登录验证码的例子。 首先,`web08.rar`可能包含了一个基于Web的登录验证码示例。Web验证码通常由服务器生成...

    jsp验证码——数字

    这个JSP验证码生成器示例展示了如何使用JSP和Java图形处理库来创建动态的数字验证码。通过设置页面属性、控制页面缓存、生成随机颜色和线条、管理HTTP会话等技术手段,有效地提高了验证码的安全性和用户体验。这种...

    java生成验证码代码(工程)

    java生成验证码代码 主要:一个生成验证码的servlet,一个jsp页面,另外还需要配置下web.xml即可

Global site tag (gtag.js) - Google Analytics