Java Session验证码案例代码实例解析

案例

用户输入用户名,密码以及验证码。

如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误

如果验证码输入有误,跳转登录页面,提示:验证码错误

如果全部输入正确,则跳转到主页success.jsp,显示:用户名,欢迎您思路

在生成验证码的时候将它的值存入到session中,在比对的时候再取出来进行对比

代码index.jsp

<%--
 Created by IntelliJ IDEA.
 User: tanglei
 Date: 2020/6/26
 Time: 下午12:48
 To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>login</title>

  <script>
    window.onload = function(){
      document.getElementById("img").onclick = function(){
        this.src="/login_time_war_exploded/checkCode?time="+new Date().getTime();
      }
    }

  </script>
  <style>
    div{
      color: red;
    }

  </style>
</head>
<body>

<form action="/login_time_war_exploded/login" method="post">
  <table>
    <tr>
      <td>用户名</td>
      <td><input type="text" name="username"></td>
    </tr>
    <tr>
      <td>密码</td>
      <td><input type="password" name="password"></td>
    </tr>
    <tr>
      <td>验证码</td>
      <td><input type="text" name="checkCode"></td>
    </tr>
    <tr>
      <td colspan="2"><img id="img" src="/login_time_war_exploded/checkCode"></td>
    </tr>
    <tr>
      <td colspan="2"><input type="submit" value="登录"></td>
    </tr>
  </table>

</form>

<div><%=request.getAttribute("cc_error") == null ? "" : request.getAttribute("cc_error")%></div>
<div><%=request.getAttribute("login_error") == null ? "" : request.getAttribute("login_error") %></div>

</body>
</html>

success.jsp

<%--
 Created by IntelliJ IDEA.
 User: tanglei
 Date: 2020/6/26
 Time: 下午6:27
 To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>Title</title>
</head>
<body>
<h1><%=request.getSession().getAttribute("user")%>,欢迎您</h1>
</body>
</html>

验证码checkCode.java

package cn.guizimo.servlet;

import javax.imageio.ImageIO;
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.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

@WebServlet("/checkCode")
public class CheckCode extends HttpServlet {
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    int width = 100;
    int height = 50;
    //创建图片对象
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);

    //美化
    Graphics g = image.getGraphics();
    //背景
    g.setColor(Color.PINK);
    g.fillRect(0, 0, width, height);
    //边框
    g.setColor(Color.BLUE);
    g.drawRect(0, 0, width - 1, height - 1);

    String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    Random ran = new Random();
    StringBuilder sb = new StringBuilder();
    for (int i = 1; i <= 4; i++) {
      int index = ran.nextInt(str.length());
      char ch = str.charAt(index);
      sb.append(ch);
      g.drawString(ch+"",width/5*i,height/2);
    }
    String checkCode_session = sb.toString();
    //将验证码存入session
    req.getSession().setAttribute("checkCode_session",checkCode_session);

    //干扰线
    g.setColor(Color.GREEN);
    for (int i = 0; i < 10; i++) {
      int x1 = ran.nextInt(width);
      int x2= ran.nextInt(width);
      int y1 = ran.nextInt(height);
      int y2 = ran.nextInt(height);
      g.drawLine(x1,y1,x2,y2);
    }

  //输出图片到浏览器
    ImageIO.write(image, "jpg", resp.getOutputStream());

  }

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    this.doPost(req, resp);
  }
}

login.java

