`
endual
  • 浏览: 3508955 次
  • 性别: 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  
资源不存在

相关推荐

Global site tag (gtag.js) - Google Analytics