在Javaweb项目中用MVC模式进行后端管理员RSA加密登录的具体代码实现,要求使用MySQL数据库,利用layUI框架和ajax接口请求
时间: 2023-05-31 08:02:56 浏览: 85
1. 在MySQL数据库中创建管理员表,包含id、用户名、密码等字段。
2. 在后端Java代码中创建管理员实体类,对应管理员表。
3. 创建管理员DAO类,实现对管理员表的增删改查操作。
4. 创建Controller类,处理管理员登录请求,调用DAO类进行验证,如果验证通过,则生成RSA公钥和私钥,将公钥返回给前端。
5. 在前端layUI页面中,使用ajax请求获取后端返回的RSA公钥,并将管理员密码使用RSA公钥进行加密。
6. 将加密后的密码通过ajax请求发送给后端进行验证,验证成功后跳转到管理员首页。
具体代码实现:
1. 创建管理员表
CREATE TABLE admin (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(50) NOT NULL,
password varchar(50) NOT NULL,
PRIMARY KEY (id)
);
2. 创建管理员实体类
public class Admin {
private int id;
private String username;
private String password;
// getter and setter methods
}
3. 创建管理员DAO类
public class AdminDAO {
// 数据库连接对象
private Connection conn;
// 构造方法,获取数据库连接
public AdminDAO() {
conn = DBUtil.getConnection();
}
// 验证管理员用户名和密码
public boolean validate(String username, String password) {
boolean result = false;
try {
String sql = "SELECT * FROM admin WHERE username=? AND password=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
result = true;
}
rs.close();
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
}
4. 创建Controller类
public class AdminController {
// 验证管理员用户名和密码
@RequestMapping(value="/admin/login", method=RequestMethod.POST)
@ResponseBody
public Map<String, Object> login(HttpServletRequest request, HttpServletResponse response) {
Map<String, Object> resultMap = new HashMap<String, Object>();
String username = request.getParameter("username");
String password = request.getParameter("password");
AdminDAO adminDAO = new AdminDAO();
boolean validateResult = adminDAO.validate(username, password);
if (validateResult) {
try {
// 生成RSA公钥和私钥
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(1024);
KeyPair keyPair = keyPairGen.generateKeyPair();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
// 将公钥返回给前端
resultMap.put("publicKey", publicKey.getModulus().toString(16));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
} else {
resultMap.put("msg", "用户名或密码错误!");
}
return resultMap;
}
}
5. 前端layUI页面中的ajax请求代码
// 获取RSA公钥
$.ajax({
type: "POST",
url: "/admin/login",
dataType: "json",
success: function(data){
var modulus = data.publicKey;
var exponent = "10001";
var key = RSAUtils.getKeyPair(exponent, '', modulus);
var password = RSAUtils.encryptedString(key, $('#password').val());
// 发送加密后的密码
$.ajax({
type: "POST",
url: "/admin/login",
data: {"username": $('#username').val(), "password": password},
dataType: "json",
success: function(data){
if (data.msg) {
layer.msg(data.msg);
} else {
window.location.href = "/admin/index";
}
}
});
}
});
6. 后端Controller类中的验证密码方法
// 验证管理员用户名和密码
@RequestMapping(value="/admin/login", method=RequestMethod.POST)
@ResponseBody
public Map<String, Object> login(HttpServletRequest request, HttpServletResponse response) {
Map<String, Object> resultMap = new HashMap<String, Object>();
String username = request.getParameter("username");
String password = request.getParameter("password");
// 解密密码
String privateKeyStr = request.getSession().getAttribute("privateKey").toString();
RSAPrivateKey privateKey = RSAUtils.getPrivateKey(privateKeyStr);
String decryptedPassword = RSAUtils.decryptedString(privateKey, password);
AdminDAO adminDAO = new AdminDAO();
boolean validateResult = adminDAO.validate(username, decryptedPassword);
if (validateResult) {
// 登录成功,跳转到管理员首页
resultMap.put("result", "success");
} else {
resultMap.put("msg", "用户名或密码错误!");
}
return resultMap;
}
阅读全文