package cn.guizimo.servlet;

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("/login")
public class Login extends HttpServlet {
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //1.设置request编码
    req.setCharacterEncoding("utf-8");
    //2.获取参数
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    String checkCode = req.getParameter("checkCode");
    //3.先获取生成的验证码
    HttpSession session = req.getSession();
    String checkCode_session = (String) session.getAttribute("checkCode_session");
    //删除session中存储的验证码
    //session.removeAttribute("checkCode_session");
    //3.先判断验证码是否正确
    if(checkCode_session!= null && checkCode_session.equalsIgnoreCase(checkCode)){
      //忽略大小写比较
      //验证码正确
      //判断用户名和密码是否一致
      if("zhangsan".equals(username) && "123".equals(password)){//需要调用UserDao查询数据库
        //登录成功
        //存储信息,用户信息
        session.setAttribute("user",username);
        //重定向到success.jsp
        resp.sendRedirect(req.getContextPath()+"/success.jsp");
      }else{
        //登录失败
        //存储提示信息到request
        req.setAttribute("login_error","用户名或密码错误");
        //转发到登录页面
        req.getRequestDispatcher("/login.jsp").forward(req,resp);
      }

    }else{
      //验证码不一致
      //存储提示信息到request
      req.setAttribute("cc_error","验证码错误");
      //转发到登录页面
      req.getRequestDispatcher("/login.jsp").forward(req,resp);

    }
  }

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    this.doPost(req, resp);
  }
}

测试登录界面

验证码错误

用户名密码错误

登录成功

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2020-06-27

java使用websocket,并且获取HttpSession 源码分析(推荐)

一:本文使用范围 此文不仅仅局限于spring boot,普通的spring工程,甚至是servlet工程,都是一样的,只不过配置一些监听器的方法不同而已. 本文经过作者实践,确认完美运行. 二:Spring boot使用websocket 2.1:依赖包 websocket本身是servlet容器所提供的服务,所以需要在web容器中运行,像我们所使用的tomcat,当然,spring boot中已经内嵌了tomcat. websocket遵循了javaee规范,所以需要引入javaee的包 <

Java简单实现session保存到redis的方法示例

本文实例讲述了Java简单实现session保存到redis的方法.分享给大家供大家参考,具体如下: 在负载均衡情况下,如果用户访问不同的机器,如果没有做session同步,用户就会被提出,这样用户体验非常不好,所以我们很有必要做session同步,把session放到reids缓存服务器就能很好的解决问题.下面是代码简单的实现. 一.配置web.xml过滤器: <filter> <filter-name>sessionFilter</filter-name> <

Javaweb项目session超时解决方案

