首页 > 其他分享 >Cookie、Session、Filter过滤器

Cookie、Session、Filter过滤器

时间:2024-12-12 18:57:00浏览次数:6  
标签:session request Filter Session cookie Cookie

一、Cookie

#### 1.1 工作原理

客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头,客户端会根据这个响应头存储Cookie信息。再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头,而服务器会根据这个请求头进行用户身份、状态等较验。

 

#### 1.2 使用步骤

1. 创建cookie对象

new Cookie(String name, String value)

2. 发送cookie对象

response.addCookie(Cookie cookie)

3. 获取cookie对象,拿到数据

Cookie[] cookies = request.getCookies()

4. 设置Cookie时效

   - 正数:cookie数据写入磁盘中,持久化存储 cookie.setMaxAge(60)。


      - 负数:默认,当浏览器关闭的时候,cookie被销毁。


      - 0:删除cookie信息。

 

默认情况下Cookie存放在浏览器内存中,当浏览器关闭,内存释放,则Cookie释放。但我们可以设置Cookie存活时间,运用cookie.setMaxAge()方法,参数单位为秒。当传入参数为正数时,即为存入浏览器内存的时间,秒数。为负数时,默认值,Cookie在浏览器内存中,浏览器关闭时,则Cookie被销毁。为零时:删除对应的Cookie。

 

#### 2.1 工作原理

Session是依赖于Cookie的,当服务端创建session时,服务端在响应的时候会通知客户端把seesion id存储在cookie,后续的请求会在请求头里面会携带上cookie中的数据,服务端获取cookie携带的session id之后从session映射区里面获取对应的数据进行其他的操作。

#### 2.2 使用步骤

1. 获取session对象

HttpSession session = request.getSession();

2. 设置数据

session.setAttribute(键, 值);

3. 手动设置JSESSIONID,可以设置cookie时效性 

Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60 * 60);
response.addCookie(cookie);
#### 2.3 cookie和session的区别

1. session用于存储一次会话的多次请求的数据,存在服务端。
2. session可以存储任意类型,任意大小的数据。
3. session数据存在服务端,cookie存在客户端。
4. session没有数据大小限制,cookie有。
5. session数据安全,cookie相对不安全。

 ####2.4案例展示

Session:服务端会话跟踪技术,将数据存放到服务端:

发送Session:

@WebServlet("/Session1")
public class Session1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取Session
        //1.创建Session
        HttpSession session = request.getSession();
        //2.存储数据
        session.setAttribute("username","zs");
 
 
    }
 
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

接收Session:

@WebServlet("/Session2")
public class Session2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取Session数据
        //1.获取Session对象
        HttpSession session = request.getSession();
 
        //销毁
        //session.invalidate();//此时访问该网页,会报错
 
        //2.获取数据
        Object username = session.getAttribute("username");
        System.out.println(username);
    }
 
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

Session是基于Cookie实现的,来保证同一个浏览器获取的Session是同一个Session。获取的Session有一个id属性,tomcat在浏览器做出响应的时候会自动把这个id属性当作一个Cookie发送给浏览器键值对为set-cookie:JSESSIONID=...,然后客户端就把这个浏览器在带着cookie头访问服务端来获取Session对象。

三、Filter过滤器

3.1 使用方法

访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊功能。比如可以用于完成通用的操作,如:登录验证、统一编码处理、敏感字符过滤等等。 

Filter的定义:

 1、定义类,实现filter接口,并重写所有方法。

 2、配置Filter拦截资源路径,需要在类上定义注解@WebFilter()

 3、在doFiler方法中输出一句话,并放行,只有执行了chain.doFilter方法才会 被放行。

写在放行代码前的代码为放行前代码,后面的为放行后代码。

注意:

 1、放行后访问对应资源,资源访问完后还会回到Filter中。就是浏览器发送请求的时候会经过Filter,服务端做出响应的时候也会经过Filter。

 2、浏览器发送请求经过Filter时,只执行放行前代码。响应时返回Filter中,Filter中的代码,会从放行代码开始只执行放行后代码,不会从头开始执行。

