博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Servlet生成验证码并在Servlet后台验证完成登陆
阅读量:6943 次
发布时间:2019-06-27

本文共 5877 字,大约阅读时间需要 19 分钟。

再做一个图像验证码,发现网上都是Servlet的生成代码,由于自己刚接触JSP和Servlet,对Session等功能不太熟,后台验证整了近一个小时,才明白生么意思,先把代码贴出来,共享一下。

//生成验证码

package djr.servlet;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;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.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;public class IdentityServlet extends HttpServlet {	/**	 * 	 */	private static final long serialVersionUID = 1L;	public static final char[] CHARS={'2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q',		'R','S','T','U','V','W','X','Y','Z'};	public static Random random=new Random();		public static String getRandomString(){		StringBuffer buffer=new StringBuffer();		for(int i=0;i<6;i++){			buffer.append(CHARS[random.nextInt(CHARS.length)]);		}		return buffer.toString();	}	public static Color getRandomColor(){		return new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255));	}		//返回某一颜色的反色	public static Color getReverseColor(Color c){		return new Color(255-c.getRed(),255-c.getGreen(),255-c.getBlue());	}		public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{		doPost(request,response);	}	public void doPost(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");				String randomString=getRandomString();				int width=100;		int height=30;				Color color=getRandomColor();		Color reverse=getReverseColor(color);				BufferedImage bi=new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);		Graphics2D g=bi.createGraphics();		g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,16));		g.setColor(color);		g.fillRect(0, 0, width, height);		g.setColor(reverse);		g.drawString(randomString, 18, 20);		for(int i=0,n=random.nextInt(100);i

//一个HTML文件测试
<%@ page language="java" pageEncoding="UTF-8"
contentType="text/html; charset=UTF-8"%>
<%@ include file="taglibs.inc.jsp" %>
<html>
<head>
<title>登录</title>
</head>
<script type="text/javascript">
function login(){
if(formName.txtUserID.value==""){
alert("请输入用户名");
return false;
}
if(formName.pwdUserPWD.value==""){
alter("请输入密码");
return false;
}
if(formName.identityChar.value==""){
alter("请输入验证码");
return false;
}
}
function reloadImage(){
document.getElementById('btn').disbled=true;
document.getElementById('identity').src='IdentityServlet?ts='+new Date().getTime();
}
</script>
<body>
<form action="userlogin" name="formName" method="post">
<div align="center">
<h1>用户登录</h1>
<table width="300" border="1">
<tr>
<td width="86">用户名</td>
<td width="198"><input type="text" name="txtUserID" /></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="pwdUserPWD" /></td>
</tr>
<tr>
<td colspan="1" align="center"><input type="text" name="identityChar"></td>
<td colspan="1" align="center"><img src="IdentityServlet" id="identity" οnlοad="btn.disabled =false;"/>
<input type="button" value="换个图片" οnclick="reloadImage()" id="btn">
</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" name="Submit" value="登录" οnclick="login()" /></td>
</tr>
</table>
</div>
</form>
</body>
</html>
//后台验证
package djr.servlet;
import java.io.IOException;
import java.sql.Connection;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import djr.dao.EmailDAO;
import djr.dao.UserDAO;
import djr.db.DbFactory;
import djr.dto.EmailDTO;
import djr.dto.UserDTO;
import djr.mail.MailManager;
public class LoginServlet extends HttpServlet {
/**
* 处理登录信息
*/
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String url = request.getServletPath();
//进行验证码后台的判断,这是通过Servlet实现的生成和验证功能。
if (url.toUpperCase().indexOf("USERLOGIN") != -1)
{

//主要是通过Session完成验证

System.out.println("后台验证验证码结果:"+(String)request.getSession(true).getAttribute("randomString"));
if(IdentityServlet.getRandomString()!=(String)request.getSession(true).getAttribute("randomString")){
url="index.jsp";
}
else{
// 登录邮件系统
UserDTO userDTO = new UserDTO();
userDTO.setUserid(request.getParameter("txtUserID"));
userDTO.setPassword(request.getParameter("pwdUserPWD"));
Connection conn = DbFactory.getConnection();
UserDAO userDAO = new UserDAO();
if (userDAO.findUser(userDTO, conn))
{
request.getSession().setAttribute("userinfo", userDTO);
MailManager mailMgr = new MailManager();
mailMgr.setUser(userDTO.getUserid());
mailMgr.setPassword(userDTO.getPassword());
if (mailMgr.receiveMail())
{
EmailDTO emailDTO = new EmailDTO();
emailDTO.setUserID(userDTO.getUserid());
List<EmailDTO> mailList = new EmailDAO().getMailList(
emailDTO, conn);
request.getSession().setAttribute("eMailList", mailList);
}
DbFactory.closeConn(conn);
url = "main.jsp";
}
else
{
url = "err.jsp";
}
}
}
else if (url.toUpperCase().indexOf("LOGOUT") != -1)
{
// 退出邮件系统
request.getSession().invalidate();
url = "index.jsp";
}
System.out.println(""+url);
RequestDispatcher rd=request.getRequestDispatcher(url);
rd.forward(request, response);
}
}

希望看懂原理,代码不能直接Copy,我的是整个项目下的东西哦!红色标注的是关键!!!!

转载于:https://www.cnblogs.com/blog-li/archive/2011/09/25/2190184.html

你可能感兴趣的文章
VirtualBox安装及使用说明和虚拟机安装XP系统图文教程
查看>>
转 selenium 自动下载文件
查看>>
[LeetCode] Pascal's Triangle
查看>>
浏览器加载和渲染html的顺序
查看>>
Oracle SQLPLUS提示符设置
查看>>
symfony学习笔记1—简介
查看>>
腾讯要求
查看>>
[LeetCode] Min Stack
查看>>
Failed to create java virtue machine(不能创建java虚拟机)
查看>>
使用SandCastle创建.Net帮助文档
查看>>
c++builder XE8 线程 Thread
查看>>
redis安装 phpredis Jedis 扩展的实现及注意事项,php,java,python相关插件安装实例代码和文档推荐...
查看>>
CMake with Win&MinGW
查看>>
C# 字符串转义和反转义
查看>>
避免3种响应式设计灾祸
查看>>
http://www.cnblogs.com/hoojo/archive/2011/06/08/2075201.html
查看>>
英語版Windows Server 2012 R2を日本語化する手順
查看>>
Oracle 存储过程异常处理
查看>>
6-tips-for-managing-property-files-with-spring--转
查看>>
到底什么是实例化
查看>>