Javaweb连接MySQL实现简单登录页面

Javaweb连接MySQL实现简单登录页面

1.cookie和session简单介绍

首先,说一个有趣的现象,就是当你登录了某宝页面成功进入其主页后,复制其地址,
在这里插入图片描述

然后关闭当前主页,粘贴刚刚复制的地址,你会发现很神奇的现象发生了,你不需要在填写账号密码信息,你已经登录在当前页面了
在这里插入图片描述

你就会思考,会不会有人利用这段地址来帮我清空购物车???
首先,说明一下,关于为什么这段地址能绕过登录页面直接登录你的账号,起到作用的就是session和cookie,cookie是存在客户端,session是存在服务器端,关于它们的具体介绍,读者可以自行百度。这里只简要说一下,读者也不必担心有人会利用你的这段地址,因为session的有效范围是当前会话。所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程可能包含多个请求响应。也就是说,只要用户不关浏览器,服务器就有办法知道这些请求是一个人发起的,整个过程被称为一个会话(session),而放到会话中的变量,就可以在当前会话的所有请求里使用。也就是说只有用你的电脑当前的浏览器去访问这段地址能绕过登录注册页面, 且session的有效时间一般为几分钟,你关闭浏览器或者几分钟后这段地址也就失效了。好了,简单介绍完这个有趣的现象,接下来谈谈如何使用IDEA访问数据库,实现一个简单的登录功能。
2.数据库设计
我们需要确定我们用户的账号和密码,通过mySql新建的表如下:
在这里插入图片描述

创建了一个manager表,包含三个字段(id,user_name,pwd)。然后添加一些记录如下:
在这里插入图片描述
3.创建IDEA Maven项目(IDEA配置可自行度娘,并不难)
在这里插入图片描述
选中图中所选的模版点击next。
在这里插入图片描述
配置GAV,给项目取名,然后next
在这里插入图片描述
选择直接配置的Maven所在路径和仓库所在路径,然后finish。

4.给项目添加依赖包
在pom.xml中的dependencies标签中添加依赖包

 <dependencies>
    <!--mysql依赖包-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.15</version><!--数据库版本号,注意与自己安装的mySql一样-->
    </dependency>
    <dependency>
    <!--这个本来就存在的-->
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
    <!--servlet依赖-->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.3</version>
      <scope>provided</scope>
    </dependency>
    <!--jstl表达式的依赖-->
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>
  </dependencies>

刷新之后,可以看到依赖中多了几个jar包:
在这里插入图片描述
5.编写登录页面:(复制到index.jsp中)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录页面</title>
    <!--内部样式-->
    <style>
        /*标签选择器*/
        div{
            text-align:center;
            width: 400px;
            height: 200px;
            border:2px solid black;
        }
        h2{
             text-align:center;
        }
        form{
             text-align:center;
        }
    </style>
</head>
<body>
<div>
    <h2>longin</h2>
    <form action="${pageContext.request.contextPath}/home" method="post">
        <!--text和password-->
        <p>名字:<input type="text" name="username"  maxlength="10"  required></p>
        <p>密码:<input type="password" name="pwd" required></p>
        <hr>
        <p><input type="submit"> <input type="reset"></p>
    </form>
</div>
</body>
</html>

简单编写一个登录页面,如下:
在这里插入图片描述
6.编写登录成功跳转页面和登录失败提示页面
如图,在webapp下新建两个文件夹sys和error(添加文件夹的目的是为了防止直接复制地址就能登录的情况,之后会设置过滤器来避免直接复制当前地址就能跳转到主页面的情况),sys下存放登录成功后的主页面home.jsp,error下存放登录失败后跳转的提示页面Logfail.jsp。
在这里插入图片描述
home.jsp如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>主页面</title>
</head>
<body>
登录成功!!!
在此编写主页面内容:
</body>
</html>

Logfail.jsp如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录失败页面</title>
</head>
<body>
用户名或者密码错误!!! <br>
登录失败提示,可以通过ajax来提示,本次实例新建一个页面来给用户提示登录失败!!!
</body>
</html>

