笔记|个人博客系统

【笔记|个人博客系统】1.Cookie和Session
1.Session(会话)是什么,为什么需要会话这个概念2.HTTP协议本身是无状态(stateless)协议
3.所以需要一些机制+HTTP协议来解决会话管理的问题
4.通常情况下,使用Cookie+Session机制来一起解决会话管理的问题
1.Cookie是浏览器-服务器之间
浏览器∶保存Cookie;在合适的请求中携带Cookie(表现为HTTP请求头的Cookie Header)服务器∶生成Cookie并传递给浏览器by HTTP响应(表现为HTTP响应头的Set-Cookie Header)2.使用Cookie+Session解决会话管理时,Cookie的主要职责是携带session-id 3.Cookie本身是一个独立的机制过期时间、限制域、限制路径…
4. Session是只存在于服务器的一套数据,通过 session-id 找到对应的数据
1.Session默认存储于内存中,但实际上不做限制,哪里都可以存储
2.通过 session-id 取到的数据,我们的代码中看到的还是 Map3.只要 session 存储,我们可以跨请求共享数据4.Session可以独立工作
用户管理
1.用户注册(添加新用户)2.用户登录(验证你是不是“你”)3.获取当前登录用户信息
1.将用户管理在内存中
用户∶ int uid, String username(唯一), String password
List allUsers;
登录场景/login.html
提供 form 表单,收集用户填写的用户名+密码信息,并且提交到服务器
/login.do
读取用户提交的用户名+密码,完成验证。
如果成功,进行登录(会话中保存当前用户),响应登录成功如果失败,重定向回/login.html
2.获取当前登录用户
1.如果没有当前登录用户,重定向(跳转)到/login.html 2.如果用户登录了,则显示当前登录用户信息/publish.html
GET
动态
3.将用户数据持久化到MySQL中
create table users (
根据用户名+密码查找用户
uid int primary key auto_increment, username varchar(60) not null unqiue,
selectfrom users where username = ?password varchar(60) not null and password = ?; ¥
3.1建表
3.2 操作数据库的对象 DAO(Data Access Object)
UserDao.selectOneByUsernameAndPassword(…)
4.注册
form 提交 username + password
/register.html
读取用户名+密码,完成用户的添加(插入表中)
/register.do
注册后直接登录 or 跳转到登录页让用户登录
永远不要用明文去保存用户的密码
Web开发
一个 Web 应用 是由多个场景,每个场景下又会有多个功能组成!
由多个页面(html页面)组成的
n个css、js资源
一个页面consist of 1个HTML资源
n个
.do资源n个json资源
一个页面是由多个web资源组成
资源
1.路径(path)=context path+servlet path
2.内容格式类型(content-type)∶ text/plain、text/html、text/css、application/javascript、application/json 3.静态vs动态
4.支持的HTTP方法(主要是动态资源)
浏览器-服务器以资源(resource)为单位,进行HTTP协议的沟通1.HTTP协议是应用层协议2.请求方法∶ get vs post 3.请求头∶Cookie头
4.响应状态∶ 1xx、2xx、3xx、4xx、5xx 200、404、405、500、301、302、307
5.响应头∶ Content-Type、Set-Cookie 场景总结
服务器浏览器
1.页面和其他资源产生关系(发起新的请求)1.浏览器地址栏输入URL回车——发起GET请求2.通过标签让浏览器自动发起GET请求
图片 CSS
+ 5.通过JS手动控制发起GET/POST请求 (ajax)XMLHttpRequest 对象控制 2.浏览器需要读取服务器的数据(通过GET请求实现),以ajax处理为主3.浏览器向服务器提交数据——学习了两种方法 1.通过 form 表单实现 的关键属性∶ action、method、enctype 80% 2.通过 ajax 进行提交20% 1.直接携带在query string 中提交数据。 open('get',/some.do?username=xx&password=yy)2.以JSON格式,放置在请求体中进行提交 var data = https://www.it610.com/article/{…} //将对象变成JSON字符串var jsonString = JSON.stringify(data)//通过 ajax 方式提交 JSON 数据var xhr = new XMLHttpRequest()xhr.open('post','/some.do')xhr.onload = function(){…} xhr.setRequestHeader('Content-Type','application/json')xhr.send(jsonString) JS中对DOM的操作1.如何查询需要的结点 第一个 document.querySelector(选择器字符串) 所有的 document.querySelectorAll(选择器字符串)class 选择器∶'.some' 元素选择器∶'body'选择器∶ id选择器∶'#some' 100% 2.元素对象,常见属性之间读取或者修改 input.value = '/uploads/allimg/220813/1ZJ2MB-0.jpg'; img.src='/uploads/allimg/220813/1ZJ2MB-0.jpg'; Hello元素的文本 e.textContent | e.innerText 元素的内联css 属性e.style.height 元素的class 属性e.classList add(...)remove(...) contains(..) 3.修改html结构(插入孩子、删除孩子) e.outerHTML='...' 1. e.innerHTML='...'2.以对象的方式 var e = document.createElement('div'); parent.appendChild(e); parent.removeChild(e); 所有前端的内容(HTML、CSS、JS)都要善用去MDN查询 后端场景∶1.响应内容 resp.setCharacterEncoding("utf-8"); resp.setContentType("…."); PrintWriter writer = resp.getWriter(); //利用write写响应2.读取用户输入 1.以 form表单方式提交(放在 query string 或者 请求体(x-www-urlencoded、multipart/form-data)) req.setCharacterEncoding("utf-8"); String value = https://www.it610.com/article/req.getParameter(name); 如果是文件上传@MultipartConfig修饰类req.getPart(name) 2.直接从 req.getInputStream()请求体输入流读取 借助jackson提供的方法 User user = objectMapper.readValue(req.getInputStream(),User.class)输出 text/html可以采用模板技术 输入 application/json,可以使用jackson 提供的方法 User user = new User(); String jsonString = objectMapper.writeValueAsString(user); 关于数据————放在数据库中JDBC的操作(DAO类型对象、model类型对象、Service类型对象)流程型对象 Servlet 对象 -> Service 对象 -> Dao 对象 大 model对象 数据库直接的增删查改的操作读取用户输入 做数据的结构化工作 响应输出 会话管理 1.登录…2.判断用户是否登录… 工程角度(源码组织) 1.静态资源 src/main/webapp 下,并且不能再 src/main/webapp/WEB-INF下2.动态资源,放在 src/main/java 下的任意包下都可以 备注∶这里的路径只是Servlet Path。Context Path是配置在启动配置中的 1.@WebServlet(路径) 1.必须以/开头2.不能重复 首页3."" 所有路径4."/"5."*.html"2.继承HttpServlet 3.重写 doGet、doPost、doHead

    推荐阅读