From c5e89f7bf96ec70563113dfb32612f2070d4bae4 Mon Sep 17 00:00:00 2001 From: Dragon1573 Date: Fri, 13 Nov 2020 14:33:48 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E4=BF=AE=E5=A4=8D=E4=BA=86?= =?UTF-8?q?=E5=87=A0=E4=B8=AA=E6=81=B6=E6=80=A7=20Bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 更新 Connector.java - 将数据库连接/断开提取封装为 private synchronized static 方法,确保全局仅有一个数据库连接对象 - 确保每个连接在使用后被归还至连接池 2. 更新 context.xml ,配置超时数据库连接的自动回收 3. 移除 encrypt.js 并将其功能压缩后移动至相应的业务文件 4. 压缩 platform.js 5. 格式化了所有代码 --- src/main/java/servlets/Comments.java | 33 +- src/main/java/servlets/Download.java | 8 +- src/main/java/servlets/Login.java | 28 +- src/main/java/servlets/Repositories.java | 64 +-- src/main/java/servlets/ResetVerify.java | 4 +- src/main/java/servlets/SignUp.java | 8 +- src/main/java/servlets/UniqueCheck.java | 64 +-- src/main/java/servlets/hidden/Delete.java | 30 +- src/main/java/servlets/hidden/NewKey.java | 8 +- src/main/java/servlets/hidden/Remove.java | 21 +- src/main/java/servlets/hidden/Settings.java | 14 +- src/main/java/servlets/hidden/Upload.java | 49 +- src/main/java/utils/Connector.java | 332 +++++++------ src/main/webapp/META-INF/context.xml | 6 +- src/main/webapp/WEB-INF/web.xml | 9 - src/main/webapp/comments.jsp | 188 ++++---- src/main/webapp/details.jsp | 341 +++++++------ src/main/webapp/files.jsp | 294 +++++------- src/main/webapp/js/encrypt.js | 22 - src/main/webapp/js/platform.js | 501 +------------------- src/main/webapp/login.jsp | 12 +- src/main/webapp/private/reset.jsp | 9 +- src/main/webapp/private/security.jsp | 6 +- src/main/webapp/signUp.jsp | 15 +- 24 files changed, 714 insertions(+), 1352 deletions(-) delete mode 100644 src/main/webapp/js/encrypt.js diff --git a/src/main/java/servlets/Comments.java b/src/main/java/servlets/Comments.java index a8a9a20..e27e533 100644 --- a/src/main/java/servlets/Comments.java +++ b/src/main/java/servlets/Comments.java @@ -2,8 +2,6 @@ import java.io.IOException; import java.io.PrintWriter; -import java.sql.ResultSet; -import java.sql.SQLException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -43,33 +41,11 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=UTF-8"); - // 获取用户名 - String username = request.getParameter("username"); - - // 获取评论 - Connector connector = new Connector(); - ResultSet resultSet = connector.fetchComments(username); - - // 生成JSON数据表 - JSONArray vector = new JSONArray(); - try { - while (resultSet != null && resultSet.next()) { - JSONObject object = new JSONObject(); - object.put("SENDER", resultSet.getString("Sender")); - object.put("TITLE", resultSet.getString("Title")); - object.put("DETAILS", resultSet.getString("Details")); - // 将SQL Server中的时间转换为字符串 - object.put("DATETIME", resultSet.getString("DateTime")); - // 将单个JSON数据加入表中 - vector.add(object); - } - } catch (SQLException e) { - e.printStackTrace(); - } - // 输出JSON字符串 try (PrintWriter writer = response.getWriter()) { - writer.println(JSON.toJSONString(vector)); + String username = request.getParameter("username"); + JSONArray array = Connector.fetchComments(username); + writer.println(JSON.toJSONString(array)); } } @@ -97,8 +73,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) String comments = request.getParameter("details"); // 访问数据库 - Connector connector = new Connector(); - boolean isSaved = connector.sendComments(username, title, comments); + boolean isSaved = Connector.sendComments(username, title, comments); // 转换为JSON字符串 JSONObject jsonObject = new JSONObject(); diff --git a/src/main/java/servlets/Download.java b/src/main/java/servlets/Download.java index 3c58300..002c1c6 100644 --- a/src/main/java/servlets/Download.java +++ b/src/main/java/servlets/Download.java @@ -4,7 +4,6 @@ import java.io.OutputStream; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -18,20 +17,17 @@ @WebServlet(name = "Download", urlPatterns = {"/download"}) public class Download extends HttpServlet { @Override - protected void doGet( - HttpServletRequest request, HttpServletResponse response - ) throws ServletException, IOException { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // 设置请求与响应的格式 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("application/x-msdownload"); - Connector connector = new Connector(); // 获取文件名及其内容 final String username = request.getParameter("user"); final String repository = request.getParameter("repo"); String filename = request.getParameter("file"); - byte[] content = connector.getFiles(username, repository, filename); + byte[] content = Connector.getFiles(username, repository, filename); filename = filename.substring(filename.lastIndexOf("/") + 1); filename = URLEncoder.encode(filename, StandardCharsets.UTF_8); diff --git a/src/main/java/servlets/Login.java b/src/main/java/servlets/Login.java index e571e1e..1a2a5e9 100644 --- a/src/main/java/servlets/Login.java +++ b/src/main/java/servlets/Login.java @@ -2,9 +2,6 @@ import java.io.IOException; import java.io.PrintWriter; -import java.sql.ResultSet; -import java.sql.SQLException; - import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -13,28 +10,24 @@ import entities.UserInfo; import utils.Connector; -import utils.Md5Util; /** * Servlet:用户登录 * * @author Dragon1573 - * @date 2019/7/7 */ @WebServlet(name = "Login", urlPatterns = {"/login"}) public class Login extends HttpServlet { private static final long serialVersionUID = -6477635060462144660L; @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) - throws IOException { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { PrintWriter out = response.getWriter(); out.println("警告:此方法仅用于Visio生成网站图,请使用POST方法!"); } @Override - protected void doPost(HttpServletRequest request, - HttpServletResponse response) throws IOException { + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { // 设置请求与回复编码 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); @@ -47,22 +40,9 @@ protected void doPost(HttpServletRequest request, String username = request.getParameter("username"); String password = request.getParameter("password"); - //查询数据库,进行身份校验 - Connector connector = new Connector(); - ResultSet resultSet = connector.login(username); - boolean success = false; - try { - while (resultSet != null && resultSet.next()) { - String s = resultSet.getString(1); - success = s.equals(Md5Util.encrypt(password)); - } - } catch (SQLException exception) { - exception.printStackTrace(); - } - - // 判断是否登陆成功 String redirectUrl; - if (success) { + // 身份校验 + if (Connector.login(username, password)) { certificate.setUsername(username); certificate.setVerified(true); redirectUrl = "index.jsp?user=" + certificate.getUsername(); diff --git a/src/main/java/servlets/Repositories.java b/src/main/java/servlets/Repositories.java index dcb9152..0d6ffce 100644 --- a/src/main/java/servlets/Repositories.java +++ b/src/main/java/servlets/Repositories.java @@ -2,15 +2,12 @@ import java.io.IOException; import java.io.PrintWriter; -import java.sql.ResultSet; -import java.sql.SQLException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import utils.Connector; @@ -23,43 +20,21 @@ public class Repositories extends HttpServlet { private static final long serialVersionUID = 7370782377273050355L; @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws IOException { // 指定编码 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=UTF-8"); - // 获取请求字段 - String username = request.getParameter("username"); - - // 连接数据库 - Connector connector = new Connector(); - ResultSet resultSet = connector.fetchRepositories(username); - - // 创建JSON数组 - JSONArray list = new JSONArray(); - try { - while (resultSet != null && resultSet.next()) { - JSONObject object = new JSONObject(); - object.put("USERNAME", resultSet.getString("Username")); - object.put("REPOSITORY", resultSet.getString("Repository")); - list.add(object); - } - } catch (SQLException e) { - e.printStackTrace(); + try (PrintWriter out = response.getWriter()) { + out.println(JSON.toJSONString(Connector.fetchRepositories(request.getParameter("username")))); } - - // 转换为JSON字符串 - String jsonStr = JSON.toJSONString(list); - - // 输出 - PrintWriter out = response.getWriter(); - out.println(jsonStr); - out.close(); } @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws IOException { // 指定编码 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); @@ -71,25 +46,16 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) String newName = request.getParameter("new_name"); String oldName = request.getParameter("old_name"); - Connector connector = new Connector(); - boolean success = false; - - switch (method) { - case "rename": - success = connector.renameRepositories(username, newName, oldName); - break; + boolean success = switch (method) { + case "rename" -> Connector.renameRepositories(username, newName, oldName); + case "delete" -> Connector.deleteRepositories(username, oldName); + default -> false; + }; - case "delete": - success = connector.deleteRepositories(username, oldName); - break; - - default: - break; + try (PrintWriter writer = response.getWriter()) { + JSONObject object = new JSONObject(); + object.put("SUCCESS", success); + writer.println(JSON.toJSONString(object)); } - - JSONObject object = new JSONObject(); - object.put("SUCCESS", success); - String json = JSON.toJSONString(object); - response.getWriter().println(json); } } diff --git a/src/main/java/servlets/ResetVerify.java b/src/main/java/servlets/ResetVerify.java index a59bcfe..aaf34b8 100644 --- a/src/main/java/servlets/ResetVerify.java +++ b/src/main/java/servlets/ResetVerify.java @@ -22,10 +22,8 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) String username = request.getParameter("username"); String answer = request.getParameter("answer"); - Connector connector = new Connector(); - HttpSession session = request.getSession(); - if (connector.resetVerify(username, answer)) { + if (Connector.resetVerify(username, answer)) { UserInfo info = (UserInfo)session.getAttribute("certificate"); info.setVerified(true); info.setUsername(username); diff --git a/src/main/java/servlets/SignUp.java b/src/main/java/servlets/SignUp.java index 2646105..06b0647 100644 --- a/src/main/java/servlets/SignUp.java +++ b/src/main/java/servlets/SignUp.java @@ -3,7 +3,6 @@ import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; - import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -18,7 +17,6 @@ * Servlet:注册 * * @author Dragon1573 - * @date 2019/7/7 */ @WebServlet(name = "SignUp", urlPatterns = {"/signUp"}) public class SignUp extends HttpServlet { @@ -31,7 +29,8 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t } @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws IOException, ServletException { // 设置请求编码格式 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); @@ -54,8 +53,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) profile.put("Answer", request.getParameter("answer")); // 用户入库 - Connector connector = new Connector(); - int effect = connector.signUp(profile); + int effect = Connector.signUp(profile); if (effect <= 0) { // 用户信息未存入数据库 request.setAttribute("error", "SignUpFailedError"); diff --git a/src/main/java/servlets/UniqueCheck.java b/src/main/java/servlets/UniqueCheck.java index e9ca6f6..d7b1729 100644 --- a/src/main/java/servlets/UniqueCheck.java +++ b/src/main/java/servlets/UniqueCheck.java @@ -2,29 +2,41 @@ import java.io.IOException; import java.io.PrintWriter; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.HashMap; import java.util.Map; - import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.alibaba.fastjson.JSON; + import utils.Connector; /** * 用户名唯一性检验 * * @author Dragon1573 - * @date 2019/7/8 */ @WebServlet(name = "UniqueCheck", urlPatterns = {"/check"}) public class UniqueCheck extends HttpServlet { private static final long serialVersionUID = -5094519874151185796L; + private enum Info { + /** + * 用户唯一 + */ + UNIQUE, + /** + * 未设置密保 + */ + NO_PROTECTION, + /** + * 重复的用户 + */ + DUPLICATE + } + @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // 设置编码格式 @@ -35,31 +47,14 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t // 获取用户表单内容 String username = request.getParameter("username"); - // 创建数据库连接并查询 - Connector connector = new Connector(); - ResultSet resultSet = connector.uniqueCheck(username); - // 用户存在性检验 - boolean isExists = false; - try { - while (resultSet != null && resultSet.next()) { - isExists = (resultSet.getInt(1) > 0); - } - - // 断言 - assert resultSet != null; - resultSet.close(); - } catch (SQLException exception) { - exception.printStackTrace(); - } - - // 获取密保问题 - String question = connector.getQuestion(username); + boolean isExists = Connector.uniqueCheck(username); // 生成JSON Map jsonMap = new HashMap<>(2); if (isExists) { - // 用户存在 + // 获取密保问题 + String question = Connector.getQuestion(username); if (question == null) { // 无密保问题 jsonMap.put("FLAG", Info.NO_PROTECTION); @@ -77,23 +72,8 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t String jsonString = JSON.toJSONString(jsonMap); // 输出 - PrintWriter out = response.getWriter(); - out.println(jsonString); - out.close(); - } - - private enum Info { - /** - * 用户唯一 - */ - UNIQUE, - /** - * 未设置密保 - */ - NO_PROTECTION, - /** - * 重复的用户 - */ - DUPLICATE + try (PrintWriter out = response.getWriter()) { + out.println(jsonString); + } } } diff --git a/src/main/java/servlets/hidden/Delete.java b/src/main/java/servlets/hidden/Delete.java index 3f59ad0..67bc1e0 100644 --- a/src/main/java/servlets/hidden/Delete.java +++ b/src/main/java/servlets/hidden/Delete.java @@ -1,15 +1,14 @@ package servlets.hidden; import java.io.IOException; -import java.sql.ResultSet; -import java.sql.SQLException; -import javax.servlet.ServletException; +import java.io.PrintWriter; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import utils.Connector; @@ -20,29 +19,28 @@ @WebServlet(name = "Delete", urlPatterns = {"/delete"}) public class Delete extends HttpServlet { @Override - protected void doPost( - final HttpServletRequest request, final HttpServletResponse response - ) throws IOException { + protected void doPost(final HttpServletRequest request, final HttpServletResponse response) + throws IOException { // 设置编码格式 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); + // 连接数据库并执行递归删除 - Connector connector = new Connector(); - final boolean success = connector.deleteFolder( + final boolean success = Connector.deleteFolder( request.getParameter("user"), request.getParameter("repo"), request.getParameter("path") ); JSONObject object = new JSONObject(); object.put("SUCCESS", success); - ResultSet set = connector.fetchRepositories(request.getParameter("user")); - try { - object.put("EMPTY", !set.next()); - } catch (SQLException e) { - System.err.println("[ERROR] 数据库连接异常或结果集已关闭!"); - e.printStackTrace(); - } final String json = JSON.toJSONString(object); - response.getWriter().println(json); + + // 检查用户是否还有仓库 + JSONArray array = Connector.fetchRepositories(request.getParameter("user")); + object.put("EMPTY", array.isEmpty()); + + try (PrintWriter writer = response.getWriter()) { + writer.println(JSON.toJSONString(object)); + } } } diff --git a/src/main/java/servlets/hidden/NewKey.java b/src/main/java/servlets/hidden/NewKey.java index 613ff42..a6e45b7 100644 --- a/src/main/java/servlets/hidden/NewKey.java +++ b/src/main/java/servlets/hidden/NewKey.java @@ -1,7 +1,6 @@ package servlets.hidden; import java.io.IOException; - import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -13,12 +12,12 @@ /** * @author Dragon1573 - * @date 2019/7/15 */ @WebServlet(name = "NewKey", urlPatterns = {"/reset"}) public class NewKey extends HttpServlet { @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws IOException { // 取出Session HttpSession session = request.getSession(); UserInfo info = (UserInfo)session.getAttribute("certificate"); @@ -26,8 +25,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) String username = info.getUsername(); String password = request.getParameter("password"); - Connector connector = new Connector(); - connector.reset(username, password); + Connector.reset(username, password); response.sendRedirect("index.jsp?user=" + username); } } diff --git a/src/main/java/servlets/hidden/Remove.java b/src/main/java/servlets/hidden/Remove.java index 1d0aa3f..ac6bd35 100644 --- a/src/main/java/servlets/hidden/Remove.java +++ b/src/main/java/servlets/hidden/Remove.java @@ -1,7 +1,7 @@ package servlets.hidden; import java.io.IOException; -import javax.servlet.ServletException; +import java.io.PrintWriter; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -20,17 +20,20 @@ public class Remove extends HttpServlet { @Override protected void doPost( HttpServletRequest request, HttpServletResponse response - ) throws ServletException, IOException { + ) + throws IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); - Connector connector = new Connector(); - JSONObject object = new JSONObject(); - object.put( - "SUCCESS", - connector.deleteComments(request.getParameter("timestamp")) - ); - response.sendRedirect("comments.jsp?user=" + request.getParameter("user")); + // 移除评论 + boolean isRemoved = Connector.deleteComments(request.getParameter("timestamp")); + + // 输出 + try (PrintWriter writer = response.getWriter()) { + JSONObject object = new JSONObject(1); + object.put("SUCCESS", isRemoved); + writer.println(JSON.toJSONString(object)); + } } } diff --git a/src/main/java/servlets/hidden/Settings.java b/src/main/java/servlets/hidden/Settings.java index 62f7690..a55cbcb 100644 --- a/src/main/java/servlets/hidden/Settings.java +++ b/src/main/java/servlets/hidden/Settings.java @@ -1,7 +1,6 @@ package servlets.hidden; import java.io.IOException; - import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -10,13 +9,13 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; + import entities.UserInfo; import utils.Connector; import utils.Md5Util; /** * @author Dragon1573 - * @date 2019/7/23 */ @WebServlet(name = "Settings", urlPatterns = {"/settings"}) public class Settings extends HttpServlet { @@ -36,30 +35,29 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) String username = info.getUsername(); // 变更数据库 - Connector connector = new Connector(); boolean success = false; switch (fields) { case "Username": - success = connector.changeUsername(news, username); + success = Connector.changeUsername(news, username); info.setUsername(news); break; case "Password": String newPass = Md5Util.encrypt(news); String oldPass = Md5Util.encrypt(old); - success = connector.changePassword(username, newPass, oldPass); + success = Connector.changePassword(username, newPass, oldPass); break; case "Phone": - success = connector.changePhone(username, news); + success = Connector.changePhone(username, news); break; case "Protection": - success = connector.changeProtection(username, news, old); + success = Connector.changeProtection(username, news, old); break; case "Email": - success = connector.changeEmail(username, news); + success = Connector.changeEmail(username, news); break; default: diff --git a/src/main/java/servlets/hidden/Upload.java b/src/main/java/servlets/hidden/Upload.java index 952e692..809ff4a 100644 --- a/src/main/java/servlets/hidden/Upload.java +++ b/src/main/java/servlets/hidden/Upload.java @@ -24,10 +24,11 @@ */ @WebServlet(name = "Upload", urlPatterns = {"/upload"}) public class Upload extends HttpServlet { - private JSONObject object = new JSONObject(); + private final JSONObject object = new JSONObject(); @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws IOException { // 清空JSONObject对象 object.clear(); // 设置编码格式 @@ -48,6 +49,17 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) response.sendRedirect("repositories.jsp"); } + /** + * @param folder + * 文件夹名称 + * + * @return 文件夹名称是否合法 + */ + private boolean isLegal(final String folder) { + // 正常的文件夹,其名称不应为空 + return (folder != null && !"".equals(folder)); + } + /** * 载入文件 * @@ -99,25 +111,14 @@ private void loadFiles(HttpServletRequest request) { } } - /** - * @param folder 文件夹名称 - * - * @return 文件夹名称是否合法 - */ - private boolean isLegal(final String folder) { - // 正常的文件夹,其名称不应为空 - return (folder != null && !"".equals(folder)); - } - /** * 将文件写入到数据库中 * - * @param object 以JSON封装的表单对象 + * @param object + * 以JSON封装的表单对象 */ private void saveToSql(final JSONObject object) { try { - // 获取 JDBC 对象 - Connector connector = new Connector(); // 构建文件夹 String[] path = object.getObject("pathName", String[].class); // 增加路径前缀,防止目录树的树枝合并 @@ -135,26 +136,16 @@ private void saveToSql(final JSONObject object) { System.err.println("[Error] 非法路径!"); throw new FileUploadException(); } - connector.uploadFiles( - object.getString("Username"), - object.getString("repoName"), - fullPath, - fullPath + "/" + path[i], - null, - true + Connector.uploadFiles(object.getString("Username"), object.getString("repoName"), fullPath, + fullPath + "/" + path[i], null, true ); // 更新路径前缀 fullPath += "/" + path[i]; } } // 上传文件 - connector.uploadFiles( - object.getString("Username"), - object.getString("repoName"), - fullPath, - fullPath + "/" + object.getString("Filename"), - object.getBytes("Content-Bytes"), - false + Connector.uploadFiles(object.getString("Username"), object.getString("repoName"), fullPath, + fullPath + "/" + object.getString("Filename"), object.getBytes("Content-Bytes"), false ); } catch (FileUploadException e) { e.printStackTrace(); diff --git a/src/main/java/utils/Connector.java b/src/main/java/utils/Connector.java index 444130c..0d5e41f 100644 --- a/src/main/java/utils/Connector.java +++ b/src/main/java/utils/Connector.java @@ -20,6 +20,7 @@ */ public class Connector implements Serializable { private static final long serialVersionUID = -5284530935717575965L; + private static Connection connection = null; private static DataSource source = null; static { @@ -32,6 +33,11 @@ public class Connector implements Serializable { } } + /** + * 私有类方法,禁止其他方法创建对象 + */ + private Connector() {} + /** * 修改电子邮箱 * @@ -44,17 +50,17 @@ public class Connector implements Serializable { */ public static boolean changeEmail(String username, String mail) { boolean success = false; - try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "UPDATE Users SET Email = ? WHERE Username = ?" - ); + try ( + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "UPDATE Users SET Email = ? WHERE Username = ?") + ) { statement.setString(1, mail); statement.setString(2, username); success = (statement.executeUpdate() > 0); - statement.close(); } catch (SQLException e) { e.printStackTrace(); } + disconnect(); return success; } @@ -72,18 +78,18 @@ public static boolean changeEmail(String username, String mail) { */ public static boolean changePassword(String username, String news, String old) { boolean success = false; - try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "UPDATE Users SET Password = ? WHERE (Username = ? AND Password = ?)" - ); + try ( + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "UPDATE Users SET Password = ? WHERE (Username = ? AND Password = ?)") + ) { statement.setString(1, news); statement.setString(2, username); statement.setString(3, old); success = (statement.executeUpdate() > 0); - statement.close(); } catch (SQLException e) { e.printStackTrace(); } + disconnect(); return success; } @@ -99,17 +105,17 @@ public static boolean changePassword(String username, String news, String old) { */ public static boolean changePhone(String username, String news) { boolean success = false; - try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "UPDATE Users SET Phone = ? WHERE Username = ?" - ); + try ( + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "UPDATE Users SET Phone = ? WHERE Username = ?") + ) { statement.setString(1, news); statement.setString(2, username); success = (statement.executeUpdate() > 0); - statement.close(); } catch (SQLException e) { e.printStackTrace(); } + disconnect(); return success; } @@ -127,18 +133,18 @@ public static boolean changePhone(String username, String news) { */ public static boolean changeProtection(String username, String question, String answer) { boolean success = false; - try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "UPDATE Users SET Question = ?, Answer = ? WHERE Username = ?" - ); + try ( + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "UPDATE Users SET Question = ?, Answer = ? WHERE Username = ?") + ) { statement.setString(1, question); statement.setString(2, answer); statement.setString(3, username); success = (statement.executeUpdate() > 0); - statement.close(); } catch (SQLException e) { e.printStackTrace(); } + disconnect(); return success; } @@ -154,20 +160,36 @@ public static boolean changeProtection(String username, String question, String */ public static boolean changeUsername(String news, String old) { boolean success = false; - try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "UPDATE Users SET Username = ? WHERE Username = ?" - ); + try ( + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "UPDATE Users SET Username = ? WHERE Username = ?") + ) { statement.setString(1, news); statement.setString(2, old); success = (statement.executeUpdate() > 0); - statement.close(); } catch (SQLException e) { e.printStackTrace(); } + disconnect(); return success; } + /** + * 从连接池获取数据库连接 + * + * @return 数据库连接 + */ + private synchronized static Connection connect() { + if (connection == null) { + try { + connection = source.getConnection(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return connection; + } + /** * @param timestamp * 字符串时间戳 @@ -177,9 +199,8 @@ public static boolean changeUsername(String news, String old) { public static boolean deleteComments(String timestamp) { boolean isDeleted = false; try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "DELETE FROM Comments WHERE DateTime = ?" - ); + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "DELETE FROM Comments WHERE DateTime = ?"); statement.setString(1, timestamp); isDeleted = (statement.executeUpdate() > 0); statement.close(); @@ -187,20 +208,18 @@ public static boolean deleteComments(String timestamp) { System.err.println("[ERROR] 记录删除失败!"); e.printStackTrace(); } + disconnect(); return isDeleted; } /** * 递归删除仓库目录 */ - public static boolean deleteFolder( - String username, String repository, String path - ) { + public static boolean deleteFolder(String username, String repository, String path) { boolean success = false; try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "DELETE FROM Repositories WHERE Username = ? AND Repository = ? AND Filename LIKE ?" - ); + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "DELETE FROM Repositories WHERE Username = ? AND Repository = ? AND Filename LIKE ?"); statement.setString(1, username); statement.setString(2, repository); statement.setString(3, path + "%"); @@ -210,6 +229,7 @@ public static boolean deleteFolder( System.err.println("[ERROR] 目录递归删除失败!"); e.printStackTrace(); } + disconnect(); return success; } @@ -226,9 +246,8 @@ public static boolean deleteFolder( public static boolean deleteRepositories(String username, String repository) { boolean success = false; try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "DELETE FROM Repositories WHERE Username = ? AND Repository = ?" - ); + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "DELETE FROM Repositories WHERE Username = ? AND Repository = ?"); statement.setString(1, username); statement.setString(2, repository); success = (statement.executeUpdate() > 0); @@ -236,9 +255,23 @@ public static boolean deleteRepositories(String username, String repository) { } catch (SQLException e) { e.printStackTrace(); } + disconnect(); return success; } + /** + * 断开数据库连接,将连接归还到连接池 + */ + private synchronized static void disconnect() { + if (connection != null) { + try { + connection.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + /** * 获取用户评论 * @@ -247,25 +280,41 @@ public static boolean deleteRepositories(String username, String repository) { * * @return 用户评论 */ - public static ResultSet fetchComments(String username) { + public static JSONArray fetchComments(String username) { + // 初始化JSON数据表 + JSONArray vector = new JSONArray(); + // 预制初始名 final String anonymous = "Anonymous"; - ResultSet resultSet = null; - try { - Connection connection = getConnection(); + + String sql; + if (!anonymous.equals(username)) { + sql = "SELECT * FROM Comments WHERE Sender = ?"; + } else { + sql = "SELECT * FROM Comments"; + } + + try (PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement(sql)) { if (!anonymous.equals(username)) { - PreparedStatement statement = Objects.requireNonNull(connection).prepareStatement( - "SELECT * FROM Comments WHERE Sender = ?" - ); statement.setString(1, username); - resultSet = statement.executeQuery(); - } else { - Statement statement = Objects.requireNonNull(connection).createStatement(); - resultSet = statement.executeQuery("SELECT * FROM Comments"); + } + try (ResultSet resultSet = statement.executeQuery()) { + while (resultSet != null && resultSet.next()) { + JSONObject object = new JSONObject(); + object.put("SENDER", resultSet.getString("Sender")); + object.put("TITLE", resultSet.getString("Title")); + object.put("DETAILS", resultSet.getString("Details")); + // 将SQL Server中的时间转换为字符串 + object.put("DATETIME", resultSet.getString("DateTime")); + // 将单个JSON数据加入表中 + vector.add(object); + } } } catch (SQLException e) { e.printStackTrace(); } - return resultSet; + + disconnect(); + return vector; } /** @@ -276,31 +325,33 @@ public static ResultSet fetchComments(String username) { * * @return 结果集 */ - public static ResultSet fetchRepositories(String username) { + public static JSONArray fetchRepositories(String username) { String[] anonymous = {"佛大云服务", "Anonymous"}; - ResultSet resultSet = null; - PreparedStatement statement; + String sql; + JSONArray array = new JSONArray(); - try { - Connection connection = getConnection(); - if (Arrays.asList(anonymous).contains(username)) { - // 匿名用户 - statement = Objects.requireNonNull(connection).prepareStatement( - "SELECT Username, Repository FROM Repositories GROUP BY Username, Repository" - ); - } else { - // 登录用户 - statement = Objects.requireNonNull(connection).prepareStatement( - "SELECT Username, Repository FROM Repositories " - + "WHERE Username = ? GROUP BY Username, Repository" - ); + // 匿名测试 + boolean flag = Arrays.asList(anonymous).contains(username); + sql = flag ? ("SELECT Username, Repository FROM Repositories GROUP BY Username, Repository") + : ("SELECT Username, Repository FROM Repositories WHERE Username = ? GROUP BY Username, Repository"); + + try (PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement(sql)) { + if (!flag) { statement.setString(1, username); } - resultSet = statement.executeQuery(); + try (ResultSet resultSet = statement.executeQuery()) { + while (resultSet != null && resultSet.next()) { + JSONObject object = new JSONObject(); + object.put("USERNAME", resultSet.getString("Username")); + object.put("REPOSITORY", resultSet.getString("Repository")); + array.add(object); + } + } } catch (SQLException e) { e.printStackTrace(); } - return resultSet; + disconnect(); + return array; } /** @@ -312,9 +363,8 @@ public static ResultSet fetchRepositories(String username) { public static JSONObject getComments(String timeStamp) { JSONObject object = new JSONObject(); try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "SELECT * FROM Comments WHERE DateTime = ?" - ); + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "SELECT * FROM Comments WHERE DateTime = ?"); statement.setString(1, timeStamp); ResultSet resultSet = statement.executeQuery(); if (resultSet != null && resultSet.next()) { @@ -327,25 +377,10 @@ public static JSONObject getComments(String timeStamp) { System.err.println("[ERROR] 数据库请求异常!"); e.printStackTrace(); } + disconnect(); return object; } - private static Connection getConnection() { - try { - // 初始化上下文 - return source.getConnection(); - } catch (SQLException exception) { - switch (exception.getClass().getTypeName()) { - case "SQLException" -> System.err.println("[Error] 数据库连接异常!"); - case "ClassNotFoundException" -> System.err.println("[Error] 未找到数据库驱动器!"); - case "IOException" -> System.err.println("[Error] 配置文件读取错误!"); - default -> System.err.println("[Error] 未知错误!"); - } - exception.printStackTrace(); - return null; - } - } - /** * 获取文件 * @@ -358,14 +393,11 @@ private static Connection getConnection() { * * @return 二进制文件内容 */ - public static byte[] getFiles( - String username, String repository, String filename - ) { + public static byte[] getFiles(String username, String repository, String filename) { byte[] content = null; try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "SELECT Details FROM Repositories WHERE Username = ? AND Repository = ? AND Filename = ?" - ); + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "SELECT Details FROM Repositories WHERE Username = ? AND Repository = ? AND Filename = ?"); statement.setString(1, username); statement.setString(2, repository); statement.setString(3, filename); @@ -378,6 +410,7 @@ public static byte[] getFiles( System.err.println("[Error] 文件读取异常!"); e.printStackTrace(); } + disconnect(); return content; } @@ -393,9 +426,8 @@ public static String getQuestion(String username) { String question = null; try { // 执行SQL语句 - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "SELECT Question FROM Users WHERE Username = ?" - ); + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "SELECT Question FROM Users WHERE Username = ?"); statement.setString(1, username); ResultSet resultSet = statement.executeQuery(); // 提取密保问题 @@ -406,6 +438,7 @@ public static String getQuestion(String username) { } catch (SQLException exception) { exception.printStackTrace(); } + disconnect(); return question; } @@ -419,14 +452,11 @@ public static String getQuestion(String username) { * @param path * 相对路径名 */ - public static JSONArray listFiles( - String username, String repository, String path - ) { + public static JSONArray listFiles(String username, String repository, String path) { JSONArray folders = new JSONArray(); try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "SELECT Filename,Folder FROM Repositories " - + "WHERE Username = ? AND Repository = ? AND Path = ? " + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "SELECT Filename,Folder FROM Repositories " + "WHERE Username = ? AND Repository = ? AND Path = ? " + "GROUP BY Filename,Folder"); statement.setString(1, username); statement.setString(2, repository); @@ -443,6 +473,7 @@ public static JSONArray listFiles( System.err.println("[Error] 拉取文件列表异常!"); e.printStackTrace(); } + disconnect(); return folders; } @@ -451,24 +482,36 @@ public static JSONArray listFiles( * * @param username * 用户名 + * @param password + * 密码 * - * @return 受影响的行数 + * @return 登录成功反馈标记 */ - public static ResultSet login(String username) { - ResultSet resultSet = null; - try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "SELECT Password FROM Users WHERE (Username = ? OR Phone = ? OR Email = ?)" - ); + public static boolean login(String username, String password) { + boolean success = false; + + try ( + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "SELECT Password FROM Users WHERE (Username = ? OR Phone = ? OR Email = ?)") + ) { statement.setString(1, username); statement.setString(2, username); statement.setString(3, username); - resultSet = statement.executeQuery(); + + //查询数据库,进行身份校验 + try (ResultSet resultSet = statement.executeQuery()) { + while (resultSet != null && resultSet.next()) { + String s = resultSet.getString(1); + success = s.equals(Md5Util.encrypt(password)); + } + } } catch (SQLException exception) { System.err.println("错误:SQL语句异常!"); exception.printStackTrace(); } - return resultSet; + + disconnect(); + return success; } /** @@ -484,9 +527,8 @@ public static ResultSet login(String username) { public static boolean renameRepositories(String username, String newName, String oldName) { boolean success = false; try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "UPDATE Repositories SET Repository = ? WHERE (Username = ? AND Repository = ?)" - ); + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "UPDATE Repositories SET Repository = ? WHERE (Username = ? AND Repository = ?)"); statement.setString(1, newName); statement.setString(2, username); statement.setString(3, oldName); @@ -495,6 +537,7 @@ public static boolean renameRepositories(String username, String newName, String } catch (SQLException e) { e.printStackTrace(); } + disconnect(); return success; } @@ -506,9 +549,8 @@ public static boolean renameRepositories(String username, String newName, String */ public static void reset(String username, String password) { try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "UPDATE Users SET Password = ? WHERE Username = ?" - ); + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "UPDATE Users SET Password = ? WHERE Username = ?"); statement.setString(1, Md5Util.encrypt(password)); statement.setString(2, username); statement.executeUpdate(); @@ -516,6 +558,7 @@ public static void reset(String username, String password) { } catch (SQLException e) { e.printStackTrace(); } + disconnect(); } /** @@ -531,9 +574,8 @@ public static void reset(String username, String password) { public static boolean resetVerify(String username, String answer) { boolean isPassed = false; try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "SELECT COUNT(*) AS Flag FROM Users WHERE Username = ? AND Answer = ?" - ); + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "SELECT COUNT(*) AS Flag FROM Users WHERE Username = ? AND Answer = ?"); statement.setString(1, username); statement.setString(2, answer); ResultSet resultSet = statement.executeQuery(); @@ -544,6 +586,7 @@ public static boolean resetVerify(String username, String answer) { } catch (SQLException e) { e.printStackTrace(); } + disconnect(); return isPassed; } @@ -557,15 +600,12 @@ public static boolean resetVerify(String username, String answer) { * * @return boolean */ - public static boolean sendComments( - String username, String title, String comments - ) { + public static boolean sendComments(String username, String title, String comments) { // 数据存入标记 boolean isSaved = false; try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "INSERT INTO Comments VALUES (?, ?, ?, CURRENT_TIME)" - ); + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "INSERT INTO Comments VALUES (?, ?, ?, CURRENT_TIME)"); statement.setString(1, username); statement.setString(2, title); statement.setString(3, comments); @@ -574,6 +614,7 @@ public static boolean sendComments( } catch (SQLException e) { e.printStackTrace(); } + disconnect(); return isSaved; } @@ -586,10 +627,10 @@ public static boolean sendComments( * @return 受影响的行数 */ public static int signUp(HashMap profile) { - try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "INSERT INTO Users VALUES (?, ?, ?, ?, ?, ?)" - ); + try ( + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "INSERT INTO Users VALUES (?, ?, ?, ?, ?, ?)") + ) { statement.setString(1, profile.get("Username")); statement.setString(2, Md5Util.encrypt(profile.get("Password"))); @@ -617,14 +658,13 @@ public static int signUp(HashMap profile) { } else { statement.setString(6, profile.get("Answer")); } - int affected = statement.executeUpdate(); - statement.close(); - return affected; + return statement.executeUpdate(); } catch (SQLException exception) { System.err.println("错误:SQL语句异常!"); exception.printStackTrace(); - return 0; } + disconnect(); + return 0; } /** @@ -635,18 +675,24 @@ public static int signUp(HashMap profile) { * * @return 受影响的行数 */ - public static ResultSet uniqueCheck(String username) { - try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "SELECT COUNT(*) AS Rows FROM Users WHERE Username = ?" - ); + public static boolean uniqueCheck(String username) { + boolean isExists = false; + try ( + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "SELECT COUNT(*) AS Rows FROM Users WHERE Username = ?") + ) { statement.setString(1, username); - return statement.executeQuery(); + try (ResultSet resultSet = statement.executeQuery()) { + while (resultSet != null && resultSet.next()) { + isExists = (resultSet.getInt(1) > 0); + } + } } catch (SQLException exception) { System.err.println("错误:SQL语句异常!"); exception.printStackTrace(); - return null; } + disconnect(); + return isExists; } /** @@ -671,9 +717,8 @@ public static void uploadFiles( details = (username + repoName + path + fileName).getBytes(); } try { - PreparedStatement statement = Objects.requireNonNull(getConnection()).prepareStatement( - "INSERT INTO Repositories VALUES (?, ?, ?, ?, ?, ?, ?)" - ); + PreparedStatement statement = Objects.requireNonNull(connect()).prepareStatement( + "INSERT INTO Repositories VALUES (?, ?, ?, ?, ?, ?, ?)"); statement.setString(1, username); statement.setString(2, repoName); statement.setString(3, path); @@ -686,5 +731,6 @@ public static void uploadFiles( } catch (SQLException e) { e.printStackTrace(); } + disconnect(); } } diff --git a/src/main/webapp/META-INF/context.xml b/src/main/webapp/META-INF/context.xml index 8a53f8d..37afd0b 100644 --- a/src/main/webapp/META-INF/context.xml +++ b/src/main/webapp/META-INF/context.xml @@ -2,7 +2,7 @@ - + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index a5be2dc..2a91593 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -8,15 +8,6 @@ javax.faces.CONFIG_FILES /META-INF/context.xml - - Faces Servlet - javax.faces.webapp.FacesServlet - 1 - - - Faces Servlet - *.xhtml - diff --git a/src/main/webapp/comments.jsp b/src/main/webapp/comments.jsp index fddb218..5bc9623 100644 --- a/src/main/webapp/comments.jsp +++ b/src/main/webapp/comments.jsp @@ -2,87 +2,74 @@ Created by JetBrains IntelliJ IDEA. User: Dragon1573 Date: 2019/12/12 ---%> - - +--%> <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ page isELIgnored="false" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - - - - - - - - - - <% - request.setCharacterEncoding("UTF-8"); - response.setCharacterEncoding("UTF-8"); - response.setContentType("text/html; charset=UTF-8"); - %> - - 评论区 - 佛大云服务 - - ${param.user} - 佛大云服务 - - - - - -
-
- -
- - - - - - - - - - -
-
- - + + + + + + + + + + <% + request.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/html; charset=UTF-8"); + %> + + 评论区 - 佛大云服务 + + ${param.user} - 佛大云服务 + + + +
+
+ +
+ + + + + + + + + + +
+
+
@@ -119,31 +106,30 @@
- 登录 - -
-
-
-

