鱼C论坛

 找回密码
 立即注册
123
返回列表 发新帖

代码报错

[复制链接]
 楼主| 发表于 2024-6-17 17:38:06 | 显示全部楼层
FishC 发表于 2024-6-17 17:24
为了确保安全性,管理员登录的账号密码通常不会明文存储在代码中。一般情况下,我们会在数据库中预先设 ...

在对论坛编辑时,只能是管理员才可以编辑编辑,你给的代码是无论是谁都可以编辑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-17 17:38:51 | 显示全部楼层
小肥狼haoran 发表于 2024-6-17 17:29
聊的火热,咋样,是标准答案嘛?

还行,还在更改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-17 17:40:49 | 显示全部楼层
豪在这学python 发表于 2024-06-17 17:38
在对论坛编辑时,只能是管理员才可以编辑编辑,你给的 ...


不好意思,刚才可能有些地方没解释清楚。为了确保只有管理员能够编辑帖子,我们需要在后台进行用户权限的校验。

下面我会提供一个简单的示例,展示如何在代码中检测当前用户是否为管理员,并根据结果显示或隐藏编辑和删除按钮。

假设你使用Java Servlet 和 MySQL 构建你的论坛:

### 数据库表结构

假设你的`users`表结构如下:
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(100) NOT NULL,
    is_admin BOOLEAN DEFAULT FALSE
);

在这个表格中,`is_admin`字段决定了用户是否为管理员。

假设你的 `posts` 表结构如下:
CREATE TABLE posts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(100) NOT NULL,
    content TEXT NOT NULL,
    author_id INT,
    FOREIGN KEY (author_id) REFERENCES users(id)
);

### 1. 管理员登录页面 (`admin_login.jsp`)
首先,我们创建一个简单的登录页面:
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>管理员登录</title>
</head>
<body>
    <h1>管理员登录</h1>
    <form action="login" method="post">
        用户名: <input type="text" name="username"><br>
        密码: <input type="password" name="password"><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

### 2. 登录Servlet (`LoginServlet.java`)
编写一个简单的Servlet来处理登录请求:
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 java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        try (Connection conn = Database.getConnection()) {
            String sql = "SELECT id, is_admin FROM users WHERE username = ? AND password = MD5(?)";
            PreparedStatement stmt = conn.prepareStatement(sql);
            stmt.setString(1, username);
            stmt.setString(2, password);
            ResultSet rs = stmt.executeQuery();

            if (rs.next()) {
                int userId = rs.getInt("id");
                boolean isAdmin = rs.getBoolean("is_admin");

                HttpSession session = request.getSession();
                session.setAttribute("userId", userId);
                session.setAttribute("isAdmin", isAdmin);

                response.sendRedirect("forum.jsp");
            } else {
                response.sendRedirect("admin_login.jsp?error=1");
            }
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }
}

