博客管理系统--博客详情页、登录页

news2024/12/24 8:48:50

    • 登录页
    • 实现强制登录

URL解决后;现在到查看全文按钮。我们点击这个查看全文我们就跳转到博客详情页。
在这里插入图片描述
我们希望就是在这个页面;把这些写死的数据换成从后端获取的。
在这里插入图片描述
1:约定前后端交互接口
请求:GET /blog?blogId=1 (这样子写和博客列表页是同一个绑定的路径;还是同一个方法;但是我们会判断如果URL里有query string就返回博客详情页内容;否则返回博客列表页内容。这里新绑定一个路径也无所谓;只是这两个要响应结果比较相似;也能方便不少)但是我还是试试在不同路径下的写法;分离开降低点耦合。

响应:
HTTP/1.1 200OK

{
blogId:1,
title:“这是第一篇博客”
content :“第一次变成这样子的我;让我怎么否认”,
postTime:“2023-5-7 21:23”,
userId :1

}

2:实现后端代码;这会就不需要截断文章内容。query string可以用这个方法根据key获取val。我们就轻松拿到这个blogId。(我们在博客列表页前端并不需要传数据;如果前端是以json格式传数据;还是比较麻烦处理的。query string的接收就比较方便)

在这里插入图片描述

这里还得处理一下:query string是null;返回并没有问题;但是null字符串转成int就报错了。
但是这样子在后台打印的处理并不满意;因为用户看不到是什么情况;希望返回错误页面提示说没有这篇博客id的博客。但是这样子不好弄
ajax发的数据想要重定向还是比较麻烦;不像form表单、a标签是支持的。
两种方案:
一:我构造一个json数据;当blogId=null或者查不到博客时就返回这个对象。这个对象里面的内容提示说blogId=null或者查不到博客;本来正常跳转是不会出现查不到的情况;但是有时候博客太多;需要手动在地址栏搜索。避免出现这种情况
在这里插入图片描述
二:或者在前端代码逻辑改变一下;当查不到东西就返回null给前端。前端解析到null;使用location.assign(‘错误页面.html’)跳转到错误页面。错误页面还得我们自己实现;所以才有各种网站的错误页面的各不相同的。

3:实现前端代码
参照这个我们之前写死格式进行构造
在这里插入图片描述

url:‘blogdetail’+location.search,这里的location.search是js一个全局对象;获取浏览器地址栏的query string。直接拼接?blogId=3;问号都不用我们自己写
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

登录页

在这里插入图片描述
这里就使用form表单的方式:登录页是要跳转的;因为ajax没法直接返回302跳转这么方便;还得其它写法.form本身就是会触发页面跳转。
三步走:
1:前后端交互接口
请求 POST /login

username=zhangsan&password=123

响应
HTTP/1.1 302
Location:blog_list.html

2:修改前端代码
在这里插入图片描述
这里的id是选择器;前面引入的css文件里有;选择这些框的样式;name属性是获取这个框的内容;把它赋值于这个name名字;username=zhangsan ,password=123。

3:后端代码
先读取传过来的用户名和密码;然后看看能否在数据库中查询到
String username=req.getParameter(“username”);
String password=req.getParameter(“password”);

form读取还是比较方便的;不像json需要转来转去;但是这里读取的是英文还好;如果是中文就乱码了。所以需要设置读取的。
一个请求在设置;一个是响应在设置;理解请求和构造响应(告诉浏览器要怎么理解这个编码)。响应类型是一个页面也设置上;方便我们在登录错误的时候返回一个服务器构造页面提示登录失败
req.setCharacterEncoding(“utf8”);
resp.setContentType(“text/html;charset=utf8”);

注意这两段逻辑:不要写明确是用户错误还是密码错误;比如有个人随便输入一个用户名和密码;结果提示密码错误;那么它就搞个程序;循环遍历输入密码;那不就能找到你的密码吗。
在这里插入图片描述

后端代码完成:

package api;

import model.User;
import model.UserDao;

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;

@WebServlet("/login")
public class Blog_loginServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf8");
        resp.setContentType("text/html;charset=utf8");
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        //空或者空字符串
        if(username == null || "".equals(username) || password == null || "".equals(password)){
       // 登录失败;这时候就可以返回一个登录失败的页面
            String html = "<h3>登录失败! 缺少 username 或者 password 字段</h3>";
            resp.getWriter().write(html);
            return;

        }
        //看看用户名和密码是否匹配;如果不匹配;还是登录失败
        UserDao userDao=new UserDao();
        User user=userDao.selectByUsername(username);
        //数据库查不到这个用户
        if(user==null){
            String html = "<h3>登录失败! 缺少 username 或者 password 字段</h3>";
            resp.getWriter().write(html);
            return;


        }
          if (!password.equals(user.getPassword())) {
            // 密码不对
            String html = "<h3>登录失败! 用户名或密码错误</h3>";
            resp.getWriter().write(html);
            return;
        }
          //  登录成功;创建会话;然后使用该会话保存用户信息
        HttpSession session=req.getSession(true);
        session.setAttribute("user",user);

        // 重定向到博客列表页
        resp.sendRedirect("blog_list.html1.html");
    }
}

