Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)3

简介: Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)3

会话技术:cookie、session


概述


会话技术的作用:是用来存储会话过程中,浏览器和服务器交互产生的N多数据的

会话技术的分类:


   cookie(客户端的会话技术):用来存储会话过程中浏览器和服务器交互产生的N多数据的,整个cookie保留浏览器上


   session(服务器端的会话技术):用来存储会话过程中浏览器和服务器交互产生的N多数据的,整个session保留服务器上


使用 cookie 或 session 去存储浏览器和服务器交互中产生的数据的场景:


   当用户有私人数据需要在多个 servlet 间进行传递的时候,可以选择使用会话技术(cookie 和 session)



cookie:客户端的会话技术


概述


作用:存储数据进行传递的


特点:

  • 整个 cookie 存储在浏览器上
  • 由服务器端创建给浏览端保存的


cookie 的整个使用过程(完成私人数据在多个 servlet 之间进行数据传递):


   1.服务器创建 cookie 存储数据 ==> 把整个 cookie 传递给浏览器 ==> 浏览器端自动保存 cookie(key值会覆盖)


  2. 再次访问:浏览器会自动将保存的 cookie 传递服务器资源 ==> 服务器获取传递的 cookie 数据 ==> 使用 cookie 数据



cookie的应用场景


  • 记住用户名
  • 自动登录(记住用户名和密码)
  • 记录用户上次访问时间
  • 浏览器商品记录



注意:


   cookie 中不能出现特殊符号,例如:空格,分号(;) ,逗号(,)

   如果存入的数据不合法,会出现一个错误:

java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value


  • cookie 对于基本符号、数字、和字母是可以存储的。

  • 如果一定要在 cookie 中保存非法数据,可以将非法数据转换成符号、数字、和字母形式存储,要使用的时候再转换成正常的数据(解码)即可。

  • cookie 存入的数据有大小限制 4kb



常用方法


Cookie


// 创建cookie对象
Cookie(String name, String value)
// 获取cookie的名称
String getName()
// 获取cookie的值
String getValue()
// 设置cookie的最大生存时间(单位:秒),超过了该时间后Cookie会自动销毁
void setMaxAge(int expiry) 
// 设置cookie的有效路径。浏览器根据这个路径判断在访问哪些资源时携带该cookie给服务器
void setPath(String uri) 



HttpServletResponse

// 将cookie发送给浏览器。注意:服务器可以给浏览器传递多个cookie,浏览器都会保存,但存在key值覆盖
void addCookie(Cookie cookie)


HttpServletRequest

// 获取浏览器发送的cookie
Cookie[] getCookies()



注意:


   cookie 主要是通过名称和路径来确定他的唯一性的

   例如:以下表示的是两个 cookie,虽然名字一样,但是路径不同 , 所以两个 cookie 可以同时存在。

   /day04/a/b/cookie1

   /day04/a/cookie1

   如果路径和名称一样,后添加的 cookie 将覆盖前者



cookie 技术原理分析



Cookie 的生命周期、有效路径


Cookie 的生命周期

  • 会话级别的 Cookie:默认,关闭了浏览器 Cookie 就销毁了.
  • 持久级别的 Cookie:可以设置指定 cookie 在浏览器的存活时间,Cookie 就不会随着浏览器关闭而销毁了
// 设置cookie的最大生存时间(单位:秒),超过了该时间后Cookie会自动销毁
void setMaxAge(int expiry) 
  // >0 : 有效时间
  // =0 :过期(清除)


注意:

  • 当时间为 0 的时候,意思为立即删除此Cookie(前提:path 和 name 必须一致)
    要删除已经存在的 cookie,用来覆盖的 cookie 的名称与路径必须与原来的 cookie 一致




Cookie 的有效路径

// 设置cookie的有效路径。浏览器根据这个路径判断在访问哪些资源时携带该cookie给服务器
void setPath(String uri)



默认不写 :代表当前 cookie 的有效路径是当前 servlet 的上一级资源路径,只要浏览器访问该资源路径,就会携带该 cookie


/ :代表浏览器访问整个服务器上的项目资源,都会携带该 cookie


/web05 :代表浏览器访问整个 /web05 项目下的资源时,都会携带该 cookie,访问别的项目资源不携带(常用)


/web05/cs5 :只在访问 /web05/cs5 资源才会携带该 cookie




session:服务器端的会话技术


概述

session 是保存在服务器端的会话技术,当通常情况下,Session 是借助 Cookie 技术来传递 ID 属性的。

session 的作用:为了保存会话中产生的数据