评论列表

-
- - - - - - -
+ 登录 + +
+ +
+

评论列表

+
+ + + + + + +
+
-
- - - + + diff --git a/src/main/webapp/details.jsp b/src/main/webapp/details.jsp index 81b0a5b..dc2db78 100644 --- a/src/main/webapp/details.jsp +++ b/src/main/webapp/details.jsp @@ -2,9 +2,7 @@ Created by JetBrains IntelliJ IDEA. User: Dragon1573 Date: 2019/12/12 ---%> - - +--%> <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ page isELIgnored="false" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> @@ -12,192 +10,181 @@ <%@ page import="java.util.Objects" %> <%@ page import="com.alibaba.fastjson.JSONObject" %> <%@ page import="utils.Connector" %> -<% - request.setCharacterEncoding("UTF-8"); +<%request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); - Connector connector = new Connector(); - final JSONObject object = connector.getComments(request.getParameter("timestamp")); - final boolean[] authorized = {certificate.isVerified() && !"Anonymous".equals( - certificate.getUsername()), Objects.equals(certificate.getUsername(), - object.getString("Sender") - )}; -%> + final JSONObject object = Connector.getComments(request.getParameter("timestamp")); + final boolean[] authorized = { + certificate.isVerified() && !"Anonymous".equals(certificate.getUsername()), Objects.equals( + certificate.getUsername(), object.getString("Sender")) + };%> + + + + + + + + 评论详情 - 佛大云服务 + - - + p { + padding: 5px 0; + font-size: larger; + } - -
-
- -
- - - - - - - - - - -
-
- -
- - - -
-
- 登录 -
-
-
-
-

