小李:老张,最近我们公司要开发一个实习就业管理系统,主要是针对泉州地区的高校和企业。你有什么建议吗?
老张:嗯,这个项目挺有意义的。首先,我建议你们先确定系统的核心功能,比如学生信息管理、岗位发布、简历投递、面试安排等。但最关键的是登录功能,因为这是所有操作的基础。
小李:对,登录确实是最重要的环节。那你是怎么设计登录功能的呢?
老张:我们可以用JavaWeb来实现,使用Servlet和JSP来做后端逻辑和前端页面。同时,数据库方面推荐用MySQL,存储用户信息,比如用户名、密码、角色(学生、企业、管理员)等。
小李:听起来不错。那具体怎么写代码呢?你能给我举个例子吗?
老张:当然可以。首先,我们需要一个登录页面,也就是login.jsp,让用户输入用户名和密码。
小李:好的,那这个页面应该怎么做呢?
老张:这是一个简单的HTML表单,提交到一个Servlet处理登录请求。例如:
<form action="LoginServlet" method="post">
<label>用户名:<input type="text" name="username"></label>
<br>
<label>密码:<input type="password" name="password"></label>
<br>
<input type="submit" value="登录">
</form>
小李:明白了,那后端怎么处理呢?
老张:接下来是LoginServlet类,它接收表单提交的数据,并验证用户是否合法。这里需要连接数据库查询用户是否存在。

小李:那数据库应该怎么设计呢?
老张:我们可以在MySQL中创建一个user表,结构如下:
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL,
role ENUM('student', 'company', 'admin') NOT NULL
);
小李:那登录Servlet怎么实现呢?
老张:下面是一个简单的Servlet示例:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
// 连接数据库
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/employment_system", "root", "123456");
String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
ps = conn.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
rs = ps.executeQuery();
if (rs.next()) {
String role = rs.getString("role");
HttpSession session = request.getSession();
session.setAttribute("user", username);
session.setAttribute("role", role);
if ("student".equals(role)) {
response.sendRedirect("student_home.jsp");
} else if ("company".equals(role)) {
response.sendRedirect("company_home.jsp");
} else if ("admin".equals(role)) {
response.sendRedirect("admin_home.jsp");
}
} else {
request.setAttribute("error", "用户名或密码错误");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("error", "系统错误,请稍后再试");
request.getRequestDispatcher("login.jsp").forward(request, response);
} finally {
try {
if (rs != null) rs.close();
if (ps != null) ps.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
小李:这代码看起来挺完整的,但有没有更安全的做法?比如密码加密?
老张:非常好的问题!直接存储明文密码是不安全的。我们可以使用MD5或者更安全的BCrypt进行加密。
小李:那怎么实现呢?
老张:可以用Java的MessageDigest类生成MD5哈希值。例如:
public static String md5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest(input.getBytes());
BigInteger no = new BigInteger(1, messageDigest);
String hashtext = no.toString(16);
while (hashtext.length() < 32) {
hashtext = "0" + hashtext;
}
return hashtext;
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
小李:明白了,这样密码就不是明文存储了。
老张:没错。此外,还可以加入验证码机制,防止暴力破解。比如在登录页面加上验证码图片,用户必须正确输入才能登录。
小李:那验证码怎么实现呢?
老张:可以用Java生成随机字符串,然后将其绘制为图片。例如,创建一个VerifyCodeServlet,生成验证码并存入Session中。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int width = 100;
int height = 40;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
// 设置背景色
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
// 随机生成验证码
String code = generateRandomCode();
request.getSession().setAttribute("verifyCode", code);
// 绘制文字
g.setColor(Color.BLACK);
g.setFont(new Font("Arial", Font.BOLD, 20));
g.drawString(code, 10, 25);
// 输出图片
ImageIO.write(image, "png", response.getOutputStream());
}
private String generateRandomCode() {
String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
StringBuilder sb = new StringBuilder();
Random random = new Random();
for (int i = 0; i < 4; i++) {
sb.append(chars.charAt(random.nextInt(chars.length())));
}
return sb.toString();
}
小李:这个验证码功能很实用,能有效防止机器人攻击。
老张:对,而且还可以设置验证码的有效时间,比如5分钟内有效,避免用户长时间未登录导致失效。
小李:那登录之后,用户跳转到不同的首页,怎么管理权限呢?
老张:我们可以使用过滤器(Filter)来拦截请求,检查用户是否已登录以及其角色是否具备访问权限。
小李:那过滤器是怎么工作的?
老张:例如,创建一个AuthFilter类,配置在web.xml中,指定哪些URL需要权限验证。
public class AuthFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = req.getSession(false);
String role = session != null ? (String) session.getAttribute("role") : null;
if (role == null) {
res.sendRedirect("login.jsp");
return;
}
String uri = req.getRequestURI();
if (uri.contains("/student")) {
if (!"student".equals(role)) {
res.sendRedirect("login.jsp");
return;
}
} else if (uri.contains("/company")) {
if (!"company".equals(role)) {
res.sendRedirect("login.jsp");
return;
}
} else if (uri.contains("/admin")) {
if (!"admin".equals(role)) {
res.sendRedirect("login.jsp");
return;
}
}
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) {}
public void destroy() {}
}
小李:这个过滤器太棒了,能自动拦截非法访问。
老张:是的,这样系统就更加安全了。另外,我们还可以记录用户的登录日志,方便后续审计。
小李:那日志怎么记录呢?
老张:可以用AOP或者在每次登录成功时插入一条日志到数据库。例如,创建一个log表,记录用户ID、登录时间、IP地址等信息。
小李:明白了,这些功能结合起来,就能打造一个安全可靠的实习就业管理系统。
老张:没错,特别是在泉州这样的城市,很多高校和企业都希望有一个本地化的平台来促进实习和就业。所以,系统不仅要功能完善,还要注重用户体验。
小李:谢谢你的指导,我现在对整个登录模块有了更清晰的认识。
老张:不客气,如果还有其他问题,随时问我。
