热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

Servlet+JDBC实现登陆功能的小例子(带验证码)

这篇文章主要介绍了Servlet+JDBC实现登陆功能的小例子(带验证码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

案例需求:访问带有验证码的登录页面login.jsp用户输入用户名,密码以及验证码。如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误如果验证码输入有误,跳转登录页面,提示:验证码错误如果全部输入正确,则跳转到主页success.jsp,显示:用户名,欢迎您分析

步骤

文件树展示


1.配置文件和jar包在上个案例均有配置过,需要改的有:User类新增验证码成员变量,数据库增加了一个验证码字段(无用,只是为了UserDao包把查找到的数据值导入到User类不出错)。

2.登陆界面

<%@ page cOntentType="text/html;charset=UTF-8" language="java" %>


  
  
  



  
    
用户名
密码
验证码
<%=request.getAttribute("cc_error") == null &#63; "" : request.getAttribute("cc_error")%>
<%=request.getAttribute("login_error") == null &#63; "" : request.getAttribute("login_error") %>

3.验证码,画了个验证码,每次都把随机数加入session中以便进行对比

package Test;

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("/checkCodepic")
public class CheckCodepic 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_RGB);

    //美化图片
    //创建画笔
    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);
    //写字母或数字
    g.setColor(Color.green);
    String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    Random rd=new Random();
    StringBuilder sb=new StringBuilder();
    for(int i=1;i<=4;i++){
      int index = rd.nextInt(str.length());
      char c = str.charAt(index);
      sb.append(c);
      g.drawString(c+"",width/5*i,height/2);
    }
    String checkCode_session = sb.toString();
    //将验证码存入session
    req.getSession().setAttribute("checkCode_session",checkCode_session);
    //加干扰线
    g.setColor(Color.blue);
    for(int i=1;i<=10;i++){
      int x1 = rd.nextInt(width);
      int x2 = rd.nextInt(width);
      int y1 = rd.nextInt(height);
      int y2 = rd.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);
  }
}

4.loginServlet类,用来判断验证码和用户名密码是否正确,注意先判断验证码;注意重定向和请求转发的不同,还有session的应用。

package Test;

import Test.dao.UserDao;
import Test.userclass.User;
import org.apache.commons.beanutils.BeanUtils;

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.lang.reflect.InvocationTargetException;
import java.util.Map;

@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //设置request编码
    request.setCharacterEncoding("utf-8");
    //获取参数
//    String username = request.getParameter("username");
//    String password = request.getParameter("password");
//    String checkCode = request.getParameter("checkCode");
//    User user=new User();
//    user.setUsername(username);
//    user.setPassword(password);
//    user.setCheckCode(checkCode);
    Map parameterMap = request.getParameterMap();
    User user=new User();
    try {
      BeanUtils.populate(user,parameterMap);
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    }
    UserDao userDao=new UserDao();
    //先判断验证码是否正确
    String checkCode_session = (String)request.getSession().getAttribute("checkCode_session");
    request.getSession().removeAttribute("checkCode_session");
    if(checkCode_session!=null && checkCode_session.equalsIgnoreCase(user.getCheckCode())){//忽略大小写
      //如果正确,判断用户名密码是否正确
      User login = userDao.login(user);
      if(login!=null){
        //登陆成功,存储用户信息
        request.getSession().setAttribute("username",login.getUsername());
        //重定向到success.jsp
        response.sendRedirect(request.getContextPath()+"/success.jsp");

      }else{//登陆失败,转发到登陆界面
        request.setAttribute("login_error","用户名或密码不正确");
        request.getRequestDispatcher("/login.jsp").forward(request,response);

      }
    }else{ //如果不正确,转发到登陆界面
      request.setAttribute("cc_error","验证码不正确");
      request.getRequestDispatcher("/login.jsp").forward(request,response);

    }
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doPost(request, response);
  }
}

5.成功登陆界面

<%@ page cOntentType="text/html;charset=UTF-8" language="java" %>


  



  

<%=request.getSession().getAttribute("username")%>,欢迎您

结果

登陆界面


验证码错误情况


用户名或密码不正确情况


成功登陆