评论详情

-
-
-
- - - - - - - - - - - - - - - -
用户名: - <%=object.getString("Sender")%> -
标题: - <%=object.getString("Title")%> -
内容: - <%=object.getString("Details")%> -
- - - -
- -
-
-
+ + + 登录 + +
+ +
+

评论详情

+
+
+
+ + + + + + + + + + + + + + + +
用户名: + <%=object.getString("Sender")%> +
标题: + <%=object.getString("Title")%> +
内容: + <%=object.getString("Details")%> +
+ + + +
+ +
+
+
+
-
- - - + + diff --git a/src/main/webapp/files.jsp b/src/main/webapp/files.jsp index 2d6bb01..f1b4cc1 100644 --- a/src/main/webapp/files.jsp +++ b/src/main/webapp/files.jsp @@ -2,9 +2,7 @@ Created by JetBrains IntelliJ IDEA. User: Dragon1573 Date: 2019/12/9 ---%> - - +--%> <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ page isELIgnored="false" %> <%@ page import="java.util.Enumeration" %> @@ -12,102 +10,91 @@ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - - - - - - - - - 仓库详情 - ${param.user}/${param.repo} - + 仓库详情 - ${param.user}/${param.repo} + + <%// 设置请求编码方式 + request.setCharacterEncoding("UTF-8"); + // 获取属性迭代器 + Enumeration enumeration = request.getAttributeNames(); + while (enumeration.hasMoreElements()) { + // 清空属性 + request.removeAttribute(enumeration.nextElement()); } - - <% - // 设置请求编码方式 - request.setCharacterEncoding("UTF-8"); - // 获取属性迭代器 - Enumeration enumeration = request.getAttributeNames(); - while (enumeration.hasMoreElements()) { - // 清空属性 - request.removeAttribute(enumeration.nextElement()); - } - Connector connector = new Connector(); - request.setAttribute("array", connector.listFiles( - request.getParameter("user"), - request.getParameter("repo"), - request.getParameter("path") - )); - // 设置相应编码方式 - response.setCharacterEncoding("UTF-8"); - response.setContentType("text/html; charset=UTF-8"); - %> - - - -
-
- -
- - - - - - - - - - -
-
- - + request.setAttribute( + "array", + Connector.listFiles(request.getParameter("user"), request.getParameter("repo"), request.getParameter("path")) + ); + // 设置相应编码方式 + response.setCharacterEncoding("UTF-8"); + response.setContentType("text/html; charset=UTF-8");%> + + +
+
+ +
+ + + + + + + + + + +
+
+
@@ -144,73 +131,54 @@
- 登录 - -
-
-
-