特点:

  • 保存在 session 中的数据在服务器端。由服务器创建的
  • session 其实是一个域对象,xxxAttribute() 存储数据的方法



作用范围:


   session 中的数据在一次会话中共享


   因为在一次会话中,访问多少个 servlet,获取到的 session 都是同一个


   但是如果不在一次会话中,多个 servlet 中产生的不再是同一个 session 对象


   底层原因是不同会话中 cookie 携带的 jessionid(session 的 id)不一样




生命周期:

  • 创建:java 认为当浏览器首次执行到了 request.getSession 方法的时候创建 session 对象
  • 销毁:


  • 被动销毁:默认当前 session 30 分钟不使用会被销毁
  • 主动销毁:session.invalidate()
  • 服务器非正常关闭 session 会销毁
    服务器正常关闭 session 不会销毁,会持久化到硬盘上,服务器开启后,会默认从硬盘上回到服务器中



session 的与 cookie 的区别

cookie session
会话数据保存的位置 浏览器 服务器
数据的安全性 不安全 安全
存储数据是否有限制 有。4kb,且只能字符串




存储数据与获取数据 API


  • HttpServletRequest
// 获取session对象
HttpSession getSession()



HttpSession


         



session 的剖析


在一次会话中,使用的都是同一个 session 对象剖析:


session 的一切是由 request.getSession() 开始

当程序执行到 request.getSession() 方法时,首先会判断用户的浏览器是否携带了 jsessionid


   用户浏览器没有携带 jsessionid:

   tomcat 会在服务器上开启一块空间(创建一个新的session对象),用来存入数据,然后会创建一个 cookie,将这块空间的地址记录给 cookie(key:jessionid),然后将这个 cookie 写回给访问者的浏览器(会话级别)


   用户浏览器携带了 jsessionid:

   tomcat 就不会再去开启空间(创建 session),而是根据浏览器带来的 jessionid 找到 session 地址,从该 session 中取出数据




Filter:过滤器


概述


过滤器的使用场景:


   实际项目中,对访问某些资源的请求需要进条件的筛选、过滤。


   当这个请求满足特定的情况,才能让这 个请求访问目标资源,如果不满足条件,就不让访问目标资源。


   比如:对于访问管理员功能的请求,应该对这样的请求进行管理员权限的判断。如果当前用户拥有管理员权限,可以访问。反之不可以。


Filter:是 Java 中预先定义好了的接口,可以过滤不同的内容,具体怎么过滤,需要使用者定义一个实现类,然后实现接口中的过滤方法,在方法中书写过滤的条件。filter 是对客户端访问资源的过滤,符合条件放行,不符合条件不放行


主要作用:对浏览器的请求进行拦截过滤的



filter 的使用


Filter 接口 API

// 过滤器的初始化方法
void init(FilterConfig filterConfig)
// 过滤器的核心过滤方法。写具体的过滤逻辑
void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
// 过滤器的销毁方法
void destroy()





使用步骤

  1. 创建一个 java 类,实现 filter 的接口,并实现方法 doFilter()
//@WebFilter(filterName = "MyFilter1",urlPatterns = "/sd1")
public class MyFilter implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}
    //核心过滤方法
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("MyFilter进行服务器资源的过滤了...");
        //默认是拦截不放行的   手动放行(固定代码)
        filterChain.doFilter(servletRequest,servletResponse);
    }
    @Override
    public void destroy() {}
}



2.注册 filter

方式1:在自定义的 filter 类上添加 @WebFilter 注解:

@WebFilter(filterName = "MyFilter1", urlPatterns = "/sd1")


  • filterName 属性:过滤器名称
  • urlPatterns 属性:过滤器生效的接口路径
    路径配置规则与 servlet 相同(完全匹配、目录匹配、拓展名匹配)



方式2:在 web.xml 中配置 filter 要拦截的资源


  <!--配置filter要拦截的服务器资源-->
    <filter>
        <!--filter的名称-->
        <filter-name>MyFilter</filter-name>
        <!--全限定名  包名+类名-->
        <filter-class>cn.itcast.filter.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <!--filter的名称-->
        <filter-name>MyFilter</filter-name>
        <!--要拦截的服务器资源路径-->
        <url-pattern>/sd1</url-pattern>
    </filter-mapping>




filter 的执行顺序、执行流程、生命周期


过滤器链:需要对同一个请求,进行多次不同业务的过滤时,可以配置多个过滤器,只有所有的过滤器都对请求进行了放行,请求才能访问到目标资源,只要多个过滤器中只有一个过滤器不放行请求,那么这个请求都不能够访问到目标资源。多个过滤器组成的一个整体称为过滤器链。而且,过滤器链中的过滤器是一个一个的执行的,一个过滤器执行完毕之后,会执行下一个过滤器,后面没有过滤器了,才会访问到目标资源。只要其中一个过滤器没有放行,那么这个过滤器后面的过滤器也都不会执行了。