Filter拦截路径设置

 1、拦截具体路径:具体资源路径

 2、目录拦截:/目录/*    访问该目录下的所有资源都会被拦截

 3、后缀名拦截:*.jsp    访问后缀名为jsp的资源都会被拦截

 4、拦截所有: /*  所有资源都会被拦截。

3.2 应用示例

 

@WebFilter("/*")
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 {
        // 统一设置请求编码格式
        servletRequest.setCharacterEncoding("utf8");
        // 放行,不然就卡在这里了
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

改代码用来统一处理请求编码格式代码

四、Listener监听器 

监听器用于监听web应用中某些对象、信息的创建、销毁、增加、修改、删除等动作的发生,然后作出响应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。 

4.1 ServletContext对象监听器

 监听web上下文的初始化(服务器已经准备好接收请求)与销毁,通常用来加载框架的配置文件。

注解

@WebListener
public class MyListener implements ServletContextListener {

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		// 用来加载框架xml配置文件
		System.out.println("Servlet初始化");

	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub

	}

}

 web.xml配置

<listener>
    <listener-class>com.test.web.MyListener</listener-class>
</listener> 

#### 4.2 其他监听器

1. HttpSession对象监听器:监听session建立于销毁
2. HttpSessionAttributeListener:监听session属性的增加、移除、以及属性值得改变
3. ServletRequest对象监听器:监听request的创建于销毁

 

标签:session,request,Filter,Session,cookie,Cookie
From: https://blog.csdn.net/weixin_67205556/article/details/144433175

相关文章

  • 【Spring Boot编程】request session, global session 这几种作用域没有见过
    在Spring框架中,Bean的作用域(Scope)决定了Bean的生命周期和可见性。常见的作用域包括singleton、prototype、request、session和application。你提到的request、session和globalsession作用域主要用于Web应用程序。下面详细介绍这些作用域及其用途,帮助你更好地理解和应用它们。一......
  • MyBatis SqlSession 工具类详解与最佳实践
    MyBatisSqlSession工具类详解与最佳实践博客简介在Java应用开发中,MyBatis是一个非常流行的持久层框架,它简化了数据库操作。为了更好地管理SqlSession的创建和关闭,通常会编写一个工具类来封装这些功能。本文将详细介绍一个优化后的SqlSessionUtils工具类,并解释其设计原......
  • 【语法】高阶函数:map、filter、sorted、reduce
    map【python】Python高阶函数--map函数的详细语法分析与应用实战_pythonmap-CSDN博客filter【python】Python高阶函数--filter函数的高阶用法解析与应用实战_python的filter函数的用法-CSDN博客sorted【python】Python高阶函数--sorted函数的高阶用法解析与应用实战_高阶函......
  • 为什么前后端分离的项目中,后端代码比如java servlet中session就无法跟踪客户端
    这是由于前、后端分离架构的特性导致的。原因如下:1.传统的Web应用vs前后端分离:1.传统Web应用:服务器直接生成完整的HTML页面,session可以轻松地通过cookie来维护。2.前后端分离:前端(通常是单页应用SPA)和后端(API服务)是分开的,它们可能运行在不同的域名下。 2.Session的工作原......
  • SIP和SDP协议中的SESSION ID
    众所周知,SDP协议中Origin("o=")字段名提供会话发起者的信息,其中有会话ID(sessionid)的属性。在VOLTE呼叫场景中,稍加留意,会发现SIPInvite消息的Header中也出现了一个类似的SESSION-ID的属性。 下面简单介绍一下这两个会话ID的区别。SDP协议中的会话ID:详细内容参见RFC456......
  • Cookie的有效期是通过setMaxAge()方法来设置的,请对参数的含义做说明
    `setMaxAge()`方法用于设置Cookie的最大年龄,单位是秒。这个方法的参数决定了Cookie的生命周期,具体含义如下:1.**正数**:设置一个正数作为参数,表示Cookie将在指定的秒数后过期。例如,`setMaxAge(3600)`表示Cookie将在1小时后过期。2.**零(0)**:设置参数为0,表示立即删除......
  • 深入源码解析:Spring Boot 如何加载 Servlet 、Filter 与 Listener
     我们知道,SpringBoot是在SpringMVC的基础上进行了封装,以简化开发者的工作量。尽管如此,SpringBoot的底层架构依然离不开SpringMVC的核心组件,如Servlet、Filter、Listener,以及RequestMappingHandlerMapping和RequestMappingHandlerAdapter等。 在传统的Spring......
  • springboot filter 自定义开放路径
     privateList<String>excludePathPatterns=Arrays.asList("/login/001","/v2/api-docs","/swagger-resources/**","/swagger-ui.html","/we......
  • 说下cookie的优点和使用场景是什么?
    Cookie的优点和使用场景(前端开发):优点:简单易用:CookieAPI比较简单,易于理解和使用,方便开发者快速实现客户端数据的存储和读取。客户端存储:Cookie数据存储在客户端浏览器中,可以减轻服务器端的存储压力,提升网站性能。自动传输:浏览器会在每次请求同一域名下的资源时自动携......
  • 通过session会话将信息在页面与servlet,和不同页面之间的传递
    importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;i......