### 3. 论坛页面 (`forum.jsp`)
更新`forum.jsp`页面,以确保只有管理员可以看到编辑和删除按钮:
<%@ page import="java.sql.*, javax.servlet.http.*" %>
<%
    HttpSession session = request.getSession();
    Boolean isAdmin = (Boolean) session.getAttribute("isAdmin");
    if (isAdmin == null) isAdmin = false;

    try (Connection conn = Database.getConnection()) {
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT * FROM posts");

        while (rs.next()) {
            int postId = rs.getInt("id");
            String title = rs.getString("title");
            String content = rs.getString("content");
            int authorId = rs.getInt("author_id");

            out.println("<div>");
            out.println("<h2>" + title + "</h2>");
            out.println("<p>" + content + "</p>");
            out.println("<p>作者ID: " + authorId + "</p>");
            if (isAdmin) {
                out.println("<a href='edit_post.jsp?id=" + postId + "'>编辑</a>");
                out.println("<a href='delete_post.jsp?id=" + postId + "'>删除</a>");
            }
            out.println("</div>");
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
%>

### 4. 删除帖子 (`DeletePostServlet.java`)
编写一个简单的Servlet来处理删除帖子:
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 java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;

@WebServlet("/delete_post")
public class DeletePostServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int postId = Integer.parseInt(request.getParameter("id"));

        try (Connection conn = Database.getConnection()) {
            String sql = "DELETE FROM posts WHERE id = ?";
            PreparedStatement stmt = conn.prepareStatement(sql);
            stmt.setInt(1, postId);
            stmt.executeUpdate();

            response.sendRedirect("forum.jsp");
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }
}

### 5. 编辑帖子 (`edit_post.jsp`)
编写编辑帖子的页面:
<%@ page import="java.sql.*" %>
<%
    int postId = Integer.parseInt(request.getParameter("id"));
    String title = "";
    String content = "";

    try (Connection conn = Database.getConnection()) {
        String sql = "SELECT * FROM posts WHERE id = ?";
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.setInt(1, postId);
        ResultSet rs = stmt.executeQuery();

        if (rs.next()) {
            title = rs.getString("title");
            content = rs.getString("content");
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
%>

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>编辑帖子</title>
</head>
<body>
    <h1>编辑帖子</h1>
    <form action="update_post" method="post">
        <input type="hidden" name="id" value="<%= postId %>">
        帖子标题: <input type="text" name="title" value="<%= title %>"><br>
        帖子内容: <textarea name="content"><%= content %></textarea><br>
        <input type="submit" value="保存">
    </form>
</body>
</html>

### 6. 更新帖子 (`UpdatePostServlet.java`)
编写一个简单的Servlet来处理更新帖子:
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 java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;

@WebServlet("/update_post")
public class UpdatePostServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int postId = Integer.parseInt(request.getParameter("id"));
        String title = request.getParameter("title");
        String content = request.getParameter("content");

        try (Connection conn = Database.getConnection()) {
            String sql = "UPDATE posts SET title = ?, content = ? WHERE id = ?";
            PreparedStatement stmt = conn.prepareStatement(sql);
            stmt.setString(1, title);
            stmt.setString(2, content);
            stmt.setInt(3, postId);
            stmt.executeUpdate();

            response.sendRedirect("forum.jsp");
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }
}

### 总结

通过这些代码改动,你可以确保只有登录的管理员用户才会看到并能够使用编辑和删除功能。如果有任何其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-17 17:41:40 | 显示全部楼层
FishC 发表于 2024-6-17 17:40
不好意思,刚才可能有些地方没解释清楚。为了确保只有管理员能够编辑帖子,我们需要在后台进行用户权限 ...

我用的是jsp和mysql
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-17 17:42:38 | 显示全部楼层


了解了,你使用的是JSP和MySQL。针对你的需求,我们在JSP页面和Java后台代码中进行必要的修改,以确保只有管理员可以编辑和删除论坛帖子。

### 数据库设置

假设你已经创建了`users`表和`posts`表:
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(100) NOT NULL,
    is_admin BOOLEAN DEFAULT FALSE
);

CREATE TABLE posts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(100) NOT NULL,
    content TEXT NOT NULL,
    author_id INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (author_id) REFERENCES users(id)
);

-- 创建一个管理员用户
INSERT INTO users (username, password, is_admin) VALUES ('admin', MD5('adminpassword'), TRUE);

### 管理员登录页面 (`admin_login.jsp`)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>管理员登录</title>
    <link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
    <div class="container">
        <h2>管理员登录</h2>
        <form action="login.jsp" method="post">
            用户名: <input type="text" name="username" required>
            密码: <input type="password" name="password" required>
            <input type="submit" value="登录">
        </form>
    </div>
</body>
</html>