${param.user}/${param.repo}

-
- - - - - - - 登录 + + + +
+

${param.user}/${param.repo}

+
+
- - - - - ${file.Name} - - - - - - ${file.Name} - - - - -
+ + + + + + - - - - - - -
+ + ${file.Name} + + ${file.Name} + + - - 递归删除 - - -
+ + + 递归删除 + + + + + + + + +
-
- - - + + diff --git a/src/main/webapp/js/encrypt.js b/src/main/webapp/js/encrypt.js deleted file mode 100644 index 9d28c01..0000000 --- a/src/main/webapp/js/encrypt.js +++ /dev/null @@ -1,22 +0,0 @@ -/* - * @author Dragon1573 - * @date 2020/11/9 - */ -import 'bootstrap/jquery.min'; -import 'bootstrap/md5.min'; - -/** - * 使用 SHA 对密码进行加密 - */ -function encryptPassword() { - let userData = $('form'); - let password = userData.find('#password'); - let confirm = userData.find('#confirm'); - let encPass = b64_hmac_md5(password, password); - password.value = encPass; - if (confirm !== undefined) { - confirm.value = encPass; - } - userData.submit(); -} - diff --git a/src/main/webapp/js/platform.js b/src/main/webapp/js/platform.js index df01644..284cebc 100644 --- a/src/main/webapp/js/platform.js +++ b/src/main/webapp/js/platform.js @@ -3,501 +3,6 @@ * @date 2019/7/22 */ -/** - * 用户改名确认 - */ -function acceptWarning() { - alert("您已确认修改用户名,我们不对修改用户名产生的任何问题负责!"); - $("p#warning").hide(); - $("form#change_username").show(); - $("button#accept_warning").hide(); -} - -/** - * 落雪效果 - */ -function snow() { - $("body").append(''); - let b = $("#christmasCanvas")[0]; - let a = b.getContext("2d"); - let d = window.innerWidth; - let c = window.innerHeight; - let e; - b.width = d; - b.height = c; - for (e = [], b = 0; b < 70; b++) { - e.push({ - x: Math.random() * d, - y: Math.random() * c, - r: Math.random() * 4 + 1, - d: Math.random() * 70 - }); - } - let h = 0; - window.intervral4Christmas = setInterval( - function () { - let f; - a.clearRect(0, 0, d, c); - a.fillStyle = "rgba(255, 255, 255, 0.6)"; - a.shadowBlur = 5; - a.shadowColor = "rgba(255, 255, 255, 0.9)"; - a.beginPath(); - for (let b = 0; b < 70; b++) { - f = e[b]; - a.moveTo(f.x, f.y); - a.arc(f.x, f.y, f.r, 0, Math.PI * 2, true); - } - a.fill(); - h += 0.01; - for (let b = 0; b < 70; b++) { - f = e[b]; - f.y += Math.cos(h + f.d) + 1 + f.r / 2; - f.x += Math.sin(h) * 2; - if (f.x > d + 5 || f.x < -5 || f.y > c) { - e[b] = b % 3 > 0 ? { - x: Math.random() * d, - y: -10, - r: f.r, - d: f.d - } : Math.sin(h) > 0 ? { - x: -5, - y: Math.random() * c, - r: f.r, - d: f.d - } : { - x: d + 5, - y: Math.random() * c, - r: f.r, - d: f.d - } - } - } - }, 70 - ) -} - -/** - * 绘制Canvas画布 - */ -function drawCanvas() { - canvasObject.clearRect(0, 0, width, height); - q = [ - { - x: 0, - y: height * 0.7 + f - }, - { - x: 0, - y: height * 0.7 - f - } - ]; - while (q[1].x < width + f) { - d(q[0], q[1]); - } -} - -function d(i, j) { - canvasObject.beginPath(); - canvasObject.moveTo(i.x, i.y); - canvasObject.lineTo(j.x, j.y); - let k = j.x + (Math.random() * 2 - 0.25) * f; - let n = y(j.y); - canvasObject.lineTo(k, n); - canvasObject.closePath(); - let r = u / 50; - canvasObject.fillStyle = "#" + (Math.cos(r) * 127 + 128 << 16 | Math.cos(r + u / 3) * 127 + 128 << 8 | Math.cos(r + u / 3 * 2) * 127 + 128).toString(16); - canvasObject.fill(); - q[0] = q[1]; - q[1] = { - x: k, - y: n - }; -} - -function y(p) { - let t = p + (Math.random() * 2 - 1.1) * f; - return (t > height || t < 0) ? y(p) : t; -} - -/** - * 对用户进行检查 - * - * @param username 用户名 - */ -function checkUser(username) { - // 设置ajax - $.ajax({ - /* 开始:以下内容用于建立服务器请求 */ - // 服务器地址 - url: "/JSP_Design/check?username=" + username.value, - // 数据传输方法 - type: "GET", - dataType: "json", - /* 结束:以上内容用于建立服务器请求 */ - - // 回调函数 - success: function (serverResponse) { - if (username.value === "") { - // 无输入 - $("#errorMessage").hide(); - $("#question").hide(); - $("#answer").hide(); - } else if (serverResponse["FLAG"] !== "DUPLICATE") { - // 存在异常 - if (serverResponse["FLAG"] === "UNIQUE") { - // 用户不存在 - $("#errorMessage").html("错误:用户不存在").show(); - } else { - // 无密保问题 - $("#errorMessage").html( - "错误:未设置密保,请联系管理员!").show(); - } - $("#question").hide(); - $("#answer").hide(); - } else { - // 没有异常 - $("#question").html("密保问题:" + - serverResponse["QUESTION"]).show(); - $("#answer").show(); - $("#errorMessage").hide(); - } - }, - - // 异常处理函数 - error: function () { - alert("错误:请求页面异常!"); - } - }) -} - -/** - * 刷新评论 - */ -function fetchComments(username) { - $.ajax({ - url: "/JSP_Design/sync", - type: "GET", - dataType: "json", - data: {"username": username}, - - success: function (response) { - let context = ""; - - // 遍历数组元素 - $.each(response, function (k) { - context += ""; - context += response[k]["SENDER"] + ":"; - if (response[k]["TITLE"].length > 30) { - context += response[k]["TITLE"].substr(0, 30) + "……"; - } else { - context += response[k]["TITLE"]; - } - context += ""; - context += "" + response[k]["DATETIME"] + ""; - }); - - // 空评论过滤 - if (context === "") { - context = "" + - "【系统消息】未获取到任何评论!" + - ""; - } - - $("tbody#comments").html(context); - }, - - error: function () { - alert("错误:服务器连接失败!"); - } - }) -} - -/** - * 发送评论 - * - * @param username 用户名 - * @param title - * @param content - */ -function sendComments(username, title, content) { - if (content === "" || username === "Anonymous") { - alert("评论内容不能为空!"); - return; - } - - // 通过jQuery Ajax向服务器发送评论 - $.ajax({ - url: "/JSP_Design/sync", - type: "POST", - dataType: "json", - data: { - "user": username, - "title": title, - "details": content - }, - - success: function (response) { - alert((response["FLAG"] === true) ? "发送成功!" : "发送失败!"); - fetchComments("username"); - $("button#reset").click(); - }, - error: function () { - alert("发送失败,请重试……"); - fetchComments("username"); - } - }); -} - -/** - * 删除代码仓库 - * - * @param username 用户名 - * @param old_name 旧名称 - */ -function deleteRepositories(username, old_name) { - let checked = confirm( - "【警告】\n" + - "删除仓库是一个具有危险性的操作,一旦执行将不可撤销。\n" + - "您确认要删除仓库?" - ); - if (checked) { - $.ajax({ - url: "/JSP_Design/repositories", - type: "POST", - dataType: "json", - data: { - "method": "delete", - "username": username, - "new_name": null, - "old_name": old_name - }, - success: function (response) { - if (response["SUCCESS"]) { - alert("删除成功!"); - } else { - alert("错误:删除失败!"); - } - fetchRepositories(true, username); - }, - error: function () { - alert("错误:服务器连接异常!"); - fetchRepositories(true, username); - } - }); - } -} - -/** - * 重命名仓库 - * - * @param username 用户名 - * @param oldName 旧名称 - */ -function renameRepositories(username, oldName) { - // 获取表格 - let $tbody = $("tbody#repositories"); - // 对于每一行 - $tbody.children().each(function () { - // 获取第一列jQuery对象 - let $td = $(this).children().first(); - // 获取仓库全名 - let content = $td.text(); - // 截取仓库名 - let repoName = content.substr(content.indexOf("/") + 1); - - // 设置HTML内容 - $td.html(""); - $td.children().val(repoName); - - // 切换按钮选项及按钮事件 - $td.next().children().text("确定").unbind("click").click("click", function () { - $.ajax({ - url: "/JSP_Design/repositories", - type: "POST", - dataType: "json", - data: { - "method": "rename", - "username": username, - "new_name": $td.children().val(), - "old_name": oldName - }, - success: function (response) { - if (response["SUCCESS"]) { - alert("重命名成功!"); - } else { - alert("错误:重命名失败!"); - } - fetchRepositories(true, username); - }, - error: function () { - alert("错误:服务器连接异常!"); - fetchRepositories(true, username); - } - }); - }); - $td.next().next().children().text("取消").unbind("click").click(function () { - fetchRepositories(true, username); - }); - }); -} - -/** - * 刷新仓库列表 - * - * @param isPrivate 是否为隐私状态 - * @param username 用户名 - */ -function fetchRepositories(isPrivate, username) { - $.ajax({ - url: "/JSP_Design/repositories", - type: "GET", - dataType: "json", - data: {"username": username}, - - success: function (response) { - // 获取列表对象 - let $tbody = $("tbody#repositories"); - $tbody.empty(); - $.each(response, function (k) { - // 插入新元素 - let $tr = $(""); - $tr.append(""); - $tr.children("td.column1").append( - "" - ); - $tr.children("td.column1").children("a").html( - response[k]["USERNAME"] + "/" + response[k]["REPOSITORY"] - ); - - // 权限控制 - if (isPrivate) { - $tr.append( - "", - "" - ); - $tr.children("td.column2").append( - "重命名" - ); - $tr.children("td.column3").append( - "删除" - ); - $tr.find("a.rename").on( - "click", - function () { - renameRepositories(username, response[k]["REPOSITORY"]); - } - ); - $tr.find("a.delete").on( - "click", - function () { - deleteRepositories(username, response[k]["REPOSITORY"]); - } - ); - } - - $tbody.append($tr); - }); - - if ($tbody.html() === "") { - $tbody.html( - "" + - "" + - "不存在代码仓库!" + - "" + - "" - ); - } - }, - - error: function () { - alert("错误:服务器连接失败!"); - } - }) - ; -} - -/** - * 使用jQuery实现Ajax局部刷新 - * - * @param username 用户名 - */ -function uniqueCheck(username) { - $.ajax({ - url: "/JSP_Design/check?username=" + username.value, - type: "GET", - dataType: "json", - - // 回调函数 - success: function (serverResponse) { - if (serverResponse["FLAG"] === "UNIQUE" || username.value === "") { - // 无输入或用户唯一 - $("p#unique").hide(); - } else { - $("p#unique").show(); - } - }, - - // 异常处理函数 - error: function () { - alert("错误:请求页面异常!"); - } - }); -} - -/** - * 密码匹配校验 - * - * @param password 密码 - * @param confirm 确认密码 - */ -function confirmCheck(password, confirm) { - /** - * jQuery选择器在每一次进行选择的时候 - * 都会在整个页面重新搜索元素 - * 官方API文档建议用变量存储 - */ - if (password.value === "" || confirm.value === "" || - password.value === confirm.value) { - // 未输入密码或密码相同 - $("p#difference").hide(); - } else { - // 密码存在差异 - $("p#difference").show(); - } -} - -/** - * 更新用户信息 - * - * @param fields 信息字段 - * @param newProfile 新数据 - * @param oldProfile 旧数据 - */ -function updateProfile(fields, newProfile, oldProfile) { - $.ajax({ - url: "/JSP_Design/settings", - method: "POST", - data: { - "fields": fields, - "news": newProfile.value, - "old": oldProfile.value, - }, - dataType: "json", - - success: function (response) { - if (response["SUCCESS"]) { - alert("信息更新成功!"); - window.location.reload(); - } else { - alert("错误:信息更新失败,请重试!"); - } - }, - error: function () { - alert("错误:服务器连接异常!"); - } - }); -} +/* @formatter:off */ +function acceptWarning(){alert("您已确认修改用户名,我们不对修改用户名产生的任何问题负责!"),$("p#warning").hide(),$("form#change_username").show(),$("button#accept_warning").hide()}function snow(){$("body").append('');let e,t=$("#christmasCanvas")[0],n=t.getContext("2d"),a=window.innerWidth,r=window.innerHeight;for(t.width=a,t.height=r,e=[],t=0;t<70;t++)e.push({x:Math.random()*a,y:Math.random()*r,r:4*Math.random()+1,d:70*Math.random()});let s=0;window.intervral4Christmas=setInterval(function(){let t;n.clearRect(0,0,a,r),n.fillStyle="rgba(255, 255, 255, 0.6)",n.shadowBlur=5,n.shadowColor="rgba(255, 255, 255, 0.9)",n.beginPath();for(let a=0;a<70;a++)t=e[a],n.moveTo(t.x,t.y),n.arc(t.x,t.y,t.r,0,2*Math.PI,!0);n.fill(),s+=.01;for(let n=0;n<70;n++)(t=e[n]).y+=Math.cos(s+t.d)+1+t.r/2,t.x+=2*Math.sin(s),(t.x>a+5||t.x<-5||t.y>r)&&(e[n]=n%3>0?{x:Math.random()*a,y:-10,r:t.r,d:t.d}:Math.sin(s)>0?{x:-5,y:Math.random()*r,r:t.r,d:t.d}:{x:a+5,y:Math.random()*r,r:t.r,d:t.d})},70)}function drawCanvas(){for(canvasObject.clearRect(0,0,width,height),q=[{x:0,y:.7*height+f},{x:0,y:.7*height-f}];q[1].xheight||t<0?y(e):t}function checkUser(e){$.ajax({url:"/JSP_Design/check?username="+e.value,type:"GET",dataType:"json",success:function(t){""===e.value?($("#errorMessage").hide(),$("#question").hide(),$("#answer").hide()):"DUPLICATE"!==t["FLAG"]?("UNIQUE"===t["FLAG"]?$("#errorMessage").html("错误:用户不存在").show():$("#errorMessage").html("错误:未设置密保,请联系管理员!").show(),$("#question").hide(),$("#answer").hide()):($("#question").html("密保问题:"+t["QUESTION"]).show(),$("#answer").show(),$("#errorMessage").hide())},error:function(){alert("错误:请求页面异常!")}})}function fetchComments(e){$.ajax({url:"/JSP_Design/sync",type:"GET",dataType:"json",data:{username:e},success:function(e){let t="";$.each(e,function(n){t+="",t+=e[n]["SENDER"]+":",e[n]["TITLE"].length>30?t+=e[n]["TITLE"].substr(0,30)+"……":t+=e[n]["TITLE"],t+="",t+=""+e[n]["DATETIME"]+""}),""===t&&(t=""+"【系统消息】未获取到任何评论!"+""),$("tbody#comments").html(t)},error:function(){alert("错误:服务器连接失败!")}})}function sendComments(e,t,n){""!==n&&"Anonymous"!==e?$.ajax({url:"/JSP_Design/sync",type:"POST",dataType:"json",data:{user:e,title:t,details:n},success:function(e){alert(!0===e["FLAG"]?"发送成功!":"发送失败!"),fetchComments("username"),$("button#reset").click()},error:function(){alert("发送失败,请重试……"),fetchComments("username")}}):alert("评论内容不能为空!")}function deleteRepositories(e,t){confirm("【警告】\n"+"删除仓库是一个具有危险性的操作,一旦执行将不可撤销。\n"+"您确认要删除仓库?")&&$.ajax({url:"/JSP_Design/repositories",type:"POST",dataType:"json",data:{method:"delete",username:e,new_name:null,old_name:t},success:function(t){t["SUCCESS"]?alert("删除成功!"):alert("错误:删除失败!"),fetchRepositories(!0,e)},error:function(){alert("错误:服务器连接异常!"),fetchRepositories(!0,e)}})}function renameRepositories(e,t){$("tbody#repositories").children().each(function(){let n=$(this).children().first(),a=n.text(),r=a.substr(a.indexOf("/")+1);n.html(""),n.children().val(r),n.next().children().text("确定").unbind("click").click("click",function(){$.ajax({url:"/JSP_Design/repositories",type:"POST",dataType:"json",data:{method:"rename",username:e,new_name:n.children().val(),old_name:t},success:function(t){t["SUCCESS"]?alert("重命名成功!"):alert("错误:重命名失败!"),fetchRepositories(!0,e)},error:function(){alert("错误:服务器连接异常!"),fetchRepositories(!0,e)}})}),n.next().next().children().text("取消").unbind("click").click(function(){fetchRepositories(!0,e)})})}function fetchRepositories(e,t){$.ajax({url:"/JSP_Design/repositories",type:"GET",dataType:"json",data:{username:t},success:function(n){let a=$("tbody#repositories");a.empty(),$.each(n,function(r){let s=$("");s.append(""),s.children("td.column1").append(""),s.children("td.column1").children("a").html(n[r]["USERNAME"]+"/"+n[r]["REPOSITORY"]),e&&(s.append("",""),s.children("td.column2").append("重命名"),s.children("td.column3").append("删除"),s.find("a.rename").on("click",function(){renameRepositories(t,n[r]["REPOSITORY"])}),s.find("a.delete").on("click",function(){deleteRepositories(t,n[r]["REPOSITORY"])})),a.append(s)}),""===a.html()&&a.html(""+""+"不存在代码仓库!"+""+"")},error:function(){alert("错误:服务器连接失败!")}})}function uniqueCheck(e){$.ajax({url:"/JSP_Design/check?username="+e.value,type:"GET",dataType:"json",success:function(t){"UNIQUE"===t["FLAG"]||""===e.value?$("p#unique").hide():$("p#unique").show()},error:function(){alert("错误:请求页面异常!")}})}function confirmCheck(e,t){""===e.value||""===t.value||e.value===t.value?$("p#difference").hide():$("p#difference").show()}function updateProfile(e,t,n){$.ajax({url:"/JSP_Design/settings",method:"POST",data:{fields:e,news:t.value,old:n.value},dataType:"json",success:function(e){e["SUCCESS"]?(alert("信息更新成功!"),window.location.reload()):alert("错误:信息更新失败,请重试!")},error:function(){alert("错误:服务器连接异常!")}})} +/* @formatter:on */ diff --git a/src/main/webapp/login.jsp b/src/main/webapp/login.jsp index c39772e..5844451 100644 --- a/src/main/webapp/login.jsp +++ b/src/main/webapp/login.jsp @@ -1,14 +1,20 @@ <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - + 用户登录 - + + +
@@ -24,7 +30,7 @@
登陆失败:用户名或密码错误!
- +
diff --git a/src/main/webapp/private/reset.jsp b/src/main/webapp/private/reset.jsp index 03245dd..8b9627e 100644 --- a/src/main/webapp/private/reset.jsp +++ b/src/main/webapp/private/reset.jsp @@ -12,8 +12,13 @@ + - + 重置密码 @@ -29,7 +34,7 @@ <%-- 提交 --%> - +
diff --git a/src/main/webapp/private/security.jsp b/src/main/webapp/private/security.jsp index 7bfa1fa..96d8f98 100644 --- a/src/main/webapp/private/security.jsp +++ b/src/main/webapp/private/security.jsp @@ -16,7 +16,11 @@ - + 用户设置 diff --git a/src/main/webapp/signUp.jsp b/src/main/webapp/signUp.jsp index c434e8a..82f8563 100644 --- a/src/main/webapp/signUp.jsp +++ b/src/main/webapp/signUp.jsp @@ -9,8 +9,13 @@ 新用户注册 + - +
@@ -38,10 +43,10 @@
- - -

注册失败,请稍后重试……

-
+ + <%--@elvariable id="error" type="java.lang.String"--%> +

注册失败,请稍后重试……

+