在Javaweb项目中用MVC模式进行后端管理员RSA加密登录前后端具体代码实现,要求使用MySQL数据库,利用layUI框架和ajax接口请求

时间: 2023-05-27 19:05:52 浏览: 44
1. 定义数据库表 在MySQL数据库中创建一个名为admin的表,包含以下字段: - id:管理员ID,主键,自增长 - username:管理员用户名,唯一 - password:管理员密码,存储加密后的密码 2. 后端代码实现 在Java项目中创建一个名为AdminController的控制器类,实现管理员登录功能。 2.1 加载页面 ``` @RequestMapping("/admin/login") public String toLogin() { return "admin/login"; } ``` 这段代码使用@RequestMapping注解映射/admin/login路径,返回admin/login视图,该视图用于显示管理员登录页面。 2.2 接收登录请求 ``` @PostMapping("/admin/doLogin") @ResponseBody public Map<String, Object> doLogin(String username, String password) { Map<String, Object> map = new HashMap<>(); Admin admin = adminService.getAdminByUsername(username); if (admin == null) { map.put("code", 1); map.put("msg", "用户名不存在"); } else { String decryptPwd = RSAUtils.decrypt(password, Constants.PRIVATE_KEY); if (decryptPwd.equals(admin.getPassword())) { map.put("code", 0); map.put("msg", "登录成功"); } else { map.put("code", 1); map.put("msg", "密码错误"); } } return map; } ``` 这段代码使用@PostMapping注解映射/admin/doLogin路径,接收前端传来的用户名和密码,并调用adminService的getAdminByUsername方法查询数据库中的管理员信息。 如果查询结果为空,说明用户名不存在,返回code为1,msg为“用户名不存在”。 如果查询结果不为空,说明用户名存在,将前端传来的加密后的密码解密并与数据库中存储的密码进行比对。 如果密码匹配,返回code为0,msg为“登录成功”。 如果密码不匹配,返回code为1,msg为“密码错误”。 2.3 加密密码 ``` Admin admin = new Admin(); admin.setUsername(username); String encryptPwd = RSAUtils.encrypt(password, Constants.PUBLIC_KEY); admin.setPassword(encryptPwd); adminService.addAdmin(admin); ``` 这段代码创建一个Admin对象,设置用户名和加密后的密码,并调用adminService的addAdmin方法将管理员信息添加到数据库。 3. 前端代码实现 使用LayUI框架和Ajax接口请求实现前端登录页面。 3.1 引入LayUI框架 在html代码中引入LayUI框架的CSS和JS文件: ``` <link rel="stylesheet" href="https://cdn.staticfile.org/layui/2.5.6/css/layui.min.css"> <script src="https://cdn.staticfile.org/layui/2.5.6/layui.min.js"></script> ``` 3.2 显示登录页面 在html代码中添加一个form表单,用于提交用户名和密码,并使用LayUI的form组件渲染表单: ``` <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> <button type="reset" class="layui-btn layui-btn-primary">重置</button> </div> </div> </form> ``` 3.3 发送登录请求 在html代码中添加一个script标签,使用Ajax发送登录请求,并根据后端返回的结果进行相应的处理: ``` <script> //监听提交 layui.form.on('submit(login)', function(data){ $.ajax({ url: '/admin/doLogin', type: 'post', dataType: 'json', data: data.field, success: function (res) { if (res.code === 0) { layer.msg(res.msg, {icon: 1, time: 2000}, function () { window.location.href = '/admin/index'; }); } else { layer.msg(res.msg, {icon: 2, time: 2000}); } }, error: function () { layer.msg('请求失败', {icon: 2, time: 2000}); } }); return false; }); </script> ``` 这段代码使用LayUI的form.on方法监听表单提交事件,使用Ajax发送登录请求,并根据后端返回的结果进行相应的处理。 如果code为0,说明登录成功,弹出提示框并跳转到管理员首页。 如果code为1,说明登录失败,弹出提示框显示错误信息。 如果请求失败,弹出提示框显示请求失败信息。

相关推荐

