Cookie和Session

Cookie

Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问Cookie基本使用

发送Cookie

1.创建Cookie对象,设置数据

​ Cookie cookie=new Cookie(“key”,“value”);

2.发送Cookie到客户端:使用response对象

​ response.addCookie(cookie);

获取Cookie

1.获取客户端携带的所有Cookie,使用request对象

​ Cookie[] cookies = request.getCookies();

2.遍历数组,获取每一个Cookie对象: for

3.使用Cookie对象方法获取数据

​ cookie.getName();

​ cookie.getValue();

Cookie原理

Cookie的实现是基于HTTP协议的

​ 响应头: set-cookie

​ 请求头: cookie

Cookie使用细节

Cookie存活时间

默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁

setMaxAge(int seconds):设置Cookie存活时间

​ 1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除

​ 2.负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁

​ 3.零:删除对应Cookie

Cookie存储中文

Cookie不能直接存储中文

如需要存储,则需要进行转码:URL编码

编码:String value=“张三”;

value = URLEncoder.encode(value, “utf-8”);

解码:value=URLDecoder.decode(value,“utf-8”);

案例

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Objects;

// 用当前这个servlet当做我的主页
@WebServlet(name = "IndexServlet", value = "/index.do")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.获取Cookie
        Cookie[] cookies = request.getCookies();
        if(Objects.nonNull(cookies) && cookies.length > 0){
            System.out.println("发现了cookie...");
            // 有cookie的情况
            for (Cookie cookie : cookies) {
                if(cookie.getName().equals("username")){
                    response.sendRedirect("success.html");
                }
            }
        } else {
            System.out.println("没有发现cookie,创建cookie。。。");
            // 创建cookie
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            if(Objects.equals(username,"admin") && Objects.equals(password,"123456")){
                Cookie cookie = new Cookie("username",username);
                // 设置cookie的最大时效
    //              cookie.setMaxAge(5000);
                // 把cookie放入到响应中
                response.addCookie(cookie);
                response.sendRedirect("success.html");
            }

        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

Session

服务端会话跟踪技术:将数据保存到服务端

JavaEE提供 HttpSession接口,来实现一次会话的多次请求间数据共享功能

使用:

1.获取Session对象

​ HttpSession session = request.getSession();

2.Session对象功能:

​ void setAttribute(String name, Object o):存储数据到session域中

​ Object getAttribute(String name):根据key,获取值

​ void emoveAttribute(String name):根据key,删除该键值对

Session使用细节

​ Session钝化、活化:

​ 服务器重启后,Session中的数据是否还在?

​ 钝化:在服务器正常关闭后, Tomcat会自动将Session数据写入硬盘的文件中

​ 活化:再次启动服务器后,从文件中加载数据到Session中

Seesion销毁:

​ 默认情况下,无操作,30分钟自动销毁

​ <session-config>

​ <session-timeout>30</session-timeout>

​ </session-config>

​ 调用Session对象的invalidate()方法

小结

​ Cookie和Session 都是来完成一次会话内多次请求间数据共享的
区别:

​ 存储位置:Cookie是将数据存储在客户端,Session将数据存储在服务端

​ 安全性:Cookie不安全,Session安全

​ 数据大小: Cookie最大3KB,Session无大小限制

​ 存储时间:Cookie可以长期存储,Session默认30分钟

​ 服务器性能: Cookie不占服务器资源,Session占用服务器资源

Filter 过滤器

  1. Filter 过滤器它是 JavaWeb 的三大组件之一。
    三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
  2. Filter 过滤器它是 JavaEE 的规范。也就是接口
  3. Filter 过滤器它的作用是:拦截请求,过滤响应。

要求:在你的 web 工程下,有一个 admin 目录。这个 admin 目录下的所有资源(html 页面、jpg 图片、jsp 文件…等等)都必须是用户登录之后才允许访问。

思考:根据之前我们学过内容。我们知道,用户登录之后都会把用户登录的信息保存到 Session 域中。所以要检查用户是否登录,可以判断 Session 中否包含有用户登录的信息,即可!!!

初始化
在创建Filter对象,在servlet容器(tomcat)加载当前web应用(当前工程)被调用
只执行一次。当前Filter的初始化操作,Filter和Servlet都是单例的。
FilterConfig类似于ServletConfig,获取初始化参数。

import javax.servlet.*;
import java.io.IOException;

public class HelloFilter implements Filter {
    /*
        初始化
        在创建Filter对象,在servlet容器(tomcat)加载当前web应用(当前工程)被调用
        只执行一次。当前Filter的初始化操作,Filter和Servlet都是单例的。
        FilterConfig类似于ServletConfig,获取初始化参数。
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    /*
      主要过滤请求的方法(核心方法)
      真正Filter要处理的逻辑代码需要写在此方法里,每次拦截都会调用这个方法。
      ServletRequest:实际上当请求来的时候,实例化的还是HttpServletRequest
      ServletResponse:实际上当请求来的时候,实例化的还是HttpServletResponse
      FilterChain:过滤器链,一个项目中是可以有多个过滤器的,会形成一个链,当前过滤器把请求传递给下一个过滤器
        Filter的执行顺序:
            filter-mapping的上下顺序有关
      */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("HelloFilter....");
//        放行请求
        filterChain.doFilter(servletRequest,servletResponse);
    }

    /*销毁*/
    @Override
    public void destroy() {
//        System.out.println("Filter's destroy....");
    }
}

监听器 listener

监听器:
专门用于对其他对象身上发生的事件或状态改变进行监听和相应的处理

分类:
1、监听域对象自身的创建和销毁

2、监听域对象中属性的增加和删除

3、监听绑定到session中的某个对象的状态的事件监听

JavaEE(servlet)三大件:
servlet filter listener

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值