在Java Web开发中,Session为我们提供了很多方便,Session是由浏览器和服务器之间维护的.Session超时理解为:浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了. 0.需求 需要对所有的/web/**请求进行登录拦截,Session超时时跳转到登录页面. 1.引入 一般来说,在项目使用中都会配置Session超时时间,如果不配置,则默认值为30分钟,

Java发送邮箱验证码、session校验功能

本篇主要描述"发送邮箱验证码.session校验"相关前(html\js)后(java)台代码,业务逻辑示例,闲话少诉,直接上代码. 1.引入的jar包是mail-1.4.jar 2.java底层发送邮箱方法 public boolean sendEMail(Map<String, Object> map) { log.info("電子郵件接口執行開始!"); String from = Cache.getInstance().getParamsCons

JavaWeb使用Session和Cookie实现登录认证

后台管理页面往往需要登录才可以进行操作,这时就需要Seession来记录登录状态 要实现起来也是非常简单,只需要自定义一个HandlerInterceptor就行了 自定义的HandlerInterceptor也只有短短几行代码 public class LoginInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest request, HttpSer

JavaWeb项目打开网页出现Session Error的异常解决方案

这篇文章主要介绍了JavaWeb项目打开网页出现Session Error的异常解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 找到web.xml配置的原始配置的位置: <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class&g

JavaWeb基于Session实现的用户登陆注销方法示例

前言 Cookie:cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器. 当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据区,这样,web资源处理的就是各自的数据了. Session:session是服务器端技术,利用session技术,服务器在运行时可以为每一个用户的浏览器创建其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在session中,当用户再次去访问服务器中的其

JavaWeb 使用Session实现一次性验证码功能

表单 <form action="loginServlet" method="post"> 请输入验证码:<input type="text" name="code" /> <img src="getCodeServlet" /><br /> <button type="submit">提交</button> <

Java Web实现session过期后自动跳转到登陆页功能【基于过滤器】

本文实例讲述了Java Web实现session过期后自动跳转到登陆页功能.分享给大家供大家参考,具体如下: 通过过滤器的方式实现 session过期后自动跳转到登陆页 过滤器只在与servlet规范2.3版兼容的服务器上有作用.如果你的Web应用需要支持旧版服务器,就不能使用过滤器. 一.建立基本过滤器 建立一个过滤器涉及下列五个步骤: 1)建立一个实现Filter接口的类SessionFilter .这个类需要三个方法,分别是:doFilter.init和destroy.doFilter方法

Session过期后自动跳转到登录页面的实例代码

最近做了一个项目其中有需求,要实现自动登录功能,通过查阅相关资料,打算用session监听来做,下面给大家列出了配置监听器的方法: 1.在项目的web.xml文件中添加如下代码: <!--添加Session监听器--> <listener> <listener-class> 监听器路径 </listener-class> </listener> 2.编写java类. public class SessionListener implements

JS实现页面超时后自动跳转到登陆页面

JS代码: 复制代码 代码如下: <script language="javascript">   var myTime = setTimeout("Timeout()", 60000);   function resetTime() {       clearTimeout(myTime);       myTime = setTimeout('Timeout()', 60000);   }  function Timeout() {       al

JavaScript实现页面5秒后自动跳转的方法

这个JavaScript控制页面5秒后自动跳转的代码在很多开发中经常需要用到,感兴趣的朋友可以收藏一下! <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"/> <title>JavaScript控制页面5秒后自动跳转的代码</title> <script type="text/j

JS实现超过长度限制后自动跳转下一款文本框的方法

本文实例讲述了JS实现超过长度限制后自动跳转下一款文本框的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999

JavaScript实现x秒后自动跳转到一个页面

今天看视频学习时学习了一种新技术,即平时我们在一个页面点击"提交"或"确认"会自动跳转到一个页面. 在网上搜了一下,关于这个技术处理有多种方法,我只记下我在视频里学到的三种: 1.用一个response.sendRedirect("目标页面.jsp\.htm");实现直接跳转: 2.有时我们需要有点提示,比如"x秒后自动跳转,若没有跳转,请点击此处",则可以在myeclipse中调用Snippets中的Delay Go To

JS实现n秒后自动跳转的两种方法

本文实例为大家分享了JS实现n秒后自动跳转的两种方法,供大家参考,具体内容如下 第一种使用SetInterval: $(function () { setInterval(ChangeTime, 1000); }); function ChangeTime() { var time; time = $("#time").text(); time = parseInt(time); time--; if (time <= 0) { window.location.href = &q

在django中实现页面倒数几秒后自动跳转的例子

实现倒计时跳转要和html中的js结合起来, 例如:实现一个页面简单的注册,然后注册成功后倒计时自动跳转到登录页面. # 注册页面 def register(request): return render(request,"register.html") # 点击注册 def doregister(request): # 获得用户输入的信息,保存到数据库 username=request.GET.get("username") password=request.GE

jQuery中Datatables增加跳转到指定页功能

下面一段代码是关于datatable增加跳转到指定页功能,具体代码如下所示: var mytable = $('#datatables'); mytable.dataTable( { "sDom": "<'row-fluid'<'span6'l><'span6'f>r>t<'row-fluid'<'span6'i><'span6'p>>", "sPaginationType"

bootstrap-table.js扩展分页工具栏(增加跳转到xx页)功能

新项目,准备引用bootstrap-table这个控件来展示页面上的表格,无奈这款控件的分页工具栏没有跳转到xx页的功能,为了适应公司美工(只会出图的美工,却跟我要求这要求那)的蛋疼需求,硬着头皮改了一下bootstrap-table的源码,实现了此功能. 注:由于本人js水平停留在dom级,此次扩展只支持页面上的单表格,也就是说如果同一个页面引用两次bootstrap-table的话,该跳转将无效. 各路神仙如果有更完美的解决方案,也请留言告诉我一声,让我也学习一下. 关于如何引用控件什么的就