jsp登陆验证,网页登陆验证带验证码校验,登录功能之添加验证码

jsp登陆验证,网页登陆验证带验证码校验,登录功能之添加验证码


part_1:专门用于生成一个验证码图片的类:VerificationCode.java

package cn.mike.javase.test;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;

import org.junit.Test;

/**
 * @author : Administrator
 * @function : 这是用来测试随机生成验证码图片的类;
 */
public class VerificationCode {

	/**
	 * 单元测试,试一下能不能自动生成验证码图片
	 */
	// 这个函数是单元测试时使用的,这里private一下外面就调用不到了;
	/* @Test */
	/* public */private void test_fun() {
		VerificationCode vc = new VerificationCode();
		BufferedImage image = vc.getImage();
		try {
			// 生成验证码图片,并保存到指定的路径
			VerificationCode.output(image, new FileOutputStream(new File(
					".\\image\\vcode_2.jpg")));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}

		// 将随机生成的文本内容输出到控制台,用于校验
		System.out.println(vc.getText());
	}

	private int w = 70;// 宽
	private int h = 35;// 高
	private String text;// 文本内容(验证码字符串)
	private Random r = new Random();
	private String[] fontNames = { "宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312" };
	// 随机字符集合中不包括0和o,O,1和l,因为这些不易区分
	private String codes = "23456789abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYXZ";
	// 验证码图片的背景色:白色
	private Color bgColor = new Color(255, 255, 255);

	/**
	 * 返回一个验证码图片buffer对象:BufferedImage
	 */
	public BufferedImage getImage() {
		BufferedImage image = createImage();
		// 获取绘图环境(画笔工具)
		Graphics2D g2 = (Graphics2D) image.getGraphics();
		// sb : 用来保存验证码字符串文本内容
		StringBuilder sb = new StringBuilder();

		for (int i = 0; i < 4; ++i) {// 随机生成4个字符
			String s = randomChar() + "";
			sb.append(s);
			float x = i * 1.0F * w / 4;
			g2.setFont(randomFont());
			g2.setColor(randomColor());
			g2.drawString(s, x, h - 5);
		}

		this.text = sb.toString();// 记录验证码文本内容
		drawLine(image);// 画干扰线
		return image;

	}

	/**
	 * @return 获取验证码文本内容
	 */
	public String getText() {
		return text;
	}

