JavaEE作用域、会话(Cookie、Session)、监听器、过滤器

文章介绍了JavaEE中的四种作用域,包括请求、会话、应用程序和上下文作用域。详细讲解了会话(Session)的管理和getSession()方法的使用,以及如何显示当前在线用户数。此外,还讨论了设置Cookie和Session过期时间的方法,并提到了JavaWeb监听器在管理会话和应用状态中的作用。最后,概述了过滤器的工作流程及其在HTTP请求和响应处理中的角色。
摘要由CSDN通过智能技术生成

JavaEE作用域、会话(Cookie、Session)、监听器、过滤器

    1. Java EE四种不同的作用域
    1. 会话(Session)
    • 2.1. getSession()方法理解
    1. 如何显示当前在线用户数?
    • 3.1. 思路?
    1. 设置cookie、session的过期时间
    • 4.1. 设置Cookie过期时间:
    • 4.2. 设置Session过期时间:
    • 4.3. JavaWeb监听器:
    1. 过滤器运行过程

1. Java EE四种不同的作用域

  1. 请求作用域(Request Scope):一个请求作用域对象的生命周期是一个HTTP请求的处理过程。请求作用域对象可以在同一个HTTP请求的不同Servlet或JSP页面中共享。通常用于传递数据或状态信息,比如表单数据或分页信息。
     
  2. 会话作用域(Session Scope):一个会话作用域对象的生命周期是从用户会话开始到会话结束为止。会话作用域对象可以在同一个用户的不同请求之间共享。通常用于存储与用户相关的信息,比如登录状态或购物车中的商品列表、登入验证、权限验证。。
     
  3. 应用程序作用域(Application Scope):一个应用程序作用域对象的生命周期是从Web应用程序启动到关闭为止。应用程序作用域对象可以在整个Web应用程序中共享。通常用于存储应用程序的全局数据或配置信息,比如数据库连接池或邮件服务器地址。
     
  4. 上下文作用域(Context Scope):一个上下文作用域对象的生命周期是从Web容器启动到关闭为止。上下文作用域对象可以在整个Web应用程序中共享,与应用程序作用域不同,上下文作用域中的对象不会在应用程序重新加载时被清除。通常用于存储全局数据或配置信息,比如Web应用程序的版本号或主题、统计“服务”被访问的次数。

2. 会话(Session)

是指服务器与客户端之间的一种状态管理机制,用于跟踪同一个用户的一系列请求。一个会话从用户第一次访问服务器开始,一直持续到用户关闭浏览器或者会话超时。

2.1. getSession()方法理解

为了方便对会话状态进行管理,Java Web提供了一个名为getSession()的方法,可以通过该方法获取一个HttpSession对象,该对象代表了当前会话。getSession()方法可以接受一个布尔值类型的参数,用于指定是否创建一个新的会话。如果该参数为true,则表示如果当前没有会话,则创建一个新的会话;如果该参数为false,则表示如果当前没有会话,则返回null。

通过HttpSession对象,我们可以在整个会话过程中,存储和获取会话相关的数据。比如,可以在第一次访问时,使用session.setAttribute()方法存储一些用户信息,然后在后续的请求中,使用session.getAttribute()方法获取这些信息,实现跟踪同一个用户的请求。

总之,getSession()方法是Java Web中用于获取会话对象的方法,通过该方法可以进行会话状态的管理和数据的存储与获取。

3. 如何显示当前在线用户数?

3.1. 思路?

  1. 需要一个容器存储当前在线用户数量。存在上下文作用域!
  2. 通过上下文监听,设置初始化在线用户数量:0
  3. 每次获取getSession(),判断是否是新用户,
    如果是新用户,就获取当前用户的数量,值+1,再存储!
  4. 用户线下了呢?
    我们可以编程式地设置会话有效期(以下3种方式)
    但是,用户有效期过了,会通知我们?
    引入(监听器) HttpSessionListener

4. 设置cookie、session的过期时间

4.1. 设置Cookie过期时间:

  1. 可以使用Cookie类的setMaxAge(int seconds)方法设置Cookie的过期时间,单位为秒。该方法的参数为正整数时表示Cookie的有效期(即从设置开始到过期的秒数),为0时表示立即过期,为负数时表示浏览器关闭时过期。

    示例代码:

Cookie cookie = new Cookie("key", "value");
cookie.setMaxAge(60 * 60 * 24 * 7); // 设置Cookie的过期时间为一周
response.addCookie(cookie); // 将Cookie添加到响应中
  1. 可以在设置Cookie时,使用setMaxAge()方法的参数为0的方式,使Cookie立即过期,并且同时设置Cookie的过期时间。这种方式可以保证Cookie的过期时间和Cookie的删除时间一致。
