写写状态保持之cookie与session二人组

一.说说为啥要状态保持:

  • 因为 http 是一种无状态协议,浏览器请求服务器是无状态的。
  • 无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
  • 无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。
  • 有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等
  • 通过状态保持,可提高用户访问速度,降低服务器开销等
  • 实现状态保持主要有两种方式:
    • 在客户端存储信息使用Cookie
    • 在服务器端存储信息使用Session

二.Cookie :

  • Cookie:指某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地的数据(通常经过加密)。
    • 复数形式Cookies。
    • Cookie是由服务器端生成,发送给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。
    • Cookie的key/value可以由服务器端自己定义。
  • 应用
    • 最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookie的功用。
    • 网站的广告推送,经常遇到访问某个网站时,会弹出小窗口,展示我们曾经在购物网站上看过的商品信息。
    • 购物车,用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookie,以便在最后付款时提取信息。
  • 提示

    • Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用
    • Cookie基于域名安全,不同域名的Cookie是不能互相访问的
      • 如访问A网站时向浏览器中写了Cookie信息,使用同一浏览器访问B网站时,无法访问到A写的Cookie信息
      • 浏览器的同源策略
    • 当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息

三.在Flask中设置Cookie:

from flask imoprt Flask,make_response
@app.route('/cookie')
def set_cookie():
    resp = make_response('this is to set cookie')
    resp.set_cookie('username', 'james')
    return resp

    获取Cookie:

from flask import Flask,request
#获取cookie
@app.route('/request')
def resp_cookie():
    resp = request.cookies.get('username')
    return resp

四.Session:

  • 对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息
  • 在服务器端进行状态保持的方案就是Session
  • Session依赖于Cookie

    获取Session:

session:请求上下文对象,用于处理http请求中的一些数据内容

@app.route('/index1')
def index1():
    session['username'] = 'kobe'
    return redirect(url_for('index'))
@app.route('/')
def index():
    return session.get('username')

注:如有不当或者错误,请不吝赐教!!! 

 

 

 

 

 

 

 

