博客系统后端设计(五) - 实现登录页面功能

news/2025/2/4 1:06:36/

文章目录

  • 约定前后端交互接口
  • 修改前段代码
  • 修改后端代码
  • 登录测试

约定前后端交互接口


这里约定请求是一个 POST 请求,路径是 /login,使用的是以下的格式:
usernam=zhangsan&password=123


响应是 HTTP/1.1 302,因为在成功登录之后,会直接跳转到列表页,
因此此时的 Locationblog.list.html

此时的响应要求是 302,因此要使用 form 表单才可以进行页面的跳转;
如果是 ajax 请求,响应是 302 就无法进行跳转了,因为本身不会触发。

修改前段代码


把页面里加上 form 表单,使点击登录的操作能够触发请求。



上述图片圈出的就是要修改的地方。


可以看到上面两个结果是对应起来的。



以上就对应了前端代码中 form 标签里的 actionmethod 属性。

修改后端代码


要先创建一个新的类,起名可以为 loginServlet



上面圈出的是和之前约好的是一样的。


1.读取参数中的用户名和密码

 String username = req.getParameter("username");String password = req.getParameter("password");if (username == null || "".equals(username) || password == null || "".equals(password)) {// 登录失败String html = "<h3>登录失败。缺少用户名或者缺少密码!!!</h3>";resp.getWriter().write(html);return;}


需要注意的是:

如果用户名或者密码包含中文,此时就有可能乱码!!! 此时要设置请求的编码,告诉 Servlet 按照什么格式来理解请求。

 // 设置请求的编码,告诉 Servlet 按照什么格式来理解请求req.setCharacterEncoding("utf8");



2.读数据库,看看用户名是否存在,并且密码是否匹配

UserDao userDao = new UserDao();
User user = userDao.selectByUsername(username);
if (user == null) {// 用户不存在String html = "<h3>登录失败,用户名或密码错误!!!</h3>";resp.getWriter().write(html);return;
}
if (!password.equals(user.getPassword())) {//  密码不匹配String html = "<h3>登录失败,用户名或密码错误!!!</h3>";resp.getWriter().write(html);return;
}



3.用户名密码验证成功,登陆成功,接下来开始创建会话,使用该会话保存用户信息

HttpSession session = req.getSession(true);
session.setAttribute("user", user);


这里 ture 的意思是,存在就查询,不存在就创建新的。

4.进行重定向,跳转到指定的博客列表页

resp.sendRedirect("blog.list.html");


这里的 sendRedirect 方法参数是 列表页的字符串。

登录测试


在数据库中插入几个数据

在 db.sql 文件中,实现以下代码,但是还是需要复制到数据库中去执行,
因为这里的 db.sql 仅仅是相当于是一个记事本的作用。

-- 构造登录页测试数据
insert into user values(1, 'zhangsan', 123);
insert into user values(1, 'lisi', 123456);






此时点击登录就可以登录到列表页了。


http://www.ppmy.cn/news/92454.html

相关文章

promise-reflect-proxy

1-Object.defineProperty 这个方法是用来为对象新增属性或者修改对象属性并返回这个对象的。 属性描述符分为数据描述符和访问器描述符&#xff1b; 不是专门用于劫持对象属性的方法&#xff0c;想要监听属性的新增与删除也是无法做到的。 2-Proxy提供对于对象的代理 proxy类…

charles使用

charles​ 一、概念​ charles是一款非常优秀的抓包工具&#xff0c;全平台支持&#xff0c;在mac&#xff0c;windows&#xff0c;linux上都可以使用&#xff0c;既可以抓 取web端的包&#xff0c;也可以抓app端的包。 ​ charles主要的功能包括如下几点&#xff1a; ​ 截取…

Scala介绍,开发环境搭建,语法,高级特性,编程技巧

Scala是一种面向对象和函数式编程语言&#xff0c;它运行在Java虚拟机上&#xff0c;可以与Java代码无缝地集成。Scala的设计目标是将面向对象和函数式编程的最佳实践结合起来&#xff0c;以提高代码的可读性、可维护性和可扩展性。本文将介绍Scala的开发环境搭建、语法、高级特…

腾讯云CVM服务器端口怎么开通?以开80端口为例

腾讯云CVM服务器端口是通过配置安全组规则来开通的&#xff0c;阿腾云以开通80端口为例来详细说下腾讯云轻量应用服务器开启端口的方法&#xff0c;其他的端口的开通如8080、1433、443、3306、8888等端口也适用于此方法&#xff0c;腾讯云服务器开通端口教程如下&#xff1a; …

RabbitMQ的工作模式

RabbitMQ的工作模式 一.simple模式&#xff08;即最简单的收发模式&#xff09; 二.work工作模式(资源的竞争)publish_subscribe发布订阅(../../../../../0马士兵/新建文件夹/BAT面试突击资料(1)/整理/BAT面试突击资料/15-消息中间件MQ面试题&#xff08;2020最新 版&…

ESP-01模块刷固件

ESP-01模块刷固件 0.前言一、准备二、烧写1.接线2.软件设置3.检验 0.前言 最近需要用esp-01模块作为wifi模块上云&#xff0c;但由于出厂自带固件太过老旧&#xff0c;经常会出现奇奇怪怪的警告&#xff0c;所以记录下如何给ESP-01刷写较新的固件。 一、准备 需要准备三个东西…

动态线程池 dynamic-tp 源码

目录 1. 介绍 2. Spring 环境整合配置源码 2.1 DtpBeanDefinitionRegistrar 2.2 DtpPostProcessorRegistrar 2.3 ApplicationContextHolder 2.4 DtpBaseBeanConfiguration 2. 动态线程池 DtpLifecycle 生命周期源码 3. 动态线程池 DtpRegistry 注册源码 4. 动态线程池…

卓越讲坛:美洲作物与人口关系辨——兼论历史研究中的跨学科方法

卓越讲坛&#xff1a;美洲作物与人口关系辨——兼论历史研究中的跨学科方法 学习过程 大国的发展与人口的数量息息相关&#xff0c;而巨大的人口数量需要足够的粮食作为支撑。在17世纪中期到19世纪&#xff0c;即明清之际到清朝中期&#xff0c;中国人口从一亿多增长到了四亿…