/**
* 分析流程:
* 1、前端页面提交登录请求
* 2、被web.xml拦截,进入到LoginServlet(有两种方式:方式一,在web.xml文件中配置servlet拦截器;方式二,不用在web.xml中配置,直接在类中通过                         @WebServlet("/login")注解    //请求路径)
* 3、获取页面输入的用户名和密码
* 4、创建一个工具类,用于生成连接工厂
* 5、调用UserDao层,通过连接工厂连接数据库,根据名字查询用户
* 6、拼接sql语句,set参数,执行预编译,返回结果集
* 7、判断结果集是否存在,如果存在,就return数据
* 8、在LoginServlet中调用dao层后获取到数据,获取session对象,将获取到的数据存储到session对象中
* 9、资源跳转到页面
* 10、跳转到成功页面,显示数据
*/

代码示例:

1、前端页面提交登录请求

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录页面</title>
</head>
<body>
<form action="login" method="post">
用户名:<input name="username" type="text"><br>
密 码:<input name="password" type="password"><br>
<button type="submit">登录</button>
</form>
</body>
</html>

2、被web.xml拦截,进入到LoginServlet(有两种方式:方式一,在web.xml文件中配置servlet拦截器;方式二,不用在web.xml中配置,直接在类中通过                         @WebServlet("/login")注解    //请求路径)

配置的web.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>demo2</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>org.fkjava.Servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/</url-pattern> //拦截所有的请求
</servlet-mapping>
</web-app>

3、请求被拦截后跳转到LoginServlet类中,获取页面输入的用户名和密码,调用dao层获取数据,将获取到的数据保存到session对象中,然后重定向,将数据发到成功页面

package org.fkjava.Servlet;
import java.io.IOException;
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 javax.servlet.http.HttpSession;
import org.fkjava.bean.User;
import org.fkjava.dao.UserDao;
import org.fkjava.util.MD5;
/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/login")//请求路径, 如果配置了@WebServlet注解就不配置web.xml,两者二选一
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**设置请求编码*/
request.setCharacterEncoding("UTF-8");
/**设置响应类型*/
response.setContentType("text/html");
/**设置响应编码*/
response.setCharacterEncoding("UTF-8");

//获取MD5加密对象
MD5 pwd = new MD5();
//获取输入的用户名和密码
String name = request.getParameter("username");
String pass = null;
try {
pass = pwd.getMD5(request.getParameter("password"));
} catch (Exception e) {
// TODO: handle exceptio
e.printStackTrace();
}
//初始化dao层
UserDao userDao = new UserDao();
/**调用dao层的获取用户的方法*/
try {
String user = userDao.findUserByName(name,pass);
System.out.println(user); //获取session,将获取到的数据保存到session中
HttpSession session = request.getSession();
session.setAttribute("user", user);
//重定向,跳转到成功页面
response.sendRedirect("success.jsp"); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

4、创建一个工具类,用于生成连接工厂,这里需要使用的数据库的驱动jar包mysql-connector-java-5.1.40.jar

package org.fkjava.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionFactory {
//准备参数
private static String url = "jdbc:mysql://127.0.0.1:3306/rqzc_db?useSSL=false";
private static String user = "root";
private static String password =""; //使用静态代码块加载驱动
static{
try {
/**使用类名加载数据库驱动*/
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
/**创建运行时异常*/
throw new RuntimeException("数据库驱动加载异常!", e);
}
}
/**提供公共、静态的连接数据库的方法*/
public static Connection getConnection() throws SQLException{
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}
}

5、创建UserDao类,通过连接工厂获取连接,拼接sql语句,执行预编译(方式sql语句攻击,例如admin' or '1'='1会直接通过),设置参数,执行查询语句返回结果集

package org.fkjava.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.fkjava.jdbc.ConnectionFactory;
public class UserDao { public String findUserByName(String name, String pass) throws Exception {
/**获取连接,因为连接工厂设置的静态方法,可以指定使用类名调用方法*/
Connection conn = ConnectionFactory.getConnection();
/**拼接sql语句*/
String sql = "select * from r_employee where username= ? and password = ?";
/**预编译sql语句,这样是为了防止sql语句攻击*/
PreparedStatement statement = conn.prepareStatement(sql);
/**set参数,1表示第一个参数,2表示第二个参数*/
statement.setString(1, name);
statement.setString(2, pass);
//执行sql语句,返回结果集
ResultSet rs = statement.executeQuery();
/**判断结果集是否有数据*/
if(rs.last()){
/**返回用户真实姓名*/
return rs.getString("realname");
}else{
return "查询失败!";
}
}
}

6、如果查询到数据,保存到session对象中,并重定向到成功页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>成功页面</title>
</head>
<body>
${sessionScope.user}:登录成功!
</body>
</html>

7、bean实体类

package org.fkjava.bean;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}

8、补充:下面是编码结构示意图:

使用servlet+jdbc+MD5实现用户加密登录的更多相关文章

  1. [项目分享]JSP+Servlet+JDBC实现的学生信息管理系统

    本文存在视频版本,请知悉 项目简介 项目来源于:https://gitee.com/liu_xu111/JavaWeb01 这次分享一个学生管理系统,我感觉这是程序员在大学时期的毕设和课程设计选择最多 ...

  2. Maven+JSP+Servlet+JDBC+Mysql实现的dbExper宾馆管理系统

    本文存在视频版本,请知悉 项目简介 项目来源于:https://github.com/mafulong/databaseExper-hotelMaster 这次分享的也是毕设或课程设计选择一样很多的宾 ...

  3. JSP+Servlet+JDBC+Mysql实现的天才会议管理系统

    本文存在视频版本,请知悉 项目简介 项目来源于:https://github.com/hegexunmeng/meeting-system 这次分享一个会议管理系统,前端后端几乎没有使用任何框架,适合 ...

  4. JSP+Servlet+JDBC+C3P0实现的人力资源管理系统

    项目简介 项目来源于:https://github.com/ruou/hr 本系统基于JSP+Servlet+C3P0+Mysql.涉及技术少,易于理解,适合JavaWeb初学者学习使用. 难度等级: ...

  5. JSP+Servlet+JDBC+mysql实现的个人日记本系统

    项目简介 项目来源于:https://gitee.com/wishwzp/Diary 本系统基于JSP+Servlet+Mysql 一个基于JSP+Servlet+Jdbc的个人日记本系统.涉及技术少 ...

  6. JSP+Servlet+JDBC+mysql实现的学生成绩管理系统

    项目简介 项目来源于:https://gitee.com/zzdoreen/SSMS 本系统基于JSP+Servlet+Mysql 一个基于JSP+Servlet+Jdbc的学生成绩管理系统.涉及技术 ...

  7. Struts+Servlet+JDBC网上手机销售系统

    项目描述 Hi,大家好,今天给大家分享一个<网上手机销售系统>.本系统一共分为前台和后台两大模块,两个模块之间虽然在表面上是相互独立的,但是在对数据库的访问上是紧密相连的,各个模块访问的是 ...

  8. com.microsoft.sqlserver.jdbc.SQLServerException: 用户 'sa' 登录失败。

    com.microsoft.sqlserver.jdbc.SQLServerException: 用户 'sa' 登录失败. at com.microsoft.sqlserver.jdbc.SQLSe ...

  9. 【J2EE】Java连接SQL Server 2000问题:“com.microsoft.sqlserver.jdbc.SQLServerException:用户'sa'登录失败。该用户与可信SQL Server连接无关联”

    1.问题现象 E:\JSP\HibernateDemo\HibernateDemoProject\src\sine>java ConnectSQLServerConnect failed!com ...

随机推荐

  1. Mac系统中idea配置git总结

    系统配置git相关文章,网上有很多,这里只总结我所遇到的问题 配置git相关信息命令: vim ~/.gitconfig 然后就可以配置相关信息,git配置文件详解请参考以下网址: https://b ...

  2. .Net 基于Memcache集群的分布式Session

    简述 基于Memcache的Session大家都各有各的说法,比方说:当memcached集群发生故障(比如内存溢出)或者维护(比如升级.增加或减少服务器)时,用户会无法登录,或者被踢掉线等等,每种技 ...

  3. abp(net core)+easyui+efcore实现仓储管理系统——菜单 (十六)

    系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二) ...

  4. Mac迅雷瘦身精简教程

    迅雷是个大家很熟悉的工具了,尽管吐槽的人不少,但相信大家也都是口嫌体直,边骂边用. 其实 macOS 版迅雷在界面上,相比于 Windows 的客户端来说,已经很克制了,但有些功能仍然对用户造成了干扰 ...

  5. codeblocks无法调试的相关解决思路

    代码无法调试!? 难受... 现在给你提供两种常见的导致codeblocks无法调试的原因以及相应的解决方案. 原因一: 在创建工程目录时,保存路径中有中文. 重要的事情说三遍: 切记,工程目录的保存 ...

  6. NLP(十) 主题识别

    主题识别 是发现输入文本集合中存在的主题的过程 LDA算法,即狄利克雷分布算法 from nltk.tokenize import RegexpTokenizer from nltk.corpus i ...

  7. 2019nc#5

    题号 标题 已通过代码 题解/讨论 通过率 团队的状态 A digits 2 点击查看 1017/2384  通过 B generator 1 点击查看 567/3692  通过 C generato ...

  8. 牛客练习赛38 E 出题人的数组 2018ccpc桂林A题 贪心

    https://ac.nowcoder.com/acm/contest/358/E 题意: 出题人有两个数组,A,B,请你把两个数组归并起来使得cost=∑i∗ci 最小,归并要求原数组的数的顺序在新 ...

  9. Dungeon Master POJ - 2251 [kuangbin带你飞]专题一 简单搜索

    You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of un ...

  10. GNU大型项目构建和覆盖率生成(第一篇)

    目录 0. 序言 1. 项目描述 2. 项目构建 2.1 编译规则 2.2 构建过程 3. 覆盖率分析 0. 序言 在开始正文之前,请允许我先说明一下本文的目的和写作的动机,好让读者不惑. 我们知道, ...