<think>嗯,用户这次的问题聚焦在后端开发需要掌握哪些具体技术,特别是会话管理、监听器、过滤器等核心组件。从用户引用的资料来看,ta应该正在系统学习JavaWeb开发,需要明确技术栈的优先级。 用户提到的Cookie/Session部分,引用[1]已经解释得很清楚:Cookie本质是服务端设置在客户端的“身份证”,通过Set-Cookie响应头实现。这里需要强调安全性——敏感数据绝不能存Cookie,比如用户余额或权限令牌。而引用[2]补充的Cookie修改方案很有意思,其实方案二(先查找再setValue)更符合工程实践,因为直接覆盖同名Cookie可能遇到路径不一致的问题。 监听器过滤器(Listener & Filter)这块用户没直接引用资料,但它们是JavaWeb的“守门人”。比如用Filter实现全局编码转换: ```java public class EncodingFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding("UTF-8"); // 解决中文乱码 chain.doFilter(req, res); } } ``` 这种基础能力属于后端必备技能,就像建筑的地基。 AJAXJSON的引用虽然没出现,但必须重点说明。现代前后端分离架构中,后端开发者75%的工作都在设计JSON接口。比如Spring Boot里用@RestController返回JSON时,日期格式序列化这种细节都会影响前端体验。 ThreadLocal的线程隔离特性在Web开发中尤为关键。用户可能不知道,像Spring的事务管理就用ThreadLocal保存数据库连接,保证同一个线程内用同一个Connection。但要注意线程池场景下的内存泄漏风险。 文件上传下载(引用[4])提到按日期分目录存储,这很实用。不过还要补充断点续传的实现思路:通过HTTP的Range头实现分片传输,比如: ``` GET /bigfile.zip Range: bytes=1024-2047 ``` 最后关于用户隐含的“学习优先级”问题,可以这样排序:会话管理 > 过滤器 > JSON处理 > 文件操作 > 监听器 > ThreadLocal > AJAX原理。毕竟后端对AJAX只需理解交互机制,不必深究前端实现。</think>是的,后端开发**必须掌握**会话管理技术(Cookie/Session)、监听器、过滤器、JSON处理、AJAX原理、ThreadLocal及文件上传下载等核心知识。以下是具体分析: --- ### 一、必需掌握的核心技术 1. **Cookie & Session 会话管理** - **Cookie**:服务端创建并存储于客户端,用于身份跟踪(如登录状态)[^1] ```java // Java 创建Cookie Cookie cookie = new Cookie("user", "user123"); response.addCookie(cookie); // 通过响应头Set-Cookie发送到浏览器 ``` - **Session**:服务端存储用户会话数据(如购物车信息),依赖SessionID(通常存于Cookie) ```java // 存储Session request.getSession().setAttribute("cart", cartItems); // 读取Session List<Item> items = (List<Item>) request.getSession().getAttribute("cart"); ``` > **关键区别**:Cookie存客户端(易篡改),Session存服务端(更安全但消耗内存)[^1] 2. **过滤器(Filter) & 监听器(Listener)** | **组件** | 作用场景 | 示例 | |----------|--------------------------|-------------------------------| | 过滤器 | 请求预处理/响应后处理 | 权限验证、日志记录、编码转换 | | 监听器 | 监听Web应用生命周期事件 | Session创建销毁、请求初始化 | ```java // 过滤器示例:全局字符编码设置 public class EncodingFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding("UTF-8"); chain.doFilter(req, res); // 传递给下一个过滤器 } } ``` 3. **JSON处理** - 前后端数据交换的标准格式(如RESTful API) - 后端需掌握序列化(对象→JSON)反序列化(JSON→对象) ```java // Spring Boot中自动转换 @RestController public class UserController { @GetMapping("/user") public User getUser() { return new User("张三", 25); // 自动转为{"name":"张三","age":25} } } ``` 4. **AJAX原理** - 理解HTTP请求/响应机制(虽不需写前端代码,但需设计API支持AJAX调用) - 关键知识:RESTful设计、状态码(200/401/500)、CORS跨域处理[^3] 5. **ThreadLocal** - 解决多线程并发问题,为每个线程提供独立变量副本 - 典型应用: - 在同一个线程内共享数据库连接(避免传递Connection对象) - 用户权限信息传递(如Spring Security的SecurityContextHolder) ```java public class UserContext { private static ThreadLocal<User> currentUser = new ThreadLocal<>(); public static void setUser(User user) { currentUser.set(user); } public static User getUser() { return currentUser.get(); } } ``` 6. **文件上传下载** - **上传**:处理multipart/form-data请求,存储文件到指定路径(按日期分目录[^4]) ```java // Spring Boot接收文件 @PostMapping("/upload") public String upload(@RequestParam("file") MultipartFile file) { String dateDir = new SimpleDateFormat("yyyyMMdd").format(new Date()); Path path = Paths.get("/uploads/" + dateDir + "/" + file.getOriginalFilename()); Files.write(path, file.getBytes()); } ``` - **下载**:设置响应头`Content-Disposition: attachment`,流式传输文件数据 --- ### 二、为什么这些技术必需? | **技术** | 后端应用场景 | 不掌握的后果 | |----------------|----------------------------------|-------------------------------| | Cookie/Session | 用户认证、状态保持 | 无法实现登录功能/数据丢失 | | 过滤器 | 统一处理安全/日志/编码 | 代码冗余、维护困难 | | JSON | 前后端数据交互 | API无法被前端调用 | | 文件操作 | 用户头像上传/报表导出 | 关键业务功能缺失 | | ThreadLocal | 线程安全的数据传递 | 并发场景出现数据错乱 | > 引用[3]强调:**微服务架构下仍需会话管理**,但可能改用Token(JWT)替代Session[^3] --- ### 三、现代技术演进 1. **会话管理替代方案** - JWT(JSON Web Token)替代Session,更适合分布式系统 - Spring Session支持Redis集中存储Session 2. **文件存储优化** - 使用OSS(对象存储)替代本地磁盘,提升可靠性扩展性 3. **过滤器升级** - Spring Cloud Gateway/Nginx实现网关级过滤(限流、鉴权)[^3] --- ### 四、学习建议 ```mermaid graph TD A[核心基础] --> B[Cookie/Session] A --> C[过滤器/监听器] A --> D[JSON处理] E[进阶技能] --> F[文件操作] E --> G[ThreadLocal] E --> H[AJAX原理] ``` > **优先级提示**:先掌握会话管理过滤器(80%项目会用到),再学习文件操作等专项技能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值