1、程序要求:
登陆模块案例
完成用户登陆功能。
用户名及密码保存在数据库之中,可以使用数据库完成验证,数据库通过则表示用户为合法用户,跳转到登陆成功页,否则表示用户名或密码不正确,跳转到登陆失败页。
2、输出页面:
2.1、页面总体流程:
2.2、具体演示:
A、登陆首页:
B、登陆成功页:
C、登陆失败页:
3、分析
如果完成此功能,则至少需要四个页面:
1、login.jsp
用户输入信息的表单
<%@page import="java.net.ConnectException"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="com.mysql.jdbc.Driver"%>
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<%
//获取login.jsp页面的表单输入的用户名和密码
String name = request.getParameter("username");
String password = request.getParameter("password");
%>
<%
String Url = "jdbc:mysql://localhost/db03";//db3是我的数据库名
String Username = "root";
String Password = "19981231";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(Url, Username, Password);
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select name,password from user");
boolean flag = false;
while (rs.next()) {
if (rs.getString("name").equals(name) && rs.getString("password").equals(password))
flag = true;
}
%>
<%
if (flag == true) {
%>
<jsp:forward page="login_success.jsp" />
<%
} else {
%>
<jsp:forward page="login_failure.jsp" />
<%
}
%>
</body>
</html>
2、login_conf.jsp
· 接收参数
· 读取据库,判断参数
· 相符则设置通行证并跳转到登录成功页面
· 不相符则跳转到登录失败页面
<%@page import="java.net.ConnectException"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="com.mysql.jdbc.Driver"%>
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<%
//获取login.jsp页面的表单输入的用户名和密码
String name = request.getParameter("username");
String password = request.getParameter("password");
%>
<%
String Url = "jdbc:mysql://localhost/db03";
String Username = "root";
String Password = "19981231";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(Url, Username, Password);
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select name,password from user");
boolean flag = false;
while (rs.next()) {
if (rs.getString("name").equals(name) && rs.getString("password").equals(password))
flag = true;
}
%>
<%
if (flag == true) {
%>
<jsp:forward page="login_success.jsp" />
<%
} else {
%>
<jsp:forward page="login_failure.jsp" />
<%
}
%>
</body>
</html>
3、login_success.jsp
· 显示欢迎信息
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>登陆成功</title>
<style>
body{
text-align:center;
}
</style>
</head>
<body>
<h1>用户登陆系统</h1><br/>
<hr>
<h><font color="red"><b>登陆成功!</b></font></h><br/>
<p>
欢迎<%=request.getParameter("username") %>进入系统!<br/><br/>
<a href="logout.jsp">注销请点击这里</a>
</p>
</body>
</html>
4、logout.jsp
· 注销通行证
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>注销界面</title>
<style>
body{
text-align:center;
}
</style>
</head>
<body>
<%
response.setHeader("refresh", "3;URL=login.jsp");
session.invalidate();
%>
<h3>你已经成功退出本系统,3秒后会跳转到首页</h3>
<h3>
如果没有跳转请点击<a href="login.jsp">这里</a>
</h3>
</body>
</html>
5、login_failure.jsp
· 显示登陆失败信息
· 给出一个超级链接,可以使用户返回到登录页面
4、MySql驱动程序:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>登陆失败</title>
<style>
body{
text-align:center;
}
</style>
</head>
<body>
<h1>用户登陆系统</h1><br/>
<hr>
<h><font color="red"><b>登陆失败!</b></font><br/></h>
<h><font color="red"><b>您的用户名或密码有误!<br/></b></font></h>
<a href="login.jsp">点击重新登陆</a>
</body>
</html>
驱动程序:com.mysql.jdbc.Driver
连接地址:jdbc:mysql://localhost/mydb
数据库用户名:root
数据库密码:root
之前范例的问题:
1、用户名及密码固定,不适合于更多人使用
2、用户修改密码必须修改 JSP 页面
解决之道: 使用数据库,让所有的用户名及密码保存在数据库中。
使用MYSQL数据库
数据库:mydb
在数据库操作中必须使用 JDBC,回顾 JDBC 基本操作步骤:
1、加载驱动程序
Class.forName("数据库驱动程序"):
// 由各数据库厂商提供
要将 MySQL的驱动程序存放到:%TOMCAT_HOME%/common/lib 中 将驱动程序包拷贝完成之后,如果服务器已经启动,则需要重新启动。
2、连接数据库(Connection)
Connection conn = DriverManager.getConnection("数据库连接 url","用户名","密码") ;
3、操作数据库(CRUD)使用 Statement、PreparedStatement
· 更新数据库:
|- INSERT(插入)
|- UPDATE(更新)
|- DELETE(删除)
· 查询数据库:(ResultSet)
|- SELECT
4、关闭数据库连接
// 定义数据库驱动程序
String DBDRIVER = "";
// 定义数据库连接地址
String DBURL = "";
// 定义数据库用户名
String DBUSER ="";
// 定义数据库密码
String DBPASS = "";
// 定义数据库连接对象
Connection conn = null;
// 定义数据库操作对象
Statement stmt;
// 定义SQL变量
String sql = "";
// 定义结果集对象
ResultSet rs = null;
// 1、加载数据库驱动程序
try{
}catch(Exception e){
out.println("数据库驱动程序加载失败!");
}
// 2、连接数据库
try{
}catch(Exception e){
out.println("数据库连接失败!");
}
// 3、操作数据库
try{
// 实例化Statement对象
// 赋值SQL语句
// 通过Statement对象执行SQL语句
}catch(Exception e){
out.println("数据库操作失败!");
}
// 4、关闭数据库
try{
}catch(Exception e){
out.println("数据库关闭失败!");
}
forward 跳转属于服务器端的跳转:
forward 之后的代码不再被执行
此时的登陆是基于 Statement 完成,所有 SQL 语句是通过拼凑完成的。
存在安全问题:SQL 注入漏洞
SELECT name FROM person WHERE id='lxh' and password='fsadfds' or 'x'='x'
密码输入:fsadfds' or 'x'='x
在程序中使用 PreapredStatement 来代替 Statement 使用在开发中基本上都是使用 PreapredStatement 来操作数据库的。