一、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