由于问题描述的过于简略,本回答只提供一种可行的解决方案,具体实现细节需要根据实际情况进行调整。 1. 前端页面 使用LayUI框架实现一个简单的登录页面,包括用户名、密码和登录按钮。点击登录按钮时,调用后端接口进行登录。 html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>管理员登录</title> </head> <body> <form class="layui-form" lay-filter="login-form"> <label class="layui-form-label">用户名</label> <input type="text" name="username" required lay-verify="required" placeholder="请输入用户名" autocomplete="off" class="layui-input"> <label class="layui-form-label">密码</label> <input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input"> <button class="layui-btn" lay-submit lay-filter="login">登录</button> </form> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/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({ type: 'POST', url: '/login', data: data.field, success: function(res){ if(res.code === 0){ layer.msg('登录成功'); window.location.href = '/dashboard'; //跳转到管理页面 }else{ layer.msg('登录失败:' + res.msg); } }, error: function(){ layer.msg('网络错误,请稍后重试'); } }); return false; }); }); </script> </body> </html> 2. 后端代码 使用Spring MVC实现后端接口,包括登录接口和RSA加密算法。 java @RestController public class LoginController { @Autowired private UserService userService; //登录接口 @PostMapping("/login") public Result login(@RequestBody User user, HttpServletRequest request){ //根据用户名查询用户信息 User dbUser = userService.getUserByUsername(user.getUsername()); if(dbUser == null){ return Result.error("用户名不存在"); } //检查密码是否正确 if(!dbUser.getPassword().equals(user.getPassword())){ return Result.error("密码错误"); } //生成JWT token并返回给客户端 String token = JWTUtil.sign(dbUser.getUsername(), dbUser.getPassword()); request.getSession().setAttribute("token", token); return Result.success(); } //RSA加密算法 @RequestMapping("/rsa") public Map<String, String> rsa() throws Exception{ KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(512); KeyPair keyPair = keyPairGenerator.generateKeyPair(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); Map<String, String> map = new HashMap<>(); map.put("publicKey", Base64.getEncoder().encodeToString(publicKey.getEncoded())); map.put("privateKey", Base64.getEncoder().encodeToString(privateKey.getEncoded())); return map; } } 其中,UserService是一个封装了对数据库的操作的服务类,具体实现可以根据实际情况进行编写。JWTUtil是一个用于生成和验证JWT token的工具类,也需要根据实际情况进行编写。 3. 前后端交互 前端页面在加载时,需要调用后端接口获取RSA公钥,并将密码使用该公钥进行加密后再提交给后端。后端接收到加密后的密码后,使用RSA私钥进行解密,并与数据库中的密码进行比较。 javascript layui.use(['form', 'layer'], function(){ var form = layui.form; var layer = layui.layer; //获取RSA公钥 $.get('/rsa', function(res){ var publicKey = res.publicKey; var encrypt = new JSEncrypt(); encrypt.setPublicKey(publicKey); $('body').data('publicKey', encrypt); //将公钥保存到全局变量中 }); //监听登录按钮 form.on('submit(login)', function(data){ var publicKey = $('body').data('publicKey'); data.field.password = publicKey.encrypt(data.field.password); //使用公钥加密密码 $.ajax({ type: 'POST', url: '/login', data: data.field, success: function(res){ if(res.code === 0){ layer.msg('登录成功'); window.location.href = '/dashboard'; //跳转到管理页面 }else{ layer.msg('登录失败:' + res.msg); } }, error: function(){ layer.msg('网络错误,请稍后重试'); } }); return false; }); }); 4. 数据库设计 最后,需要根据实际需求设计数据库。可以创建一个名为user的表,包括id、username、password等字段。其中,id为主键,username和password分别用于存储用户名和密码。具体实现可以参考以下代码: sql CREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL, password varchar(50) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
以下是一个简单的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> </head> <body> <form class="layui-form" action=""> <label class="layui-form-label">用户名</label> <input type="text" name="username" required lay-verify="required" placeholder="请输入用户名" autocomplete="off" class="layui-input"> <label class="layui-form-label">密码</label> <input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input"> <button class="layui-btn" lay-submit lay-filter="login">登录</button> </form> <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公私钥对应该定时更新,这里没有实现定时更新的代码。
以下是一个简单的基于MVC模式和MySQL数据库的后端管理员RSA加密登录的代码实现,使用了JSP和Servlet来处理请求和响应,同时利用了Ajax接口请求来实现异步验证登录信息。 1. 创建一个名为“admin”的MySQL数据库,其中包含一个名为“users”的表格,用于存储管理员的用户名和RSA加密后的密码。 CREATE DATABASE admin; USE admin; CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(50) NOT NULL, password VARCHAR(255) NOT NULL, PRIMARY KEY (id) ); 2. 在Java中实现RSA加密算法。 这里使用了Java内置的RSA算法库,通过生成公钥和私钥来实现加密和解密操作。 import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import javax.crypto.Cipher; public class RSAEncryption { private static final String ALGORITHM = "RSA"; private static final int KEY_SIZE = 2048; private static PrivateKey privateKey; private static PublicKey publicKey; static { try { KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM); keyGen.initialize(KEY_SIZE); KeyPair keyPair = keyGen.generateKeyPair(); privateKey = keyPair.getPrivate(); publicKey = keyPair.getPublic(); } catch (Exception e) { e.printStackTrace(); } } public static byte[] encrypt(String input) { try { Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, publicKey); return cipher.doFinal(input.getBytes()); } catch (Exception e) { e.printStackTrace(); return null; } } public static String decrypt(byte[] input) { try { Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, privateKey); return new String(cipher.doFinal(input)); } catch (Exception e) { e.printStackTrace(); return null; } } } 3. 在Java中实现数据库操作类。 这里使用了JDBC连接MySQL数据库,并提供了一个方法用于查询指定用户名的RSA加密后的密码。 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class UserDAO { private static final String URL = "jdbc:mysql://localhost:3306/admin"; private static final String USERNAME = "root"; private static final String PASSWORD = "root"; public static String getPassword(String username) { try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); PreparedStatement ps = conn.prepareStatement("SELECT password FROM users WHERE username = ?"); ps.setString(1, username); ResultSet rs = ps.executeQuery(); if (rs.next()) { return rs.getString("password"); } else { return null; } } catch (Exception e) { e.printStackTrace(); return null; } } } 4. 在Java中实现Servlet类,用于处理登录请求。 这里使用了Ajax接口请求来实现异步验证登录信息,如果用户名和密码都正确,则返回一个“success”字符串,否则返回一个“fail”字符串。 import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); String encryptedPassword = UserDAO.getPassword(username); if (encryptedPassword != null && encryptedPassword.equals(RSAEncryption.encrypt(password))) { response.getWriter().write("success"); } else { response.getWriter().write("fail"); } } } 5. 在JSP中实现登录页面。 这里使用了jQuery库来实现Ajax接口请求,并将输入的密码通过RSA加密后再发送给服务器端进行验证。 <!DOCTYPE html> <html> <head> <title>管理员登录</title> <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script> <script> function login() { var username = $("#username").val(); var password = $("#password").val(); var encryptedPassword = btoa(String.fromCharCode.apply(null, RSAEncryption.encrypt(password))); $.ajax({ type: "POST", url: "LoginServlet", data: { username: username, password: encryptedPassword }, success: function(result) { if (result === "success") { window.location.href = "dashboard.jsp"; } else { alert("用户名或密码错误!"); } } }); } </script> </head> <body> 管理员登录 <form> <label>用户名:</label> <input type="text" id="username" name="username">
<label>密码:</label> <input type="password" id="password" name="password">
<button type="button" onclick="login()">登录</button> </form> </body> </html> 以上就是一个简单的基于MVC模式和MySQL数据库的后端管理员RSA加密登录的代码实现,使用了JSP和Servlet来处理请求和响应,同时利用了Ajax接口请求来实现异步验证登录信息。

