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.运行结果
先通过填写首页地址查看是否能直接登录,结果为跳转到登录页面,然后分别测试登录成功和错误结果。