验证码实现
谷歌kaptcha图片验证码的使用
使用步骤
-
导入谷歌验证码的jar包
kaptcha-2.3.2.jar
-
在web.xml中去配置用于生成验证码的Servlet程序
<servlet> <servlet-name>KaptchaServlet</servlet-name> <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>KaptchaServlet</servlet-name> <url-pattern>/kaptcha.jpg</url-pattern> </servlet-mapping>
-
在表单中使用 img 标签去显示验证码图片并使用它
<form method="get" action="Login2Servlet"> 用户名: <input type="text" name="username" ><br> 验证码:<input type="text" name="code" > <img id="code_img" src="kaptcha.jpg" width="100px"; height="28px;"><br> <input type="submit" value="登录"> </form>
-
在服务器获取谷歌生成的验证码和客户端发送过来的验证码比较使用
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import static com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY; @WebServlet(name = "Login2Servlet",value = "/Login2Servlet") public class Login2Servlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置编码格式 request.setCharacterEncoding("UTF-8"); response.setContentType("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //获取页面的参数 //获取 Session 中的验证码 String token = (String) request.getSession().getAttribute(KAPTCHA_SESSION_KEY); //删除 Session 中的验证码 request.getSession().removeAttribute(KAPTCHA_SESSION_KEY); String code = request.getParameter("code"); //获取用户名 String username = request.getParameter("username"); if (token != null && token.equalsIgnoreCase(code)) { System.out.println("保存到数据库:" + username); PrintWriter out = response.getWriter(); out.print("验证成功"); } else { System.out.println("请不要重复提交表单"); PrintWriter out = response.getWriter(); out.print("请不要重复提交表单"); } } }
-
切换验证码
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录验证码的实现</title> <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> </head> <body> <script> $(function () { $("#code_img").click(function () { this.src = "${basePath}kaptcha.jpg?d=" + new Date(); }); }); </script> <form method="get" action="Login2Servlet"> 用户名: <input type="text" name="username" ><br> 验证码:<input type="text" name="code" > <img id="code_img" src="kaptcha.jpg" width="100px"; height="28px;"><br> <input type="submit" value="登录"> </form> </body> </html>
ValidateCode验证码
使用步骤
-
导入Validate的jar包
ValidateCode.jar
-
创建验证码
package com.controller; import cn.dsna.util.images.ValidateCode; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; @WebServlet(name = "ValidateCodeController",value = "/ValidateCode") public class ValidateCodeController extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //参数分别为验证码图片长、高,字符数、干扰线数 ValidateCode validateCode = new ValidateCode(200, 40, 4, 50); //获取生成的验证码 String codes = validateCode.getCode(); System.out.println(request.getRemoteAddr()+"生成:"+codes); //0:0:0:0:0:0:0:1生成:cn.dsna.util.images.ValidateCode@3c7340a9 //使用session存储生成的验证码 HttpSession session = request.getSession(); session.setAttribute("codes",codes); //响应给客户端 validateCode.write(response.getOutputStream()); } }
-
登录页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录验证码的实现</title> </head> <body> <form method="post" action="LoginServlet"> 用户名: <input type="text" name="username" value="username"><br> 密码: <input type="password" name="password" value="password"><br> 验证码: <input type="text" name="code"><img src="ValidateCode" ><br> <input type="submit" value="登录"> </form> </body> </html>
-
验证
package com.controller; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.PrintWriter; @WebServlet(name = "LoginServlet",value = "/LoginServlet") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置编码格式 request.setCharacterEncoding("UTF-8"); response.setContentType("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //获取页面的参数 String username = request.getParameter("username"); String password = request.getParameter("password"); String code = request.getParameter("code"); //取得session中存储的codes HttpSession session = request.getSession(); String codes = (String) session.getAttribute("codes"); System.out.println(codes); //如果验证码不为空并且输入验证码正确 就比较账号密码是否正确否则返回登录页面 if(!codes.isEmpty()&&codes.equalsIgnoreCase(code)){ if(username.equals("username")&&password.equals("password")){ System.out.println("登录成功"); PrintWriter out = response.getWriter(); out.print("登录成功"); // request.getRequestDispatcher("index.jsp").forward(request,response); }else { System.out.println("登录失败,账号或密码错误"); PrintWriter out = response.getWriter(); out.print("登录失败,账号或密码错误"); // response.sendRedirect("login.jsp"); } }else { System.out.println("验证码错误"); PrintWriter out = response.getWriter(); out.print("验证码错误"); // response.sendRedirect("login.jsp"); } } }
最简单验证码实现
直接通过jsp实现验证码
img.jsp
<%@ page contentType="image/jpeg"
import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%>
<%!
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);//200,250
int g=fc+random.nextInt(bc-fc);
int b=fc+random.nextInt(bc-fc);
return new Color(r,g,b);
}
%>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
// 在内存中创建图象
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
//生成随机类
Random random = new Random();
// 设定背景色
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);
//设定字体
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
//画边框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
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);
}
// 取随机产生的认证码(4位数字)
//String rand = request.getParameter("rand");
//rand = rand.substring(0,rand.indexOf("."));
String sRand="";
for (int i=0;i<4;i++){
String rand=String.valueOf(random.nextInt(10));
sRand+=rand;
// 将认证码显示到图象中
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand,13*i+6,16);
}
// 将认证码存入SESSION
session.setAttribute("rand",sRand);
// 图象生效
g.dispose();
// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
out.clear();
out = pageContext.pushBody();
%>
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form >
username:<input type="text" name="username" /><p />
password:<input type="text" name="password" /><p />
code:<input type="text" name="code" maxlength="4" size="4" /><img src="image.jsp" /><p />
<input type="submit" value="login" /><p />
</form>
</body>
</html>
实现效果