最新推荐

数据翻译再造轮子:支持枚举翻译、字典翻译、外键翻译、级联翻译、方法翻译

数据翻译再造轮子:支持枚举翻译、字典翻译、外键翻译、级联翻译、方法翻译

天池比赛:津南数字制造算法挑战赛【赛场一】初赛 17 名 Drop 队代码.zip

比赛项目源码

基于Asp+web的旅游网站系统源码.zip

基于Asp+web的旅游网站系统源码.zip

基于Asp的网络招聘系统源码.zip

基于Asp的网络招聘系统源码.zip

高低温试验箱的日常维护.zip

高低温试验箱的日常维护.zip

代码随想录最新第三版-最强八股文

这份PDF就是最强⼋股⽂! 1. C++ C++基础、C++ STL、C++泛型编程、C++11新特性、《Effective STL》 2. Java Java基础、Java内存模型、Java面向对象、Java集合体系、接口、Lambda表达式、类加载机制、内部类、代理类、Java并发、JVM、Java后端编译、Spring 3. Go defer底层原理、goroutine、select实现机制 4. 算法学习 数组、链表、回溯算法、贪心算法、动态规划、二叉树、排序算法、数据结构 5. 计算机基础 操作系统、数据库、计算机网络、设计模式、Linux、计算机系统 6. 前端学习 浏览器、JavaScript、CSS、HTML、React、VUE 7. 面经分享 字节、美团Java面、百度、京东、暑期实习...... 8. 编程常识 9. 问答精华 10.总结与经验分享 ......

