JavaEE作用域、会话(Cookie、Session)、监听器、过滤器
-
- Java EE四种不同的作用域
-
- 会话(Session)
- 2.1. getSession()方法理解
-
- 如何显示当前在线用户数?
- 3.1. 思路?
-
- 设置cookie、session的过期时间
- 4.1. 设置Cookie过期时间:
- 4.2. 设置Session过期时间:
- 4.3. JavaWeb监听器:
-
- 过滤器运行过程
1. Java EE四种不同的作用域
- 请求作用域(Request Scope):一个请求作用域对象的生命周期是一个HTTP请求的处理过程。请求作用域对象可以在同一个HTTP请求的不同Servlet或JSP页面中共享。通常用于传递数据或状态信息,比如表单数据或分页信息。
- 会话作用域(Session Scope):一个会话作用域对象的生命周期是从用户会话开始到会话结束为止。会话作用域对象可以在同一个用户的不同请求之间共享。通常用于存储与用户相关的信息,比如登录状态或购物车中的商品列表、登入验证、权限验证。。
- 应用程序作用域(Application Scope):一个应用程序作用域对象的生命周期是从Web应用程序启动到关闭为止。应用程序作用域对象可以在整个Web应用程序中共享。通常用于存储应用程序的全局数据或配置信息,比如数据库连接池或邮件服务器地址。
- 上下文作用域(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. 思路?
- 需要一个容器存储当前在线用户数量。存在上下文作用域!
- 通过上下文监听,设置初始化在线用户数量:0
- 每次获取getSession(),判断是否是新用户,
如果是新用户,就获取当前用户的数量,值+1,再存储! - 用户线下了呢?
我们可以编程式地设置会话有效期(以下3种方式)
但是,用户有效期过了,会通知我们?
引入(监听器) HttpSessionListener
4. 设置cookie、session的过期时间
4.1. 设置Cookie过期时间:
-
可以使用Cookie类的
setMaxAge(int seconds)
方法设置Cookie的过期时间,单位为秒。该方法的参数为正整数时表示Cookie的有效期(即从设置开始到过期的秒数),为0时表示立即过期,为负数时表示浏览器关闭时过期。示例代码:
Cookie cookie = new Cookie("key", "value");
cookie.setMaxAge(60 * 60 * 24 * 7); // 设置Cookie的过期时间为一周
response.addCookie(cookie); // 将Cookie添加到响应中
- 可以在设置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过期时间:
-
可以使用HttpSession类的
setMaxInactiveInterval(int seconds)
方法设置Session的过期时间,单位为秒。该方法的参数为正整数时表示Session的最大非活动时间(即从上一次请求开始到过期的秒数),为0时表示立即过期,为负数时表示永不过期。示例代码:
HttpSession session = request.getSession();
session.setMaxInactiveInterval(60 * 30); // 设置Session的过期时间为30分钟
需要注意的是,设置Session的过期时间不会立即生效,而是在Session最后一次使用之后开始计时。如果在Session过期之前再次使用了该Session,那么计时会重新开始。如果要立即使设置生效,可以调用session.invalidate()
方法,使Session立即过期。
- 可以在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的过期时间,那么以最后设置的方式为准。
- 在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监听器:
- ServletContextListener 监听器:实现ServletContextListener接口,用于监听Web应用的启动和停止事件。它的作用是在Web应用启动时进行一些初始化操作,在Web应用停止时进行一些清理操作。
应用:
当Web应用启动时,可以使用该监听器加载一些全局配置信息,比如数据库连接池、日志配置等。当Web应用停止时,可以使用该监听器释放这些资源。
- HttpSessionListener 监听器:实现HttpSessionListener接口,用于监听HTTP Session的创建和销毁事件。它的作用是在Session创建时进行一些初始化操作,在Session销毁时进行一些清理操作。
应用:
当HTTP Session创建时,可以使用该监听器在Session中存储一些共享数据,比如用户登录信息、购物车信息等。当Session销毁时,可以使用该监听器清除这些数据。
- ServletRequestListener 监听器:实现ServletRequestListener接口,用于监听HTTP请求的创建和销毁事件。它的作用是在请求创建时进行一些初始化操作,在请求销毁时进行一些清理操作。
应用:
当HTTP请求创建时,可以使用该监听器在请求中添加一些处理数据,比如请求开始时间、请求IP地址等。当请求结束时,可以使用该监听器记录请求处理时间、请求响应状态等。
- ServletContextAttributeListener 监听器:实现ServletContextAttributeListener接口,用于监听ServletContext中属性的添加、修改和删除事件。它的作用是在属性添加、修改和删除时进行相应的操作。
应用:
当ServletContext中的属性被添加、修改或删除时,可以使用该监听器更新一些相关的数据,比如缓存数据、全局变量等。
- HttpSessionAttributeListener 监听器:实现HttpSessionAttributeListener接口,用于监听HTTP Session中属性的添加、修改和删除事件。它的作用是在属性添加、修改和删除时进行相应的操作。
应用:
当HTTP Session中的属性被添加、修改或删除时,可以使用该监听器更新一些相关的数据,比如用户登录状态、用户购物车信息等。
- 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文件中的顺序来实现。
描述:
- 过滤实现Filter接口,并且在web.xml中配置。
- 这样的话,tomcat管理过滤器的生命周期,
- 在tomcat“容器”启动的时候,自动地创建过滤器对象,
- 只要Http访问的url,与过滤的filter-mapping相匹配,就会调用过滤器的doFilter方法,
- 过滤器是在servlet的service方法前被调用,
- 过滤器是“链式结构”,访问servlet可能被多个过滤器过滤
- 过滤器的doFilter方法中,可以获得chain引用,通过chain.doFilter(request, response)方法
进行放行,到一个过滤器或servlet - 随着服务器关闭也会自动调用过滤器的destroy方法