使用servlet+jdbc+MD5实现用户加密登录
/**
* 分析流程:
* 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实现用户加密登录的更多相关文章
- [项目分享]JSP+Servlet+JDBC实现的学生信息管理系统
本文存在视频版本,请知悉 项目简介 项目来源于:https://gitee.com/liu_xu111/JavaWeb01 这次分享一个学生管理系统,我感觉这是程序员在大学时期的毕设和课程设计选择最多 ...
- Maven+JSP+Servlet+JDBC+Mysql实现的dbExper宾馆管理系统
本文存在视频版本,请知悉 项目简介 项目来源于:https://github.com/mafulong/databaseExper-hotelMaster 这次分享的也是毕设或课程设计选择一样很多的宾 ...
- JSP+Servlet+JDBC+Mysql实现的天才会议管理系统
本文存在视频版本,请知悉 项目简介 项目来源于:https://github.com/hegexunmeng/meeting-system 这次分享一个会议管理系统,前端后端几乎没有使用任何框架,适合 ...
- JSP+Servlet+JDBC+C3P0实现的人力资源管理系统
项目简介 项目来源于:https://github.com/ruou/hr 本系统基于JSP+Servlet+C3P0+Mysql.涉及技术少,易于理解,适合JavaWeb初学者学习使用. 难度等级: ...
- JSP+Servlet+JDBC+mysql实现的个人日记本系统
项目简介 项目来源于:https://gitee.com/wishwzp/Diary 本系统基于JSP+Servlet+Mysql 一个基于JSP+Servlet+Jdbc的个人日记本系统.涉及技术少 ...
- JSP+Servlet+JDBC+mysql实现的学生成绩管理系统
项目简介 项目来源于:https://gitee.com/zzdoreen/SSMS 本系统基于JSP+Servlet+Mysql 一个基于JSP+Servlet+Jdbc的学生成绩管理系统.涉及技术 ...
- Struts+Servlet+JDBC网上手机销售系统
项目描述 Hi,大家好,今天给大家分享一个<网上手机销售系统>.本系统一共分为前台和后台两大模块,两个模块之间虽然在表面上是相互独立的,但是在对数据库的访问上是紧密相连的,各个模块访问的是 ...
- com.microsoft.sqlserver.jdbc.SQLServerException: 用户 'sa' 登录失败。
com.microsoft.sqlserver.jdbc.SQLServerException: 用户 'sa' 登录失败. at com.microsoft.sqlserver.jdbc.SQLSe ...
- 【J2EE】Java连接SQL Server 2000问题:“com.microsoft.sqlserver.jdbc.SQLServerException:用户'sa'登录失败。该用户与可信SQL Server连接无关联”
1.问题现象 E:\JSP\HibernateDemo\HibernateDemoProject\src\sine>java ConnectSQLServerConnect failed!com ...
随机推荐
- vue路由菜单权限设置就button权限设置
路由权限的设计思路: 首先,我们的需要校验权限的路由的 url,全部由后端返回,后端会返回当前用户的路由树数组.前端在进入页面前请求接口,把数据拿到: 其次,前端会维护一个路由映射组件的列表,如果路由 ...
- Navicat for mysql建立连接
1. 安装Navicat for MySQL. 2. 点击连接->MySQL,打开SSH,填写主机名.端口.用户名.密码. 3. 连接->打开常规,设置连接名(可以自由指定).主机名.端口 ...
- 利用python定位网页上的元素
1. 想对网页上的元素进行操作,首先需要定位到元素. 以百度首页为例: 输入以下代码,打开百度首页: # coding = gbk from selenium import webdriver chr ...
- 【赛后总结+部分题解】2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛
赛后总结: T:今天状态一般,甚至有点疲惫.然后12点比赛开始,和队友开始看题,从最后往前面看,发现数学题公式看不懂.然后发现队友已经双开做1001和1006了,我看着1007有人A,开始做1007. ...
- Gym 100956 A Random Points on the Circle
二分答案. 对于每次二分后的答案来说, 先倍增序列,通过 two point 来找到 以每个点为起点的最优的符合答案的在哪里. 然后可以DFS树去判断他的前k祖先之间的距离是不是大于k. 常数有点大. ...
- “玲珑杯”ACM比赛 Round #18 1147 - 最后你还是AK了(思维,边的贡献)
题目链接:http://www.ifrog.cc/acm/problem/1147 题解:这题很容易想到的是边的贡献也就是每条边最多被取到几次,和点的贡献类似,那些加边只要加在边贡献大的边上就行.然后 ...
- codeforces E. Phone Talks(dp)
题目链接:http://codeforces.com/contest/158/problem/E 题意:给出一些电话,有打进来的时间和持续的时间,如果人在打电话,那么新打进来的电话入队,如果人没有打电 ...
- There is No Alternative CSU - 2097 最小生成树
Description ICPC (Isles of Coral Park City) consist of several beautiful islands. The citizens reque ...
- hdu Sumsets
Farmer John commanded his cows to search for different sets of numbers that sum to a given number. T ...
- Java中时间API使用详解
目录 Java中时间API使用详解 1. 时区概念 2. 几种常见的时间 3. 时间戳 4. Java中的时间API 5. Java8中新添加的时间API 6. 在东八区的机器上获得美国时间 Java ...