Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1770|回复: 2

[默认分类] JavaWeb用户登录功能的实现

  [复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-13 17:54:43 | 显示全部楼层 |阅读模式
         大四快毕业了,3年多的时间中,乱七八糟得学了一大堆,想趁找工作之前把所学的东西整理一遍,所以就尝试着做一个完整的javaWeb系统,这几天试着做了一个用户登录的功能,分享给大家,肯定有很多不完善的地方,希望大家提提宝贵的意见,必将努力完善它。
         我贴出此篇博客的目的是,将一些以后有可能用到的重复性的代码保存下来,用于以后需要时直接复制粘贴,所以,此篇博客大部分都是代码,讲解性的语句并不多,如果大家看得头疼,不如不看,以后万一用到的话再拿过来修修改改即可。
         有可能用得到的部分:生成验证码的Java类、操作数据库的Java类
    用户登录模块采用了多种语言:
    HTML、css、query:页面
    Servlet、java:后台
    运行效果图:
    Login.html代码:
    <!DOCTYPE html>
    <html>
    <head lang="en">
         <meta charset="UTF-8">
         <title>登录界面</title>
         <script src="js/jquery-1.11.1.js"></script>
         <script src="js/login.js"></script>
         <link href="css/style.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
         <div id="loginpanelwrap">
             <div class="loginheader">
                 <div class="logintitle">登录</div>
             </div>
             <form action = "/UserLogin/Sample1/loginServlet">
                 <div class="loginform">
                     <div class="loginform_row">
                         <label>用户名:</label>
                         <input type="text" class="loginform_input" name="username" />
                     </div>
                     <div class="loginform_row">
                         <label>密码:</label>
                         <input type="password" class="loginform_input" name="password" />
                     </div>
                     <div class = "loginform_row">
                         <label>验证码:</label>
                         <input type = "text" class="loginform_input_validationCode" name = "validationCode"/>
                         <img class = "validationCode_img" src="/UserLogin/Sample1/validationCode">
                     </div>
                     <div class="loginform_row">
                         <span class = "returnInfo"></span>
                         <input type="submit" class="loginform_submit" value="登录" />
                     </div>
                     <div class="clear"></div>
                 </div>
             </form>
         </div>
    </body>
    </html>
    JQuery代码:login.js
      
    $(function(){
        $(".loginform_submit").click(function(){
            if(checkInput()) {
                $("form").action("/loginServlet");
            }else{
                return false;
            }
        });
        $(".validationCode_img").click(function(){
            $(".validationCode_img").attr("src","/UserLogin/Sample1/validationCode?"+Math.random());
        });
         function checkInput(){
             //判断用户名
             if($("input[name=username]").val() == null || $("input[name=username]").val() == ""){
                 alert("用户名不能为空");
                 $("input[name=username]").focus();
                 return false;
             }
             //判断密码
             if($("input[name=password]").val() == null || $("input[name=password]").val() == ""){
                 alert("密码不能为空");
                 $("input[name=password]").focus();
                 return false;
             }
             //判断验证码
             if($("input[name=validationCode]").val() == null || $("input[name=validationCode]").val() == ""){
                 alert("验证码不能为空");
                 $("input[name=validationCode]").focus();
                 return false;
             }
             return true;
         }
    });
    生成验证码的Servlet:ValidationCode.java
    package zh.userlogin.sample;
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.Random;
    /**
    * Created by zhang on 2014/9/13.
    */
    public class ValidationCode extends HttpServlet{
         @Override
         protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
             //获得验证码集合的长度
             int charsLength = codeChars.length();
             //下面3条记录是关闭客户端浏览器的缓冲区
             //这3条语句都可以关闭浏览器的缓冲区,但是由于浏览器的版本不同,对这3条语句的支持也不同
             //因此,为了保险起见,同时使用这3条语句来关闭浏览器的缓冲区
             resp.setHeader("ragma", "No-cache");
             resp.setHeader("Cache-Control", "no-cache");
             resp.setDateHeader("Expires", 0);
             //设置图形验证码的长和宽
             int width = 90, height = 30;
             BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
             Graphics g = image.getGraphics(); //获得用于输出文字的Graphics对象
             Random random = new Random();
             g.setColor(getRandomColor(180, 250));
             g.fillRect(0, 0, width, height);
             g.setFont(new Font("Times New Roman",Font.ITALIC,height));
             g.setColor(getRandomColor(120, 180));
             //用户保存最后随机生成的验证码
             StringBuilder validationCode = new StringBuilder();
             //验证码的随机字体
             String[] fontNames = {"Times New Roman","Book antiqua","Arial"};
             //随机生成4个验证码
             for(int i = 0; i < 4; i++){
                 //随机设置当前验证码的字符的字体
                 g.setFont(new Font(fontNames[random.nextInt(3)],Font.ITALIC,height));
                 //随机获得当前验证码的字符
                 char codeChar = codeChars.charAt(random.nextInt(charsLength));
                 validationCode.append(codeChar);
                 //随机设置当前验证码字符的颜色
                 g.setColor(getRandomColor(10, 100));
                 //在图形上输出验证码字符,x和y都是随机生成的
                 g.drawString(String.valueOf(codeChar), 16*i + random.nextInt(7), height-random.nextInt(6));
             }
             //获得HttpSession对象
             HttpSession session = req.getSession();
             //设置session对象5分钟失效
             session.setMaxInactiveInterval(5*60);
             //将验证码保存在session对象中,key为validation_code
             session.setAttribute("validation_code", validationCode.toString());
             //关闭Graphics对象
             g.dispose();
             OutputStream outS = resp.getOutputStream();
             ImageIO.write(image, "JPEG", outS);
         }
         @Override
         protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
             doGet(req,resp);
         }
         //图形验证码的字符集,系统将随机从这个字符串中选择一些字符作为验证码
         private static String codeChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
         //返回一个随机颜色
         private static Color getRandomColor(int minColor, int maxColor){
             Random random = new Random();
             if(minColor > 255){
                 minColor = 255;
             }
             if(maxColor > 255){
                 maxColor = 255;
             }
             //获得r的随机颜色值
             int red = minColor + random.nextInt(maxColor-minColor);
             //g
             int green = minColor + random.nextInt(maxColor-minColor);
             //b
             int blue = minColor + random.nextInt(maxColor-minColor);
             return new Color(red,green,blue);
         }
    }
    操作数据库的代码:ManageSQLServer2008.java(本人使用的数据库为SQLServer 2008)
    package zh.userlogin.sample.dbmanager;
    import java.beans.Statement;
    import java.sql.*;
    public class ManageSQLServer2008 {
         //数据库的驱动名
         private final String dbDriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
         //数据库的url地址
         private final String url = "jdbc:sqlserver://localhost:1433;databaseName=zhDemo";
         private final String userName = "sa";
         private final String password = "123";
         private Connection conn = null;
         public ManageSQLServer2008(){
             //加载数据库驱动
             try {
                 Class.forName(dbDriver).newInstance();
                 //System.out.println("加载驱动成功");
             } catch (Exception e) {
                 e.printStackTrace();
                 System.err.println("数据库驱动加载失败");
             }
             //获取数据库链接
             try {
                 conn = DriverManager.getConnection(url,userName,password);
             } catch (SQLException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
                 System.err.println("获取数据库链接失败");
             }
         }
         //执行各种SQL语句的方法
         private ResultSet execSQL(String sql,Object... args) throws SQLException{
             //建立PreparedStatement对象
             PreparedStatement pStmt = conn.prepareStatement(sql);
             //为pStmt对象设置SQL参数值
             for(int i = 0; i < args.length; i++){
                 pStmt.setObject(i+1, args);
             }
             //执行SQL语句
             pStmt.execute();
             //返回结果集,如果执行的SQL语句不返回结果集,则返回null
             return pStmt.getResultSet();
         }
         private void closeSQLConn(){
             //关闭数据库链接
             if(conn != null){
                 try {
                     conn.close();
                 } catch (SQLException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
             }
         }
         public String checkUser(String username,String password){
             boolean has_username = false;
             boolean password_correct = false;
             ResultSet rs = null;
             try {
                 rs = execSQL("select * from zh_users");
             } catch (SQLException e) {
                 System.err.println("查询数据库出错");
                 e.printStackTrace();
                 return null;
             }
             try {
                 while(rs.next()){
                     String temp_username = rs.getString("user_name").trim();
                     String temp_password = rs.getString("password_md5").trim();
                     if(username.equals(temp_username)){
                         has_username = true;
                         if(password.equals(temp_password)){
                             password_correct = true;
                             return "hasUserNameAndPasswordCorrect";
                         }
                         return "hasUserNameButPasswordInCorrect";
                     }
                 }
             } catch (SQLException e) {
                 System.err.println("操作ResultSet出错");
                 e.printStackTrace();
             }
             return "hasNoUserName";
         }
    }
    用于处理用户登录的Servlet:LoginServlet.java
    package zh.userlogin.sample;
    import zh.userlogin.sample.dbmanager.ManageSQLServer2008;
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    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.OutputStream;
    /**
    * Created by zhang on 2014/9/13.
    */
    public class LoginServlet extends HttpServlet{
         @Override
         protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
             OutputStream out = resp.getOutputStream();
             String username = req.getParameter("username");
             String password = req.getParameter("password");
             String validationCode = req.getParameter("validationCode");
             HttpSession session = req.getSession();
             String validation_code = (String)session.getAttribute("validation_code");
             if(validationCode.equalsIgnoreCase(validation_code)){
                 System.out.println("验证码正确");
             }else{
                 System.out.println("验证码错误");
             }
             ManageSQLServer2008 mss = new ManageSQLServer2008();
             String result = mss.checkUser(username,password);
             if (result.equals("hasUserNameAndPasswordCorrect")) {
                 System.out.println("用户名和密码均正确");
             } else if (result.equals("hasUserNameButPasswordInCorrect")) {
                 System.out.println("用户名正确,密码不正确");
             } else if (result.equals("hasNoUserName")) {
                 System.out.println("没有此用户");
             }
             //转发到result.jsp
             RequestDispatcher rd = req.getRequestDispatcher("Login.html");
             rd.forward(req, resp);
         }
         @Override
         protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
             doGet(req,resp);
         }
    }
    web.xml文件的配置:
    <servlet>
             <servlet-name>loginServlet</servlet-name>
             <servlet-class>zh.userlogin.sample.LoginServlet</servlet-class>
         </servlet>
         <servlet-mapping>
             <servlet-name>loginServlet</servlet-name>
             <url-pattern>/loginServlet</url-pattern>
         </servlet-mapping>
         <servlet>
             <servlet-name>validationCode</servlet-name>
             <servlet-class>zh.userlogin.sample.ValidationCode</servlet-class>
         </servlet>
         <servlet-mapping>
             <servlet-name>validationCode</servlet-name>
             <url-pattern>/validationCode</url-pattern>
    </servlet-mapping>
    最后的style.css代码,太多了,而且有点乱,所以就没有贴出来,至于CSS代码,大家可以去网上下载:http://sc.chinaz.com/tag_moban/htmlMoBan.html这个上面就有好多,大家根据喜好选择一个,然后稍加即可。
    回复

    使用道具 举报

    该用户从未签到

    发表于 2018-9-20 11:43:40 | 显示全部楼层
    这是登陆的,注册的怎么写呢
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2018-10-11 21:08:41 | 显示全部楼层
    ellenhe 发表于 2018-9-20 11:43
    这是登陆的,注册的怎么写呢

    什么叫举一反三?这登陆的你看明白了,注册功能也差不多。前提是数据库的增删改查要熟练。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-3-29 18:59 , Processed in 0.406233 second(s), 51 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表