到此这篇关于Servlet+JDBC实现登陆功能的小例子(带验证码)的文章就介绍到这了,更多相关Servlet+JDBC 登陆内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • 构建高可用性Spark分布式集群:大数据环境下的最佳实践
    在构建高可用性的Spark分布式集群过程中,确保所有节点之间的无密码登录是至关重要的一步。通过在每个节点上生成SSH密钥对(使用 `ssh-keygen -t rsa` 命令并保持默认设置),可以实现这一目标。此外,还需将生成的公钥分发到所有节点的 `~/.ssh/authorized_keys` 文件中,以确保节点间的无缝通信。为了进一步提升集群的稳定性和性能,建议采用负载均衡和故障恢复机制,并定期进行系统监控和维护。 ... [详细]
  • HTTP协议作为互联网通信的基础,其重要性不言而喻。相比JDK自带的URLConnection,HttpClient不仅提升了易用性和灵活性,还在性能、稳定性和安全性方面进行了显著优化。本文将深入解析HttpClient的使用方法与技巧,帮助开发者更好地掌握这一强大的工具。 ... [详细]
  • 如何利用Apache与Nginx高效实现动静态内容分离
    如何利用Apache与Nginx高效实现动静态内容分离 ... [详细]
  • 深入解析Wget CVE-2016-4971漏洞的利用方法与安全防范措施
    ### 摘要Wget 是一个广泛使用的命令行工具,用于从 Web 服务器下载文件。CVE-2016-4971 漏洞涉及 Wget 在处理特定 HTTP 响应头时的缺陷,可能导致远程代码执行。本文详细分析了该漏洞的成因、利用方法以及相应的安全防范措施,包括更新 Wget 版本、配置防火墙规则和使用安全的 HTTP 头。通过这些措施,可以有效防止潜在的安全威胁。 ... [详细]
  • CSS中的pointer-events属性详解与应用
    在CSS中,`pointer-events`属性是一个非常实用但常被忽视的功能。它主要用于控制元素是否响应鼠标事件。当一个元素覆盖在其他元素之上时,通过设置`pointer-events`属性,可以决定该元素是否能够接收鼠标点击、悬停等交互操作,从而实现更灵活的用户界面设计。例如,将`pointer-events`设置为`none`可以使元素透明地传递鼠标事件,方便实现复杂的叠加效果和交互逻辑。 ... [详细]
  • RDLC报表设计进阶:实现行分组功能详解
    在RDLC报表设计系列的第二部分中,我们将深入探讨行分组功能的实现。本文将基于前文的基础,继续介绍如何在demo1.rdlc界面中添加文本框,并详细讲解行分组的具体操作步骤和技巧。通过本文,读者将能够掌握如何高效地利用行分组功能,提升报表的可读性和数据展示效果。 ... [详细]
  • 本文详细解析了CSS背景属性的简写顺序,包括背景颜色、背景图像、背景重复方式、背景固定方式等关键要素,帮助开发者更好地理解和应用这一重要样式规则。通过具体示例和实际应用场景,文章深入探讨了每个属性在简写形式中的排列和作用,为前端开发提供了实用的参考。 ... [详细]
  • 指针超出边界:深入解析与防范措施
    在编程过程中,使用 `pNULL` 来判断遍历是否完成是一种不推荐的做法。本文深入分析了指针超出边界的问题,并提出了有效的防范措施,以确保代码的健壮性和安全性。通过详细探讨指针操作中的常见错误及其潜在风险,本文为开发者提供了实用的指导建议,帮助他们在实际开发中避免此类问题。 ... [详细]
  • 【Beta版】第四次Scrum会议纪要与进展更新
    本次Scrum会议由项目经理主持,于5月9日晚10点30分召开,持续15分钟。会议主要讨论了团队成员在过去一天的工作进展及下一步计划。具体而言,木鬼负责撰写博客并整理相关文档,而swoip则专注于改进用户界面的设计与功能。此外,团队还对当前的任务列表进行了更新,确保各项任务按时推进。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • 在Linux系统中,原本已安装了多个版本的Python 2,并且还安装了Anaconda,其中包含了Python 3。本文详细介绍了如何通过配置环境变量,使系统默认使用指定版本的Python,以便在不同版本之间轻松切换。此外,文章还提供了具体的实践步骤和注意事项,帮助用户高效地管理和使用不同版本的Python环境。 ... [详细]
  • 在使用sbt构建项目时,遇到了“对象apache不是org软件包的成员”的错误。本文详细分析了该问题的原因,并提供了有效的解决方案,包括检查依赖配置、清理缓存和更新sbt插件等步骤,帮助开发者快速解决问题。 ... [详细]
  • 构建顶级PHP博客系统:实践与洞见
    构建顶级PHP博客系统不仅需要扎实的技术基础,还需深入理解实际应用需求。本文以Zend Studio为开发环境,MySQL作为数据存储,Apache服务器为运行平台,结合jQuery脚本语言,详细阐述了从环境搭建到功能实现的全过程,分享了开发PHP博客管理系统的宝贵经验和实用技巧。 ... [详细]
  • 如何在Linux系统中实施网络流量监测与分析
    本文详细介绍了在Linux系统中实施网络流量监测与分析的方法。通过使用专业的工具和技术,读者可以有效地监控和分析网络流量,从而提高系统的安全性和性能。希望本文能为读者提供有价值的参考和实践指导。 ... [详细]
author-avatar
小花诸葛_630
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有