7.IDEA 连接mySQL(比较简单,也可度娘)
点击database中的加号,然后如图选择
在这里插入图片描述
然后如下图填写,密码为你连接数据库的密码,Database为你创建的manager表所建立的数据库。
在这里插入图片描述

8.编写登录处理java代码
首先说明一下,在main下新建一个java代码根目录(新建一个java目录,然后将它标记为代码目录,标记方法如下图,右击java文件夹然后如图选择)
在这里插入图片描述

然后新建如下图相关包和类:
在这里插入图片描述
这里说明一下MyContants类为一个字符串常量,用来设置session的属性,其代码如下:

package com.lin.mycontants;

public class MyContants {
    //设置常量来记录session id,用来实现过滤器,防止通过访问地址直接访问主页面home
    public static final  String USER_SESSION="USER_SESSION";
}

charsetFilter类用来过滤所有页面的字符编码为utf-8.

public class charsetFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走,如果不写,程序到这里就被拦截停止
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

homefilter类防止出现没有登录,直接复制地址就可以跳转到主页面(没有登录之前,登录了之后可以复制地址跳转主页面,因为有了session信息,如前面所述一样,这里是为了没有第一次登录就能直接通过输入主页地址直接跳转到主页。设置了session的有效时间为一分钟,web.xml有提到,这样关闭浏览器或者一分钟后就不能直接利用地址直接访问主页了),代码如下:

public class homefilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request=(HttpServletRequest) req;
        HttpServletResponse response=(HttpServletResponse) resp;
      /*获取USER_SESSION信息,如果为空,则为首次访问,不允许直接访问,重定向到登录页面*/
        if(request.getSession().getAttribute(MyContants.USER_SESSION)==null)
        {
            response.sendRedirect(request.getContextPath()+"/index.jsp");
        }
        filterChain.doFilter(request,response);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }

然后是连接mysql的工具类:MyJDBC

public class MyJDBC {
    //url为你连接数据的字符串
    private static final String URL="jdbc:mysql://localhost:3306/studenttable?serverTimezone=UTC&useSSL=false";
    private static final String DRIVER="com.mysql.cj.jdbc.Driver";

    private  static final String USER_NAME ="root";//这里是你的数据库的用户名
    private  static  final String PWD ="65636532";//你进入数据库的密码
    /*加载驱动*/
    static {
        try {
            //com.mysql.jdbc.Driver 静态代码块,执行
            Class.forName(DRIVER);
        }catch (ClassNotFoundException e)
        {e.printStackTrace();}
    }
    //获取数据库链接
    public static Connection getCon(){
        try {
            return DriverManager.getConnection(URL, USER_NAME , PWD);
        } catch (SQLException e)
        {
            e.printStackTrace();
        }
        return null;
    }
    //关闭数据库连接
    public  static  void  closeCon(Connection connection){
        if(connection!=null)
            try {
                connection.close();
            }catch (SQLException e)
            {
                e.printStackTrace();
            }
    }
    // 关闭测试插入数据库
    public static void  closePs(PreparedStatement ps){
        if(ps!=null)
            try {
                ps.close();
            }catch (SQLException e)
            {
                e.printStackTrace();
            }
    }
    //关闭ResultSet
    public  static void closeRs(ResultSet rs)
    {
        if(rs!=null)
            try {
                rs.close();
            }catch (SQLException e)
            {
                e.printStackTrace();
            }
    }
}

最后是登录处理的servlet的子类

package com.lin.myservlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.lin.mycontants.MyContants;
import myjdbc.MyJDBC;

