用户登录注册系统缺陷分析与改进
本次作业使用的程序来源于大二上学期,JAVA框架编程课程设计的期末大作业。
运行环境为:JDK:1.8 及以上
服务器:9.0
开发工具:Eclipse
数据库:使用文本文件存储
编码:UTF-8
以下是我当时刚刚完成我的用户登录注册系统时候的运行截图以及其源代码:
点击查看代码
//UserService.java文件
package com.bean;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class UserService {
private static final String USER_FILE = "user.txt";
// 登录验证
public boolean login(String username, String password) {
if (username == null || username.isEmpty() || password == null || password.isEmpty()) return false;
File f = new File(USER_FILE);
if (!f.exists()) return false;
try (BufferedReader br = new BufferedReader(new FileReader(f))) {
String line;
while ((line = br.readLine()) != null) {
String[] arr = line.split(":");
if (arr.length == 2 && arr[0].equals(username) && arr[1].equals(password)) return true;
}
} catch (IOException e) {e.printStackTrace();}
return false;
}
// 注册
public int register(String username, String password) {
if (username == null || username.isEmpty() || password == null || password.isEmpty()) return 2;
File f = new File(USER_FILE);
// 检查用户名重复
if (f.exists()) {
try (BufferedReader br = new BufferedReader(new FileReader(f))) {
String line;
while ((line = br.readLine()) != null) {
String[] arr = line.split(":");
if (arr.length >=1 && arr[0].equals(username)) return 1;
}
} catch (IOException e) {return 3;}
}
// 写入文件
try (BufferedWriter bw = new BufferedWriter(new FileWriter(f, true))) {
bw.write(username + ":" + password + "\n");
return 0;
} catch (IOException e) {return 3;}
}
}
点击查看代码
//index.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>主页</title>
<style>body{text-align:center;margin-top:100px;}</style>
</head>
<body>
<%
// 未登录直接跳登录页
String user = (String) session.getAttribute("user");
if (user == null) {
response.sendRedirect("login.jsp");
return;
}
%>
<h2>欢迎 <%= user %> 登录!</h2>
<a href="login.jsp">退出登录</a>
</body>
</html>
点击查看代码
//register.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.bean.UserService" %>
<html>
<head>
<title>注册</title>
<style>
body{text-align:center;margin-top:100px;}
.success {color: green; font-size: 16px; font-weight: bold;}
.login-link {color: #0066cc; text-decoration: none; margin-top: 10px; display: block;}
.login-link:hover {text-decoration: underline;}
.error {color: red;}
</style>
</head>
<body>
<h2>注册界面</h2>
<%
String successMsg = "";
String errorMsg = "";
String preUn = request.getParameter("un");
String username = request.getParameter("username");
String password = request.getParameter("password");
if (username != null && password != null) {
UserService us = new UserService();
int res = us.register(username, password);
if (res == 0) {
successMsg = "注册成功!";
username = "";
preUn = "";
} else if (res == 1) {
errorMsg = "用户名已存在,请更换";
} else if (res == 2) {
errorMsg = "账号或密码不能为空";
}
}
%>
<% if (!successMsg.isEmpty()) { %>
<p class="success"><%= successMsg %></p>
<a href="login.jsp" class="login-link">返回登录</a>
<% } %>
<% if (!errorMsg.isEmpty()) { %>
<p class="error"><%= errorMsg %></p>
<% } %>
<% if (successMsg.isEmpty()) { %>
<form method="post" action="register.jsp">
用户名:<input type="text" name="username" value="<%= (preUn == null || preUn.equals("null")) ? "" : preUn %>"><br><br>
密 码:<input type="password" name="password"><br><br>
<input type="submit" value="注册">
</form>
<br>
<a href="login.jsp">返回登录</a>
<% } %>
</body>
</html>
点击查看代码
//login.jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.bean.UserService" %>
<html>
<head>
<title>登录</title>
<style>body{text-align:center;margin-top:100px;}</style>
</head>
<body>
<h2>登录界面</h2>
<%-- 注册成功提示 --%>
<% String msg = request.getParameter("msg");
if (msg != null) { %>
<p style="color:green"><%= msg %></p>
<% } %>
<%-- 登录逻辑(只在表单提交时执行) --%>
<%
String un = request.getParameter("username");
String pw = request.getParameter("password");
if (un != null && pw != null) { // 表单提交了
UserService us = new UserService();
if (us.login(un, pw)) {
session.setAttribute("user", un);
response.sendRedirect("index.jsp"); // 登录成功跳主页
} else {
response.sendRedirect("register.jsp?un=" + un); // 未注册跳注册
}
return;
}
%>
<%-- 登录表单 --%>
<form method="post" action="login.jsp">
用户名:<input type="text" name="username"><br><br>
密 码:<input type="password" name="password"><br><br>
<input type="submit" value="登录">
</form>
<br>
<a href="register.jsp">没有账号?点击注册</a>
</body>
</html>




此网页存在许多问题,最主要的问题就是初版程序在登陆错误用户名以及其密码之后会出现白色页面无法返回初始登陆页面。此问题主要是由于response.sendRedirect 跳转后未正确处理中文提示,且参数传递易出问题,导致页面跳转异常。对于这个问题我打算通过去掉原代码中 “登录失败跳注册页 / 跳登录页” 的逻辑,不做任何跳转,直接在当前页处理结果;同时,登录失败时仅在页面内显示错误提示,保留用户名输入框内容,用户不用重新输入,体验更好;最后全程不涉及 URL 传参,彻底避免跳转异常、中文乱码等问题,保证稳定停留在登录页。以下是改进后的代码:
<%
String loginError = "";
String un = request.getParameter("username");
String pw = request.getParameter("password");
if (un != null && pw != null) {
UserService us = new UserService();
if (us.login(un, pw)) {
session.setAttribute("user", un);
response.sendRedirect("index.jsp");
return;
} else {
loginError = "用户名或密码错误,请重新输入!";
pw = "";
}
}
%>
<% if (!loginError.isEmpty()) { %>
<p class="error"><%= loginError %></p>
<% } %>
以下是改进后的代码的实际效果:

最后在修改这次大作业的过程中,我知道了登录失败别用sendRedirect跳转,在当前页直接显示提示,是保证返回登录页的核心。写 JSP 优先 “页面内处理逻辑”,减少不必要的跳转,能避免很多的页面异常问题。
浙公网安备 33010602011771号