	/**
	 * @param image
	 * @param out
	 *            将文本写到指定的输出流。比如本测试中FileOutputStream指定的保存路径
	 */
	public static void output(BufferedImage image, OutputStream out) {
		try {
			ImageIO.write(image, "jpeg", out);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void drawLine(BufferedImage image) {
		Graphics2D g2 = (Graphics2D) image.getGraphics();
		for (int i = 0; i < 3; ++i) {// 画3条干扰线
			int x1 = r.nextInt(w);
			int y1 = r.nextInt(h);
			int x2 = r.nextInt(w);
			int y2 = r.nextInt(h);
			g2.setColor(Color.BLUE);
			g2.drawLine(x1, y1, x2, y2);
		}
	}

	private Color randomColor() {
		int red = r.nextInt(150);
		int green = r.nextInt(150);
		int blue = r.nextInt(150);
		return new Color(red, green, blue);
	}

	private Font randomFont() {
		int index = r.nextInt(fontNames.length);
		String fontName = fontNames[index];
		int style = r.nextInt(4);
		int size = r.nextInt(5) + 24;
		return new Font(fontName, style, size);
	}

	private char randomChar() {
		int index = r.nextInt(codes.length());
		return codes.charAt(index);
	}

	private BufferedImage createImage() {
		BufferedImage image = new BufferedImage(w, h,
				BufferedImage.TYPE_INT_RGB);
		Graphics2D g2 = (Graphics2D) image.getGraphics();
		g2.setColor(this.bgColor);
		g2.fillRect(0, 0, w, h);

		return image;
	}

}



part_2:登录界面:Login.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 'Login.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">
	-->

		<script type="text/javascript">
	function _change_verity_code() {
		var imgElem = document.getElementById("img_src");

		//添加一个请求参数a是因为,通常浏览器都有缓存,点击换一张的时候没反应,所以加一个请求参数,获取当前请求时间,可以精确到毫秒,所以每次请求的参数都不同,所以浏览器有缓存也不妨碍;
		imgElem.src = "/ServletDemoProject/servlet/GetVerificationCodeServlet?a="
				+ new Date().getTime();
	}
</script>

	</head>

	<%
		String fdbkMsg = (String) request.getAttribute("fdbkMsg");
		if (null == fdbkMsg) {
			fdbkMsg = "";
		}
	%>

	<%
		Boolean logedIn = (Boolean) session.getAttribute("logedIn");
		if (null == logedIn) {
			logedIn = false;
		} else if (logedIn) {
			//如果在本次会话已经登陆,直接重定向到success-page-1
			response
					.sendRedirect("/ServletDemoProject/LOGIN-DEMO/success-page-1.jsp");
		}
	%>

	<%
		String username = "";
		Cookie[] cookies = request.getCookies();
		if ((null != cookies) && (cookies.length > 0)) {
			for (Cookie c : cookies) {
				if ("admin".equals(c.getValue())) {
					username = "admin";
					break;
				}
			}
		}//end if-condition
	%>

	<body>
		<br>
		<div align="center">
			请登录:
			<br>
			<form action="/ServletDemoProject/servlet/LoginVerificationServlet"
				method="post">
				<div>
					用户名:
					<input type="text" name="username" value="<%=username%>" />
					<br>
				</div>

				<div>
					密    码:
					<input type="password" name="password" />
					<br>
				</div>
				<div>
					验证码:
					<input type="text" name="code_text" size="3" />
					<img src="/ServletDemoProject/servlet/GetVerificationCodeServlet"
						id="img_src" />
					<a href="javascript:_change_verity_code()">换一张</a>
					<br>
				</div>

				<div>
					<font color='red'><%=fdbkMsg%></font>
					<br>
				</div>

				<div>
					<input type="submit" value="提交" />
					<br>
				</div>
			</form>
		</div>
	</body>
</html>

part_3:处理登录校验的servlet :LoginVerificationServlet.java

package cn.mike.servlet.test_1212;

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.mike.javase.test.VerificationCode;

public class GetVerificationCodeServlet extends HttpServlet {

	private static final long serialVersionUID = -3520994675366100452L;

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

		// 1.新建一个VerificationCode类;
		VerificationCode vc = new VerificationCode();

		// 2.从VerificationCode类中获取BufferedImage对象;
		BufferedImage bufImage = vc.getImage();

		// 3.同时获取验证码中的文本内容,并放到session域中, 用于校验;
		String code_text = vc.getText();
		request.getSession().setAttribute("code_text", code_text);

		// 4.将生成的图片输出到客户端浏览器
		VerificationCode.output(bufImage, response.getOutputStream());

	}// end method-doGet

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

		// do same as GET-method :
		doGet(request, response);

	}// end method-doPost

}


part_4:成功登陆后的提示界面1:success-page-1.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 'success-page-1.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>

	<%
		String username = (String) session.getAttribute("username");
		if (null == username) {
			//如果username为空值,说明不是通过正常渠道来的,转发到Login页面;
			request.setAttribute("fdbkMsg", "别想走后门进来,赶紧登录!");
			request.getRequestDispatcher("/LOGIN-DEMO/Login.jsp").forward(
					request, response);
		}
	%>

	<body>
		<br>
		<%=username%>已经成功登陆。
		<br>
		<font>您可以选择浏览:</font>
		<br>
		<a href="/ServletDemoProject/LOGIN-DEMO/success-page-2.jsp">点这儿有精彩.</a>
		<br>
		<a href="/ServletDemoProject/LOGIN-DEMO/success-page-2.jsp">点这儿更精彩.</a>
		<br />
		<a href="/ServletDemoProject/LOGIN-DEMO/success-page-2.jsp">你敢点这儿吗.</a>
		<br />
	</body>
</html>



part_5:成功登陆后的提示界面1:success-page-2.jsp

<%@ page language="java" import="java.util.Date" pageEncoding="UTF-8"%>
<%@ page language="java" import="java.text.SimpleDateFormat"%>
<%
	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 'success-page-2.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>

	<%
		String username = (String) session.getAttribute("username");
		if (null == username) {
			request.setAttribute("fdbkMsg", "呵呵嗒,这里是你来的地方吗?快登陆!");
			//转发到登录界面:
			request.getRequestDispatcher("/LOGIN-DEMO/Login.jsp").forward(
					request, response);
		}

		SimpleDateFormat sDateFormat = new SimpleDateFormat("a");
		Date today = new Date();
		String am_pm_str = sDateFormat.format(today);
		String am_pm_str_in_chinese = "";
		if ("am".equalsIgnoreCase(am_pm_str)) {
			am_pm_str_in_chinese = "上午";
		} else
			am_pm_str_in_chinese = "下午";

		// set null;
		sDateFormat = null;
		today = null;
		am_pm_str = null;
	%>

	<body>
		<br />
		<font><b><%=username%><%=am_pm_str_in_chinese%>好,能来到页面2真不简单.</b>
		</font>
	</body>
</html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值