过滤器链中多个过滤器的执行顺序:


  • 注解方式:如果多个 filter 对同一个资源进行了拦截,执行的顺序是按照 filter 文件名的自然排序顺序执行
  • 配置文件方式:如果多个 filter 对同一个资源进行了拦截,执行的顺序是配置文件的从上到下顺序



filter 的执行流程


9d27cbe217114a8897de53bbacb21993.png


filter 的生命周期

从 filter 的出生到 filter 的死亡,有3个方法:


  • init() :过滤器的初始化方法
    服务器启动时在 servlet 容器创建 filter 对象后执行一次 init 方法

在要求过滤器做任何过滤工作之前,init 方法必须成功完成

void init(FilterConfig filterConfig)



参数说明:

   filterConfig :当前 filter 的配置对象


   作用:

       可以获取到当前 filter 的名称:getFilterName()

       可以获取到 ServletContext 对象:getServletContext()


dofilter() :过滤器的核心过滤方法


当请求符合 Filter 拦截路径时,都会执行 doFilter 方法,访问一次执行一次。

void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)



参数说明:

   chain:可以做当前 filter 的放行:chain.dofilter(req, resp)


注意:

   如果需要让这个请求通过过滤器,继续访问目标资源,一定得调用 FilterChain 对象的 doFilter 方法,不然请求就被过滤器拦截了


   FilterChain 对象的 doFilter 方法表示对于请求放行

destory() :过滤器的销毁方法


当关闭服务器时,销毁当前 filter 时执行


相关文章
|
2天前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
10 4
|
2天前
|
监控 Java 数据管理
java会话跟踪和拦截器过滤器
本文介绍了Web开发中的会话跟踪技术——Cookie与Session,以及过滤器(Filter)和监听器(Listener)的概念和应用。Cookie通过在客户端记录信息来识别用户,而Session则在服务器端保存用户状态。过滤器用于拦截和处理请求及响应,监听器则监控域对象的状态变化。文章详细解释了这些技术的实现方式、应用场景和主要方法,帮助开发者更好地理解和使用这些工具。
9 1
|
14天前
|
存储 缓存 NoSQL
保持HTTP会话状态:缓存策略与实践
保持HTTP会话状态:缓存策略与实践
|
3月前
|
存储 安全 搜索推荐
【JavaWeb 秘籍】Cookie vs Session:揭秘 Web 会话管理的奥秘与实战指南!
【8月更文挑战第24天】本文以问答形式深入探讨了Web开发中关键的会话管理技术——Cookie与Session。首先解释了两者的基本概念及工作原理,随后对比分析了它们在存储位置、安全性及容量上的差异。接着,通过示例代码详细介绍了如何在JavaWeb环境中实现Cookie与Session的操作,包括创建与读取过程。最后,针对不同应用场景提供了选择使用Cookie或Session的指导建议,并提出了保障二者安全性的措施。阅读本文可帮助开发者更好地理解并应用这两种技术。
57 1
|
3月前
|
存储 安全 搜索推荐
深入探讨Session和Cookie的概念、用途以及如何在Java Web开发中有效地使用它们进行用户状态管理。
在Java Web开发中,Session和Cookie是管理用户状态的核心技术。Session存储于服务器端,通过唯一的Session ID识别用户,确保数据安全与隐私;Cookie则存储于客户端,用于记录用户偏好等信息。两者各有优势:Session适合存储敏感数据,但需合理管理避免资源浪费;Cookie便于持久化存储,但在安全性上需谨慎设置。开发者可通过Servlet API轻松操作二者,实现个性化用户体验与应用性能优化。
57 2
|
3月前
|
存储 JSON JavaScript
震撼!Cookie、Session、Token、JWT 终极对决:揭开 Web 认证的神秘面纱!
【8月更文挑战第13天】Web 开发中,Cookie、Session、Token 和 JWT 常混淆。Cookie 是服务器给客户端的小信息片,如登录状态,每次请求都会返回。Session 则是服务器存储的用户数据,通过 Session ID 追踪。Token 类似通行证,证明客户端身份且可加密。JWT 是结构化的 Token,含头部、载荷及签名,确保数据完整性和安全性。
65 4
|
3月前
|
C# 开发者 Windows
WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
220 0
|
25天前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
86 3
|
6天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
79 44
|
2天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
8 1