Cookie cookie = new Cookie("key", "value");
cookie.setMaxAge(0); // Cookie立即过期
cookie.setHttpOnly(true); // 设置Cookie的HttpOnly属性
cookie.setSecure(true); // 设置Cookie的Secure属性
cookie.setPath("/"); // 设置Cookie的路径
cookie.setDomain(".example.com"); // 设置Cookie的域名
cookie.setMaxAge(60 * 60 * 24 * 7); // 设置Cookie的过期时间为一周
response.addCookie(cookie); // 将Cookie添加到响应中

4.2. 设置Session过期时间:

  1. 可以使用HttpSession类的setMaxInactiveInterval(int seconds)方法设置Session的过期时间,单位为秒。该方法的参数为正整数时表示Session的最大非活动时间(即从上一次请求开始到过期的秒数),为0时表示立即过期,为负数时表示永不过期。

    示例代码:

HttpSession session = request.getSession();
session.setMaxInactiveInterval(60 * 30); // 设置Session的过期时间为30分钟

需要注意的是,设置Session的过期时间不会立即生效,而是在Session最后一次使用之后开始计时。如果在Session过期之前再次使用了该Session,那么计时会重新开始。如果要立即使设置生效,可以调用session.invalidate()方法,使Session立即过期。

  1. 可以在web.xml文件中配置Session的最大非活动时间,从而达到设置Session过期时间的效果。在web.xml文件中,可以使用标签来配置Session的相关属性,其中标签用于设置Session的最大非活动时间,单位为分钟。
<web-app>
  <session-config>
    <session-timeout>30</session-timeout> <!-- 设置Session的过期时间为30分钟 -->
  </session-config>
</web-app>

需要注意的是,如果同时使用了以上不同的方式来设置Cookie和Session的过期时间,那么以最后设置的方式为准。

  1. 在Servlet中,可以使用HttpServletRequest对象的getSession(boolean create)方法获取Session对象,如果Session对象不存在则根据create参数的值来决定是否创建一个新的Session对象。如果需要设置Session的过期时间,则可以在创建Session对象之前调用setMaxInactiveInterval(int seconds)方法来设置Session的最大非活动时间,从而达到设置Session过期时间的效果。
HttpSession session = request.getSession(true); // 获取Session对象,如果不存在则创建一个新的Session对象
session.setMaxInactiveInterval(30 * 60); // 设置Session的过期时间为30分钟

需要注意的是,在使用以上方式设置Session的过期时间时,需要在每次创建Session对象时都调用setMaxInactiveInterval()方法,否则设置会失效。

4.3. JavaWeb监听器:

  1. ServletContextListener 监听器:实现ServletContextListener接口,用于监听Web应用的启动和停止事件。它的作用是在Web应用启动时进行一些初始化操作,在Web应用停止时进行一些清理操作。

应用:
当Web应用启动时,可以使用该监听器加载一些全局配置信息,比如数据库连接池、日志配置等。当Web应用停止时,可以使用该监听器释放这些资源。

  1. HttpSessionListener 监听器:实现HttpSessionListener接口,用于监听HTTP Session的创建和销毁事件。它的作用是在Session创建时进行一些初始化操作,在Session销毁时进行一些清理操作。

应用:
当HTTP Session创建时,可以使用该监听器在Session中存储一些共享数据,比如用户登录信息、购物车信息等。当Session销毁时,可以使用该监听器清除这些数据。

  1. ServletRequestListener 监听器:实现ServletRequestListener接口,用于监听HTTP请求的创建和销毁事件。它的作用是在请求创建时进行一些初始化操作,在请求销毁时进行一些清理操作。

应用:
当HTTP请求创建时,可以使用该监听器在请求中添加一些处理数据,比如请求开始时间、请求IP地址等。当请求结束时,可以使用该监听器记录请求处理时间、请求响应状态等。

  1. ServletContextAttributeListener 监听器:实现ServletContextAttributeListener接口,用于监听ServletContext中属性的添加、修改和删除事件。它的作用是在属性添加、修改和删除时进行相应的操作。

应用:
当ServletContext中的属性被添加、修改或删除时,可以使用该监听器更新一些相关的数据,比如缓存数据、全局变量等。

  1. HttpSessionAttributeListener 监听器:实现HttpSessionAttributeListener接口,用于监听HTTP Session中属性的添加、修改和删除事件。它的作用是在属性添加、修改和删除时进行相应的操作。

