<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<resource-ref>
<res-ref-name>jdbc/Camera_G</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
</resource-ref>
</web-app><?xml version="1.0" encoding="utf-8"?>
<Context>
<Resource
name="jdbc/Camera_G"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/Camera_G?useSSL=false&serverTimezone=Asia/Shanghai"
username="root"
password="12345"
maxTotal="100"
maxIdle="20"
minIdle="5"
maxWaitMillis="10000"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
/>
</Context>package camerag;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameClassPair;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
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 javax.sql.DataSource;
import org.json.JSONObject;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private DataSource dataSource;
@Override
public void init() throws ServletException {
try {
// 1. 标准写法:获取初始化上下文(无需额外配置)
Context initCtx = new InitialContext();
// 2. 查找环境上下文:用标准路径 java:comp/env(而非 java:/comp/env,避免部分环境兼容性问题)
Context envCtx = (Context) initCtx.lookup("java:comp/env");
// 3. 查找数据源:名称与配置完全一致(jdbc/Camera_G)
dataSource = (DataSource) envCtx.lookup("jdbc/Camera_G");
// 4. 诊断:打印已绑定的资源,确认 jdbc/Camera_G 存在
System.out.println("=== JNDI 诊断 ===");
NamingEnumeration<NameClassPair> list = envCtx.list(""); // 列出 java:comp/env 下的所有资源
while (list.hasMore()) {
NameClassPair pair = list.next();
System.out.println("已绑定资源: " + pair.getName()); // 应输出 "jdbc/Camera_G"
}
// 5. 测试连接:确认数据源可用
try (Connection conn = dataSource.getConnection()) {
System.out.println("数据库连接成功!当前数据库:" + conn.getSchema()); // 应输出 "Camera_G"
}
} catch (NamingException e) {
System.err.println("JNDI 查找失败:" + e.getMessage());
throw new ServletException("数据源初始化失败", e);
} catch (SQLException e) {
System.err.println("数据库连接测试失败:" + e.getMessage());
throw new ServletException("数据源连接失败", e);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
JSONObject jsonResponse = new JSONObject();
PrintWriter out = response.getWriter();
// 从请求中读取JSON数据
StringBuilder sb = new StringBuilder();
String line;
while ((line = request.getReader().readLine()) != null) {
sb.append(line);
}
try {
JSONObject loginData = new JSONObject(sb.toString());
String username = loginData.getString("username");
String password = loginData.getString("password");
boolean rememberMe = loginData.optBoolean("rememberMe", false);
// 验证用户登录信息
User user = authenticateUser(username, password);
if (user != null) {
// 创建会话
HttpSession session = request.getSession();
session.setAttribute("user", user);
session.setAttribute("userId", user.getId());
session.setAttribute("username", user.getUsername());
// 设置会话超时时间(如果选择了"记住我")
if (rememberMe) {
session.setMaxInactiveInterval(7 * 24 * 60 * 60); // 7天
} else {
session.setMaxInactiveInterval(30 * 60); // 30分钟
}
jsonResponse.put("success", true);
jsonResponse.put("message", "登录成功");
// 返回用户信息给前端
JSONObject userObj = new JSONObject();
userObj.put("id", user.getId());
userObj.put("username", user.getUsername());
userObj.put("email", user.getEmail());
userObj.put("fullName", user.getFullName());
userObj.put("phone", user.getPhone());
jsonResponse.put("user", userObj);
} else {
jsonResponse.put("success", false);
jsonResponse.put("message", "用户名或密码错误");
}
} catch (Exception e) {
e.printStackTrace();
jsonResponse.put("success", false);
jsonResponse.put("message", "服务器错误,请稍后重试");
}
out.print(jsonResponse.toString());
out.flush();
}
private User authenticateUser(String username, String password) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection();
String sql = "SELECT id, username, password, email, full_name, phone, id_card, address " +
"FROM users WHERE (username = ? OR email = ?) AND password = ?";
stmt = conn.prepareStatement(sql);
stmt.setString(1, username);
stmt.setString(2, username);
stmt.setString(3, password); // 注意:实际应用中应对密码进行哈希比较
rs = stmt.executeQuery();
if (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setEmail(rs.getString("email"));
user.setFullName(rs.getString("full_name"));
user.setPhone(rs.getString("phone"));
user.setIdCard(rs.getString("id_card"));
user.setAddress(rs.getString("address"));
return user;
}
return null;
} catch (SQLException e) {
e.printStackTrace();
return null;
} finally {
closeResources(conn, stmt, rs);
}
}
private void closeResources(Connection conn, PreparedStatement stmt, ResultSet rs) {
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 用户实体类
public class User {
private int id;
private String username;
private String email;
private String fullName;
private String phone;
private String idCard;
private String address;
// Getter和Setter方法
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
public String getFullName() { return fullName; }
public void setFullName(String fullName) { this.fullName = fullName; }
public String getPhone() { return phone; }
public void setPhone(String phone) { this.phone = phone; }
public String getIdCard() { return idCard; }
public void setIdCard(String idCard) { this.idCard = idCard; }
public String getAddress() { return address; }
public void setAddress(String address) { this.address = address; }
}
}package camerag;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
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.sql.DataSource;
// 导入JSON库
import org.json.JSONObject;
@WebServlet("/RegisterServlet")
public class RegisterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private DataSource dataSource;
public void init() throws ServletException {
try {
// 初始化数据源
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
dataSource = (DataSource) envContext.lookup("jdbc/Camera_G");
System.out.println("数据源初始化成功");
} catch (NamingException e) {
System.err.println("数据源初始化失败: " + e.getMessage());
e.printStackTrace();
throw new ServletException("Unable to retrieve DataSource", e);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
JSONObject jsonResponse = new JSONObject();
PrintWriter out = response.getWriter();
try {
// 从请求中读取JSON数据
StringBuilder sb = new StringBuilder();
String line;
while ((line = request.getReader().readLine()) != null) {
sb.append(line);
}
System.out.println("接收到注册请求: " + sb.toString());
JSONObject userData = new JSONObject(sb.toString());
String username = userData.getString("username");
String password = userData.getString("password");
String email = userData.getString("email");
String fullName = userData.optString("fullName", "");
String phone = userData.optString("phone", "");
String idCard = userData.optString("idCard", "");
String address = userData.optString("address", "");
// 检查用户名是否已存在
if (isUsernameExists(username)) {
jsonResponse.put("success", false);
jsonResponse.put("message", "用户名已存在,请选择其他用户名。");
out.print(jsonResponse.toString());
return;
}
// 检查邮箱是否已存在
if (isEmailExists(email)) {
jsonResponse.put("success", false);
jsonResponse.put("message", "邮箱地址已被注册,请使用其他邮箱。");
out.print(jsonResponse.toString());
return;
}
// 插入新用户到数据库
if (registerUser(username, password, email, fullName, phone, idCard, address)) {
jsonResponse.put("success", true);
jsonResponse.put("message", "注册成功!");
} else {
jsonResponse.put("success", false);
jsonResponse.put("message", "注册失败,请稍后重试。");
}
} catch (Exception e) {
System.err.println("注册过程中发生错误: " + e.getMessage());
e.printStackTrace();
jsonResponse.put("success", false);
jsonResponse.put("message", "服务器错误,请稍后重试。");
}
out.print(jsonResponse.toString());
out.flush();
}
/**
* 检查用户名是否已存在
*/
private boolean isUsernameExists(String username) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection();
String sql = "SELECT id FROM users WHERE username = ?";
stmt = conn.prepareStatement(sql);
stmt.setString(1, username);
rs = stmt.executeQuery();
return rs.next();
} catch (SQLException e) {
System.err.println("检查用户名是否存在时出错: " + e.getMessage());
e.printStackTrace();
return true; // 如果出现异常,假设用户名已存在以防止重复注册
} finally {
closeResources(conn, stmt, rs);
}
}
/**
* 检查邮箱是否已存在
*/
private boolean isEmailExists(String email) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection();
String sql = "SELECT id FROM users WHERE email = ?";
stmt = conn.prepareStatement(sql);
stmt.setString(1, email);
rs = stmt.executeQuery();
return rs.next();
} catch (SQLException e) {
System.err.println("检查邮箱是否存在时出错: " + e.getMessage());
e.printStackTrace();
return true; // 如果出现异常,假设邮箱已存在以防止重复注册
} finally {
closeResources(conn, stmt, rs);
}
}
/**
* 注册新用户
*/
private boolean registerUser(String username, String password, String email,
String fullName, String phone, String idCard, String address) {
Connection conn = null;
PreparedStatement stmt = null;
try {
conn = dataSource.getConnection();
String sql = "INSERT INTO users (username, password, email, full_name, phone, id_card, address) " +
"VALUES (?, ?, ?, ?, ?, ?, ?)";
stmt = conn.prepareStatement(sql);
stmt.setString(1, username);
stmt.setString(2, password); // 注意:实际应用中应对密码进行哈希处理
stmt.setString(3, email);
stmt.setString(4, fullName);
stmt.setString(5, phone);
stmt.setString(6, idCard);
stmt.setString(7, address);
int rowsAffected = stmt.executeUpdate();
return rowsAffected > 0;
} catch (SQLException e) {
System.err.println("注册用户时出错: " + e.getMessage());
e.printStackTrace();
return false;
} finally {
closeResources(conn, stmt, null);
}
}
/**
* 关闭数据库资源
*/
private void closeResources(Connection conn, PreparedStatement stmt, ResultSet rs) {
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
System.err.println("关闭数据库资源时出错: " + e.getMessage());
e.printStackTrace();
}
}
}我的lib文件夹里面有/camerag/src/main/webapp/WEB-INF/lib/mysql-connector-java-8.0.25.jar这个文件
最新发布