在Javaweb项目中用MVC模式进行后端管理员RSA加密登录的具体代码实现,要求使用MySQL数据库,利用layUI框架和ajax接口请求
时间: 2023-05-27 07:06:27 浏览: 124
java版web登录用RSA加密
5星 · 资源好评率100%
以下是一个简单的JavaWeb项目的MVC模式进行后端管理员RSA加密登录的具体代码实现。这个示例使用MySQL数据库,利用layUI框架和ajax接口请求。
1. Model
创建一个JavaBean类,用于存储管理员信息。
```
public class Admin {
private int id;
private String username;
private String password;
private String publicKey;
private String privateKey;
// 省略getter和setter方法
}
```
2. Controller
创建一个Servlet类,用于处理管理员登录请求。
```
public class AdminLoginController extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
// 从数据库中获取管理员信息
AdminDao adminDao = new AdminDao();
Admin admin = adminDao.getAdminByUsername(username);
// 如果没有找到该管理员,返回错误信息
if (admin == null) {
response.getWriter().write("error");
return;
}
// 生成RSA公私钥对
RSA rsa = new RSA();
admin.setPublicKey(rsa.getPublicKeyBase64());
admin.setPrivateKey(rsa.getPrivateKeyBase64());
// 保存公私钥对到数据库
adminDao.updateAdmin(admin);
// 使用RSA加密密码
String encryptedPassword = rsa.encryptBase64(password);
// 比较加密后的密码和数据库中的密码
if (!encryptedPassword.equals(admin.getPassword())) {
response.getWriter().write("error");
return;
}
// 登录成功,保存管理员信息到session中
HttpSession session = request.getSession();
session.setAttribute("admin", admin);
// 返回成功信息
response.getWriter().write("success");
}
}
```
3. View
使用layUI框架创建登录页面。
```
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>管理员登录</title>
<link rel="stylesheet" href="https://cdn.staticfile.org/layui/2.5.6/css/layui.min.css">
</head>
<body>
<div class="layui-container">
<div class="layui-row">
<div class="layui-col-md6 layui-col-md-offset3">
<form class="layui-form" action="">
<div class="layui-form-item">
<label class="layui-form-label">用户名</label>
<div class="layui-input-block">
<input type="text" name="username" required lay-verify="required" placeholder="请输入用户名" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">密码</label>
<div class="layui-input-block">
<input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="login">登录</button>
</div>
</div>
</form>
</div>
</div>
</div>
<script src="https://cdn.staticfile.org/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/layui/2.5.6/layui.min.js"></script>
<script>
layui.use(['form', 'layer'], function(){
var form = layui.form;
var layer = layui.layer;
// 监听登录表单提交
form.on('submit(login)', function(data){
// 发送ajax请求
$.ajax({
url: 'AdminLoginController',
type: 'POST',
data: data.field,
success: function(result) {
// 登录成功,跳转到管理页面
if (result == 'success') {
window.location.href = 'admin.jsp';
} else {
// 登录失败,显示错误信息
layer.msg('用户名或密码错误', {icon: 5});
}
},
error: function() {
layer.msg('登录失败,请重试', {icon: 5});
}
});
return false;
});
});
</script>
</body>
</html>
```
4. DAO
创建一个DAO类,用于与数据库交互。
```
public class AdminDao {
// 数据库连接信息
private String jdbcUrl = "jdbc:mysql://localhost:3306/javaweb";
private String jdbcUsername = "root";
private String jdbcPassword = "root";
// 获取管理员信息
public Admin getAdminByUsername(String username) {
String sql = "SELECT * FROM admin WHERE username = ?";
try (Connection conn = DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword);
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, username);
try (ResultSet rs = stmt.executeQuery()) {
if (rs.next()) {
Admin admin = new Admin();
admin.setId(rs.getInt("id"));
admin.setUsername(rs.getString("username"));
admin.setPassword(rs.getString("password"));
admin.setPublicKey(rs.getString("public_key"));
admin.setPrivateKey(rs.getString("private_key"));
return admin;
}
}
} catch (SQLException ex) {
ex.printStackTrace();
}
return null;
}
// 更新管理员信息
public void updateAdmin(Admin admin) {
String sql = "UPDATE admin SET public_key = ?, private_key = ?, password = ? WHERE id = ?";
try (Connection conn = DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword);
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, admin.getPublicKey());
stmt.setString(2, admin.getPrivateKey());
stmt.setString(3, admin.getPassword());
stmt.setInt(4, admin.getId());
stmt.executeUpdate();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
```
注意:为了保证安全性,RSA公私钥对应该定时更新,这里没有实现定时更新的代码。
阅读全文