数据库创建几个用户登录测试一下:
在这里插入图片描述
强制刷新:ctrl+F5;有时候我们修改代码后重新输入URL发现内容还是原来的。浏览器的缓冲导致的。因为这个操作费时等;操作一次后浏览器就给你缓存下来;然后你再操作就直接取缓存的结果。类似多线程内存可见性问题。频繁的读到的结果一样;它就保存下来;不再去反复去读;而是直接用这个值。强制刷新无视本地缓存。

实现强制登录

当用户访问博客列表页/详情页/编辑页都要求是已登录状态;登录才能用;你自己修改自己的。你总不能改人家的吧。
还是在登录页上实现:
GET /login

HTTP/1.1 200 OK (响应把当前的登录用户信息返回;如果未登录就返回一个userId=0)
{
userId :1
username:‘zhangsan’

}
在这里插入图片描述

前端代码:
就是说访问每一个页面代码都会执行到这样的一个函数;然后发送这个ajax构建的get请求;然后就查看一下是否登录;登录就啥都不干;如果发现是未登录就强制跳转登录页。这段逻辑给博客列表、详情页、编辑页都加上
在这里插入图片描述

正常下重启服务器就得重新登录;如果服务器重启登录后;浏览器还是登录状态;这种是插件搞怪。有的tomcat插件版本会方便调试在关闭服务器的时候;把session持久化保存;在重启的时候自动恢复。war包形式是不会出现这种问题;也可以修改配置实现这种效果。这个会话我们也能用数据库持久化保存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/515981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

总结848

学习目标&#xff1a; 月目标&#xff1a;5月&#xff08;张宇强化前10讲&#xff0c;背诵15篇短文&#xff0c;熟词僻义300词基础词&#xff09; 周目标&#xff1a;张宇强化前3讲并完成相应的习题并记录&#xff0c;英语背3篇文章并回诵 每日必复习&#xff08;5分钟&#…

【连续介质力学】向量

向量的代数操作 加法 a ⃗ \vec a a , b ⃗ \vec b b 为任意向量 c ⃗ a ⃗ b ⃗ b ⃗ a ⃗ \vec c \vec a \vec b \vec b \vec a c a b b a 减法 d ⃗ a ⃗ − b ⃗ \vec d \vec a- \vec b d a −b 标量乘法 λ a ⃗ \lambda \vec a λa , 与 a ⃗ \vec a a 相同…

ubuntu18 使用matplotlib画图

一、安装virtualenvwrapper 1.确认virtualenvwrapper是否已安装&#xff1a; 打开Termianl终端&#xff0c;执行指令&#xff1a;which virtualenvwrapper.sh查询virtualenvwrapper.sh的路径&#xff0c;如果没有提示&#xff0c;则表明virtualenvwrapper.sh没有安装。 2.安…

Codeforces Round 871 (Div. 4) G 记忆化搜索+二分 你没见过的解法!