基于交叉模态对应的可见-红外人脸识别及其表现评估

12046通过调整学习:基于交叉模态对应的可见-红外人脸识别Hyunjong Park*Sanghoon Lee*Junghyup Lee Bumsub Ham†延世大学电气与电子工程学院https://cvlab.yonsei.ac.kr/projects/LbA摘要我们解决的问题,可见光红外人重新识别(VI-reID),即,检索一组人的图像,由可见光或红外摄像机,在交叉模态设置。VI-reID中的两个主要挑战是跨人图像的类内变化,以及可见光和红外图像之间的跨模态假设人图像被粗略地对准,先前的方法尝试学习在不同模态上是有区别的和可概括的粗略的图像或刚性的部分级人表示然而,通常由现成的对象检测器裁剪的人物图像不一定是良好对准的,这分散了辨别性人物表示学习。在本文中,我们介绍了一种新的特征学习框架,以统一的方式解决这些问题。为此,我们建议利用密集的对应关系之间的跨模态的人的形象,年龄。这允许解决像素级中�

javascript 中字符串 变量

在 JavaScript 中,字符串变量可以通过以下方式进行定义和赋值: ```javascript // 使用单引号定义字符串变量 var str1 = 'Hello, world!'; // 使用双引号定义字符串变量 var str2 = "Hello, world!"; // 可以使用反斜杠转义特殊字符 var str3 = "It's a \"nice\" day."; // 可以使用模板字符串,使用反引号定义 var str4 = `Hello, ${name}!`; // 可以使用 String() 函数进行类型转换 var str5 = String(123); //

数据结构1800试题.pdf

你还在苦苦寻找数据结构的题目吗?这里刚刚上传了一份数据结构共1800道试题,轻松解决期末挂科的难题。不信?你下载看看,这里是纯题目,你下载了再来私信我答案。按数据结构教材分章节,每一章节都有选择题、或有判断题、填空题、算法设计题及应用题,题型丰富多样,共五种类型题目。本学期已过去一半,相信你数据结构叶已经学得差不多了,是时候拿题来练练手了,如果你考研,更需要这份1800道题来巩固自己的基础及攻克重点难点。现在下载,不早不晚,越往后拖,越到后面,你身边的人就越卷,甚至卷得达到你无法想象的程度。我也是曾经遇到过这样的人,学习,练题,就要趁现在,不然到时你都不知道要刷数据结构题好还是高数、工数、大英,或是算法题?学完理论要及时巩固知识内容才是王道!记住!!!下载了来要答案(v:zywcv1220)。

通用跨域检索的泛化能力

12056通用跨域检索:跨类和跨域的泛化2* Soka Soka酒店,Soka-马上预订;1印度理工学院,Kharagpur,2印度科学学院,班加罗尔soumava2016@gmail.com,{titird,somabiswas} @ iisc.ac.in摘要在这项工作中,我们第一次解决了通用跨域检索的问题,其中测试数据可以属于在训练过程中看不到的类或域。由于动态增加的类别数量和对每个可能的域的训练的实际约束,这需要大量的数据,所以对看不见的类别和域的泛化是重要的。为了实现这一目标,我们提出了SnMpNet(语义Neighbourhood和混合预测网络),它包括两个新的损失,以占在测试过程中遇到的看不见的类和域。具体来说,我们引入了一种新的语义邻域损失,以弥合可见和不可见类之间的知识差距,并确保潜在的空间嵌入的不可见类是语义上有意义的,相对于其相邻的类。我们还在图像级以及数据的语义级引入了基于混