### 登录处理 (`login.jsp`)
<%@ page import="java.sql.*" %>
<%@ page import="javax.servlet.http.*, javax.servlet.*" %>
<%
    String username = request.getParameter("username");
    String password = request.getParameter("password");

    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;

    try {
        conn = DBUtil.getConnection();
        String sql = "SELECT id, is_admin FROM users WHERE username = ? AND password = MD5(?)";
        ps = conn.prepareStatement(sql);
        ps.setString(1, username);
        ps.setString(2, password);
        rs = ps.executeQuery();

        if (rs.next()) {
            int userId = rs.getInt("id");
            boolean isAdmin = rs.getBoolean("is_admin");

            HttpSession session = request.getSession();
            session.setAttribute("userId", userId);
            session.setAttribute("isAdmin", isAdmin);

            response.sendRedirect("forum.jsp");
        } else {
            out.println("用户名或密码错误!");
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if (rs != null) rs.close();
        if (ps != null) ps.close();
        if (conn != null) conn.close();
    }
%>

### 论坛页面 (`forum.jsp`)
<%@ page import="java.sql.*" %>
<%@ page import="javax.servlet.http.*, javax.servlet.*" %>
<%
    HttpSession session = request.getSession(false);
    boolean isAdmin = false;
    if (session != null && session.getAttribute("isAdmin") != null) {
        isAdmin = (boolean) session.getAttribute("isAdmin");
    }

    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;

    try {
        conn = DBUtil.getConnection();
        String sql = "SELECT posts.id, posts.title, posts.content, posts.created_at, users.username FROM posts JOIN users ON posts.author_id = users.id ORDER BY posts.created_at DESC";
        stmt = conn.createStatement();
        rs = stmt.executeQuery(sql);
%>
<!DOCTYPE html>
<html>
<head>
    <title>简单论坛</title>
    <link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
    <div class="container">
        <h2>简单论坛</h2>
        <form action="add_post.jsp" method="post" onsubmit="return validateForm();">
            帖子标题: <input type="text" name="title" required>
            帖子内容: <textarea name="content" required></textarea>
            <button type="submit">发表</button>
        </form>
        <h3>帖子列表</h3>
        <% while (rs.next()) { %>
            <div class="post">
                <h3><%= rs.getString("title") %></h3>
                <p><%= rs.getString("content") %></p>
                <small> 发表于: <%= rs.getTimestamp("created_at") %> | 作者: <%= rs.getString("username") %></small>
                <% if (isAdmin) { %>
                    <form action="edit_post.jsp" method="get">
                        <input type="hidden" name="id" value="<%= rs.getInt("id") %>">
                        <button type="submit">编辑</button>
                    </form>
                    <form action="delete_post.jsp" method="post">
                        <input type="hidden" name="id" value="<%= rs.getInt("id") %>">
                        <button type="submit">删除</button>
                    </form>
                <% } %>
            </div>
        <% } %>
    </div>
</body>
</html>
<%
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if (rs != null) rs.close();
        if (stmt != null) stmt.close();
        if (conn != null) conn.close();
    }
%>

### 删除帖子 (`delete_post.jsp`)
<%@ page import="java.sql.*" %>
<%@ page import="javax.servlet.http.*, javax.servlet.*" %>
<%
    int postId = Integer.parseInt(request.getParameter("id"));

    Connection conn = null;
    PreparedStatement ps = null;

    try {
        conn = DBUtil.getConnection();
        String sql = "DELETE FROM posts WHERE id = ?";
        ps = conn.prepareStatement(sql);
        ps.setInt(1, postId);
        ps.executeUpdate();

        response.sendRedirect("forum.jsp");
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if (ps != null) ps.close();
        if (conn != null) conn.close();
    }
%>

### 编辑帖子 (`edit_post.jsp`)
<%@ page import="java.sql.*" %>
<%@ page import="javax.servlet.http.*, javax.servlet.*" %>
<%
    int postId = Integer.parseInt(request.getParameter("id"));

    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;

    try {
        conn = DBUtil.getConnection();
        String sql = "SELECT title, content FROM posts WHERE id = ?";
        ps = conn.prepareStatement(sql);
        ps.setInt(1, postId);
        rs = ps.executeQuery();

        if (rs.next()) {
%>
<!DOCTYPE html>
<html>
<head>
    <title>编辑帖子</title>
    <link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
    <div class="container">
        <h2>编辑帖子</h2>
        <form action="update_post.jsp" method="post">
            <input type="hidden" name="id" value="<%= postId %>">
            帖子标题: <input type="text" name="title" value="<%= rs.getString("title") %>" required>
            帖子内容: <textarea name="content" required><%= rs.getString("content") %></textarea>
            <button type="submit">保存</button>
        </form>
    </div>
</body>
</html>
<%
        } else {
            out.println("找不到指定的帖子!");
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if (rs != null) rs.close();
        if (ps != null) ps.close();
        if (conn != null) conn.close();
    }
%>

### 更新帖子 (`update_post.jsp`)
<%@ page import="java.sql.*" %>
<%@ page import="javax.servlet.http.*, javax.servlet.*" %>
<%
    int postId = Integer.parseInt(request.getParameter("id"));
    String title = request.getParameter("title");
    String content = request.getParameter("content");

    Connection conn = null;
    PreparedStatement ps = null;

    try {
        conn = DBUtil.getConnection();
        String sql = "UPDATE posts SET title = ?, content = ? WHERE id = ?";
        ps = conn.prepareStatement(sql);
        ps.setString(1, title);
        ps.setString(2, content);
        ps.setInt(3, postId);
        ps.executeUpdate();

        response.sendRedirect("forum.jsp");
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if (ps != null) ps.close();
        if (conn != null) conn.close();
    }
%>

### 数据库工具类 (`DBUtil.java`)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBUtil {
    private static final String URL = "jdbc:mysql://localhost:3306/YourDatabaseName?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC";
    private static final String USER = "yourDbUsername";
    private static final String PASSWORD = "yourDbPassword";

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }
}

通过这些代码改动,你现在有了一个支持管理员管理帖子的论坛系统,其中只有管理员可以编辑和删除帖子。调整和运行这些代码后,如果还有任何问题或需要进一步帮助,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-17 17:49:48 | 显示全部楼层
FishC 发表于 2024-6-17 17:42
了解了,你使用的是JSP和MySQL。针对你的需求,我们在JSP页面和Java后台代码中进行必要的修改,以确保 ...

session这个变量已经在作用域中了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-17 17:53:13 | 显示全部楼层
豪在这学python 发表于 2024-6-17 17:49
session这个变量已经在作用域中了

@fishc
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 20:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表