应用:
当HTTP Session中的属性被添加、修改或删除时,可以使用该监听器更新一些相关的数据,比如用户登录状态、用户购物车信息等。

  1. ServletRequestAttributeListener 监听器:实现ServletRequestAttributeListener接口,用于监听HTTP请求中属性的添加、修改和删除事件。它的作用是在属性添加、修改和删除时进行相应的操作。

应用:
当HTTP请求中的属性被添加、修改或删除时,可以使用该监听器更新一些相关的数据,比如请求参数、请求处理状态等。

5. 过滤器运行过程

过滤器是一种用于拦截HTTP请求和响应的组件,可以对请求和响应进行处理、修改和验证,从而达到控制应用程序访问、保护安全性和增强性能等目的。Java过滤器的运行过程可以分为以下几个阶段:
1. 加载过滤器:
在Web应用程序启动时,容器会加载Web.xml文件中配置的过滤器。加载过滤器是通过调用过滤器的init(FilterConfig filterConfig)方法实现的。
2. 过滤请求:
当客户端发送HTTP请求时,容器会将请求发送给过滤器链中的第一个过滤器。过滤器链是按照Web.xml文件中配置的顺序来组成的。每个过滤器都可以根据需要对请求进行处理、修改和验证,然后决定是否将请求传递给下一个过滤器。

过滤器的处理过程可以通过调用过滤器的doFilter(ServletRequest request, ServletResponse response, FilterChain chain)方法实现。该方法接收三个参数:ServletRequest对象、ServletResponse对象和FilterChain对象。

  • ServletRequest对象表示客户端的请求,包含请求信息和请求头。
  • ServletResponse对象表示服务器的响应,包含响应信息和响应头。
  • FilterChain对象表示过滤器链,可以通过调用它的doFilter(ServletRequest request, ServletResponse response)方法将请求传递给下一个过滤器。

在过滤器的处理过程中,可以根据需要对请求和响应进行修改和验证,如修改请求参数、修改请求头、添加响应头、重定向请求等操作。

3. 处理请求:
如果所有过滤器都将请求传递给下一个过滤器,最后请求会被发送给Servlet来进行处理。在Servlet中,可以通过HttpServletRequest对象获取请求信息,并通过HttpServletResponse对象生成响应结果。

4. 过滤响应:
当Servlet处理完请求后,将生成响应结果并发送给客户端。在响应发送之前,响应会被发送给过滤器链中的最后一个过滤器,过滤器可以根据需要对响应进行处理和修改,如添加响应头、修改响应内容、压缩响应等操作。

过滤器的处理过程可以通过调用过滤器的doFilter(ServletRequest request, ServletResponse response, FilterChain chain)方法实现。与处理请求时不同的是,此时FilterChain对象的doFilter(ServletRequest request, ServletResponse response)方法的调用是在过滤器的doFilter()方法之前执行的,因此过滤器的处理过程可以在响应被发送到客户端之前进行。

5. 卸载过滤器:
在Web应用程序关闭时,容器会卸载所有已加载的过滤器。卸载过滤器是通过调用过滤器的destroy()方法

6. 异常处理:
在处理请求或响应过程中,可能会发生异常。对于这些异常,过滤器也可以进行处理,如记录日志、返回错误页面等操作。过滤器可以通过在doFilter()方法中捕获异常并进行相应的处理。

7. 过滤器的配置:
过滤器可以通过Web.xml文件进行配置。Web.xml文件中定义了过滤器的名称、类名、初始化参数、URL模式等信息。URL模式定义了过滤器要拦截的请求URL。过滤器可以拦截指定的URL,也可以拦截所有的URL。

8. 过滤器的优先级:
当多个过滤器拦截同一个请求时,过滤器的执行顺序会影响处理结果。过滤器的执行顺序由Web.xml文件中定义的顺序决定,排在前面的过滤器先执行。如果需要改变过滤器的执行顺序,可以通过修改Web.xml文件中的顺序来实现。

描述:

  1. 过滤实现Filter接口,并且在web.xml中配置。
  2. 这样的话,tomcat管理过滤器的生命周期,
  3. 在tomcat“容器”启动的时候,自动地创建过滤器对象,
  4. 只要Http访问的url,与过滤的filter-mapping相匹配,就会调用过滤器的doFilter方法,
  5. 过滤器是在servlet的service方法前被调用,
  6. 过滤器是“链式结构”,访问servlet可能被多个过滤器过滤
  7. 过滤器的doFilter方法中,可以获得chain引用,通过chain.doFilter(request, response)方法
    进行放行,到一个过滤器或servlet
  8. 随着服务器关闭也会自动调用过滤器的destroy方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奕の辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值