G. Hits Different 记dp数组为答案数组 首先 dp[2] 2 2 2^2 22 1 2 1^2 12 dp[3] 3 2 3^2 32 1 2 1^2 12 dp[5] 2 2 2^2 22 3 2 3^2 32 1 2 1^2 12 不难发现dp[5]dp[2]dp[3]-dp[1] 同理dp[25]dp[18]dp[19]-dp[13] 接下来就是愉快的找公式时间 观察到题目中给的每一层塔的级数 (…

Notion AI 进阶【help me write】

对于Notion Ai来说,尽管一直在不断发展&#xff0c;但似乎人们还沉浸在Chat Gpt带来的狂欢&#xff0c;但如果你是国内用户&#xff0c;Notion AI所能提供的是远远大于限制过多的GPT&#xff0c;本篇讲一讲在Notion AI中help me write的使用 在这周我把Notion ai接入到Discord…

PostgresML - PostgreSQL的生成式AI扩展

PostgresML 是 PostgreSQL 的机器学习扩展&#xff0c;支持生成式AI&#xff0c;使你能够使用 SQL 查询对文本和表格数据执行训练和推理。 借助 PostgresML&#xff0c;你可以将机器学习模型无缝集成到你的 PostgreSQL 数据库中&#xff0c;并利用尖端算法的强大功能来高效地处…

【Python数据类型-集合】------- PYTHON基础14

内容目录 一、 集合1. 集合创建1.1. 创建集合1.2. 创建空集合 2. 集合基本操作2.1. add()添加新的元素 set1.add(element)2.2.remove()删除元素 set1.remove(element)2.3.discard()删除元素 set1.discard(element)2.4.clear()清空集合里的所有元素 set1.clear() 3. 集合与列表、…

介绍10款ChatGPT替代产品

ChatGPT 引领着聊天 AI 的世界&#xff0c;许多人已经开始在日常生活中使用它。OpenAI 的 GPT-3 语言模型是聊天机器人的基础&#xff0c;它使得用户能够通过回答问题与 AI 进行交互。 GPT-4 的引入为机器人提供了更强大的功能。然而&#xff0c;它也有一个明显的缺点&#xff…

09-HTML-表格标签(合并单元格)

标签描述<table>定义表格<caption>定义表格标题。<th>定义表格中的表头单元格。<tr>定义表格中的行。<td>定义表格中的单元。<thead>定义表格中的表头内容。<tbody>定义表格中的主体内容。<tfoot>定义表格中的表注内容&#x…

API数据接口可以从几个不同的角度来看待;

一.API数据接口可以从几个不同的角度来看待&#xff1a; 1. 技术角度&#xff1a;API数据接口是一种技术实现&#xff0c;通常是以HTTP协议或其他网络协议为基础&#xff0c;并采用特定的数据格式&#xff08;如JSON或XML&#xff09;来传递数据。 2. 业务角度&#xff1a;API数…

Ubuntu22.04安装PyTorch1.12.1 GPU版本

目录 一、电脑相关信息 1. 电脑显卡环境&#xff1a; 二、安装Pytorch1.12.1/cu116&#xff08;GPU版本&#xff09; 1. 准备&#xff1a;新建虚拟环境 2. 方式一&#xff1a;用pip在线安装torch1.12.1cu116、torchvision0.13.1cu116&#xff1a;&#xff08;在pytorch官网…

堆的实现,以及画图和代码分析,建堆,堆排序,时间复杂度的分析

堆的实现 堆的概念及结构堆的实现初始化销毁返回堆顶元素判空有效数据个数 堆的插入&#xff08;向上调整算法&#xff09;删除堆顶元素&#xff0c;仍然保持堆的形态&#xff08;向下调整算法&#xff09;堆的创建向上调整法建堆向下调整建堆两种建堆方法时间复杂度向下调整法…

shell脚本之数值,冒泡排序算法

目录 一、数组 1.定义数组 2. 数组中数据类型 2.1数值类型 2.2字符类型 二、数组的用法 1. 输出数组中的值 2. 统计数组参数个数 ​编辑 3.查看数组下标列表 4.分割字符串 5.替换数组中的字符 6.删除数组 三、数组追加元素 1.方法1示例 2.方法2示例 3.方法3示例 …

Notion Ai中文指令使用技巧

Notion AI 是一种智能技术&#xff0c;可以自动处理大量数据&#xff0c;并从中提取有用的信息。它能够 智能搜索&#xff1a;通过搜索文本和查询结果进行快速访问 自动归档&#xff1a;可以根据关键字和日期自动将内容归档 内容分类&#xff1a;可以根据内容的标签和内容的…

【嵌入式Linux】MBR分区表 和 GPT分区表

文章目录 GUID以及分区表MBR分区方案GPT 分区方案GPT分区表结构 GPT分区表LBALBA0LBA1LBA 2-33python生成GPT分区表gpt分区表实例 gpt分区表查看查看百问网T113-s3固件查看友善之臂nanopi-m1-plus官方固件查看荣品RV1126固件查看f1c200s固件查看V3s的SD启动卡 原文&#xff1a;…

session和Filter

session 介绍 jsp利用servlet提供的HttpSession接口识别一个用户&#xff0c;存储这个用户的所有访问信息。默认情况下&#xff0c;jsp允许会话跟踪&#xff0c;一个新的HttpSession对象将会自动地为新的客户端实例化。禁止会话跟踪需要关掉它&#xff0c;通过将page指令中ses…

多模态:BLIP-2论文讲解

多模态&#xff1a;BLIP-2论文讲解 IntroductionMethod第一阶段第二阶段 实验 Introduction 多模态学习在近两年我们已经见证了他的快速发展&#xff0c;由于它是视觉-语言的交叉领域&#xff0c;我们自然地期待可以借助目前风头正盛的LLM来辅助完成多模态任务。 在这篇论文中…

【SAP Abap】X-DOC:SNRO - ABAP流水号应用

【SAP Abap】X-DOC&#xff1a;SNRO - ABAP流水号应用 1、定义表&#xff08;字段域&#xff09;2、定义流水号3、使用流水号4、测试程序 1、定义表&#xff08;字段域&#xff09; 2、定义流水号 Tcode: SNRO/SNUM&#xff0c; 根据以上创建的字段域 YDSNRO&#xff0c;创建对…

grep练习题

题目: 文件格式&#xff1a; 第1列&#xff1a;城市位置编号。 第2列&#xff1a;月份。 第3列&#xff1a;存储代码及出库年份。 第4列&#xff1a;产品代号。 第5列&#xff1a;产品统一标价。 第6列&#xff1a;标识号。 第7列&#xff1a;合格数量。 file.txt文件内容&a…

RabbitMQ入门案例及简单工程搭建

环境的搭建 这里是用Maven工程搭建的基础环境项目&#xff0c;这里的dome_rabbitmq就是父工程。 子工程 publisher&#xff1a;消息发布者&#xff0c;将消息发送到队列queueconsumer&#xff1a;订阅队列&#xff0c;处理队列中的消息 父工程的pom文件依赖 <?xml ver…