public class LoginHandle extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       // super.doPost(req, resp);
        // super.doPost(req, resp);
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        String username=req.getParameter("username");
        String pwd=req.getParameter("pwd");
        if(validateAdmin(username,pwd))
        {
            //将当前session id添加到USER_SESSION属性中
            req.getSession().setAttribute(MyContants.USER_SESSION,req.getSession().getId());
            //重定向到home
            resp.sendRedirect(req.getContextPath()+"/sys/home.jsp");
        }
        else
        {
            //移除当前USER_SESSION属性
            req.getSession().removeAttribute(MyContants.USER_SESSION);
            //重定向到错误页面
            resp.sendRedirect(req.getContextPath()+"/error/Logfail.jsp");
        }
    }
    //验证登录函数
    public boolean validateAdmin(String username,String pwd) {

        String sql="select pwd from manager where user_name=? ";
        Connection con= null;
        PreparedStatement ps=null;
        ResultSet resultSet=null;

        try {
            //获取数据库连接
            con= MyJDBC.getCon();
            if(con==null)
                return false;
            ps = con.prepareStatement(sql);
            //设置sql语句参数并执行
            ps.setString(1, username);
            resultSet=  ps.executeQuery();
            //将查询结果存放于Rpwd中,没有查询结果的话,将不会执行循环语句,直接返回FALSE
            while (resultSet.next())
            {
                String Rpwd= resultSet.getString(1);
                //判断密码是否正确
                if(Rpwd.equals(pwd))
                    return  true;

            }
        }catch (SQLException e)
        {
            e.printStackTrace();
        }
        finally {
            MyJDBC.closeRs(resultSet);
            MyJDBC.closeCon(con);
            MyJDBC.closePs(ps);
        }
        return false;

    }
}

9.配置web.xml
最后在web.xml中添加servlet类映射和filter映射(将这段代码复制到web.xml)

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
  <servlet>
    <servlet-name>longinhome</servlet-name>
    <servlet-class>com.lin.myservlet.LoginHandle</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>longinhome</servlet-name>
    <url-pattern>/home</url-pattern>
  </servlet-mapping>

  <filter>
    <filter-name>charfilter</filter-name>
    <filter-class>com.lin.myfilter.charsetFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>charfilter</filter-name>
    <url-pattern>*</url-pattern>
  </filter-mapping>

  <filter>
    <filter-name>homefilter</filter-name>
    <filter-class>com.lin.myfilter.homefilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>homefilter</filter-name>
    <url-pattern>/sys/*</url-pattern>
  </filter-mapping>
  <!--设置当前session有效为1分钟-->
  <session-config>
    <session-timeout>1</session-timeout>
  </session-config>
  <display-name>Archetype Created Web Application</display-name>
</web-app>

10.配置Tomcat环境(IDEA配置Tomcat环境可自行度娘,这里不在叙述)
首先选择编辑环境为Tomcat
在这里插入图片描述

在这里插入图片描述
然后点击Deployment中的加号新建artifacts,选择当前项目。
在这里插入图片描述
11.运行结果
先通过填写首页地址查看是否能直接登录,结果为跳转到登录页面,然后分别测试登录成功和错误结果。
在这里插入图片描述

  • 8
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaWeb是基于Java语言开发的Web应用程序框架,它可以很方便地实现用户登录注册功能,并且可以利用MySQL数据库来存储用户信息。 首先,我们可以在JavaWeb中创建一个登录页面和一个注册页面。登录页面包括用户名和密码输入框,注册页面包括用户名、密码和确认密码输入框。 当用户点击登录按钮时,JavaWeb会将用户输入的用户名和密码发送到服务器端。服务器端通过MySQL数据库中的用户表,查询是否存在匹配的用户名和密码。如果匹配成功,则登录成功;否则,登录失败。 当用户点击注册按钮时,JavaWeb会将用户输入的用户名和密码发送到服务器端。服务器端需要先检查用户名是否已经存在于用户表中,如果存在,则返回错误提示;否则,在用户表中插入新的用户记录,并返回注册成功的提示信息。 在实现中,我们可以使用JavaWeb框架中的Servlet来处理用户提交的登录和注册请求。在处理登录请求时,我们可以使用JDBC来连接MySQL数据库,并使用SQL语句进行查询操作。在处理注册请求时,我们可以使用相同的JDBC连接MySQL数据库,并使用SQL语句进行插入操作。 此外,为了增加用户体验,我们可以利用JavaWeb框架提供的Session来维护用户的登录状态。在用户登录成功后,我们可以将其登录信息存储在Session中,在用户访问其他页面时进行验证,以确保用户已经登录。 通过以上步骤,我们可以很方便地实现用户登录注册功能,并利用MySQL数据库来存储用户信息。这样,用户就可以通过登录来访问需要身份认证的页面,而无需重复注册。同时,我们也可以通过MySQL数据库来管理用户信息,例如修改密码、找回密码等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值