Java Web基础面试问题

Cookie 和 Session 的区别

  • 什么是HTTP

    超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议。

    设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。

    HTTP 是无状态协议,说明它不能以状态来区分和管理请求和响应。也就是说,服务器单从网络连接上无从知道客户身份。

    就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理

  1. Cookie

    Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,实际上Cookie是服务器在本地机器上存储的一小段文本,并随着每次请求发送到服务器。

    Cookie技术通过请求和响应报文中写入Cookie信息来控制客户端的状态。

    Cookie会根据响应报文里的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下客户端再向服务端发起请求时,客户端会自动在请求报文中加入Cookie值之后发送出去.

    之后服务端发现客户端发送过来的Cookie后,会检查是那个客户端发送过来的请求,然后对服务器上的记录,最后得到了之前的状态信息。

会话Cookie和持久Cookie

​ 若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie

​ 若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在浏览器的不同进程间共享。这种称为持久Cookie

Cookie交互情景

客户端保存了Cookie之后的发起请求

  1. Session

    服务端执行session机制时候会生成session的id值,这个id值会发送给客户端,客户端每次请求都会把这个id值放到http请求的头部发送给服务端,而这个id值在客户端会保存下来,保存的容器就是cookie,因此当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用。

    PHP中的Session在默认情况下是使用客户端的Cookie来保存Session ID的,所以当客户端的cookie出现问题的时候就会影响Session了。必须注意的是:Session不一定必须依赖Cookie,这也是Session相比Cookie的高明之处。当客户端的Cookie被禁用或出现问题时,PHP会自动把Session ID附着在URL中,这样再通过Session ID就能跨页使用Session变量了。

  2. Cookie与Session的区别

cookie数据存放在客户的浏览器(客户端)上,session数据放在服务器上,但是服务端的session的实现对客户端的cookie有依赖关系的;

cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session;

session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用COOKIE;

单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K;

参考:https://juejin.cn/post/6844903937523482631

为什么有session?

因为HTTP协议是超文本传输协议,是无状态协议,也就是说,你连续访问某个网页100次和访问1次对服务器是没有区别的。session,主要解决两个问题,一个是钥匙的问题,一个是存储用户信息的问题。

第一个问题:cookie,如果你想要用户建立一次会话,可以在用户授权成功时给他一个cookie,叫会话id,它当然是唯一的,如果下次发现用户带了这个cookie,服务器就知道了

第二个问题:如何存储用户的信息,服务器知道会话id为abc的用户来了,那abc想存储自己的私人信息,比如购物车信息,如何处理?这个时候可以用内存、也可以用文件,也可以用数据库了,但有个要求是,数据需要用用户的会话id即可取到,比如php就默认会把会话id为abc的用户会话数据存储到/tmp/phpsess_abc的文件里面,每次读取都要反序列化程序可以理解的数据,写的时候又需要序列化为持久的数据格式。

如何实现cookie的共享?

  • Tomcat集群Session全局复制(集群内每个tomcat的session完全同步)【会影响集群的性能呢,不建议】

  • 根据请求的IP进行Hash映射到对应的机器上(这就相当于请求的IP一直会访问同一个服务器)【如果服务器宕机了,会丢失了一大部分Session的数据,不建议】

  • 把Session数据放在Redis中(使用Redis模拟Session)【建议】

session何时创建,何时删除?

session的创建:在服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同创建Session的方法,而在Java中是通过调用HttpServletRequest的getSession方法创建的。

session的删除:超时,程序调用HttpSession.invalidate(),程序关闭

如果客户端禁止cookie 能实现 session 还能用吗?

Cookie 与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。

但为什么禁用Cookie就不能得到Session呢?因为Session是用SessionID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的禁用Cookie相当于失去了Session ID,也就得不到Session了。

  • 加入用户关闭Cookie的情况下使用Session,实现途径:

    1. 手动通过URL传值、隐藏表单传递Session ID。
    2. 用文件、数据库等形式保存Session ID,在跨页过程中手动调用。

GET和POST的区别?

  1. **get是从服务器上获取数据,post是向服务器传送数据。**get 和 post 只是一种传递数据的方式,get也可以把数据传到服务器,他们的本质都是发送请求和接收结果。

  2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一 一对应,在URL中可以看到。

    post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

  3. 对于get方式,服务器端用Request.QueryString获取变量的值,

对于post方式,服务器端用Request.Form获取提交的数据。

  1. get传送的数据量较小,不能大于2KB。

    post传送的数据量较大,一般被默认为不受限制。

  2. get安全性非常低,post安全性较高。

转发和重定向的区别和使用

转发的特点:

  1. 地址栏不会发生改变,显示的是上一个页面的地址
  2. 请求次数:只有1次请求
  3. 请求域中数据不会丢失

重定向的特点:

  1. 地址栏:显示新的地址,发生改变
  2. 请求次数:2次,不能使用request对象来共享数据
  3. 请求域中的数据会丢失,因为是两次请求,可以访问其他站点的资源

什么时候使用转发,什么时候使用重定向?

如果要保留请求域中的数据,使用转发,否则使用重定向。

访问数据库,增删改查使用重定向,查询使用转发

Cookie和Session问题进阶

第一层

什么是 Cookie

HTTP Cookie(也叫 Web Cookie或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。

Cookie 主要用于以下三个方面:

  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

什么是 Session

Session 代表着服务器和客户端一次会话的过程。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当客户端关闭会话,或者 Session 超时失效时会话结束。

第二层

Cookie 和 Session 有什么不同?

  • 作用范围不同,Cookie 保存在客户端(浏览器),Session 保存在服务器端。
  • 存取方式的不同,Cookie 只能保存 ASCII,Session 可以存任意数据类型,一般情况下我们可以在 Session 中保持一些常用变量信息,比如说 UserId 等。
  • 有效期不同,Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭或者 Session 超时都会失效。
  • 隐私策略不同,Cookie 存储在客户端,比较容易遭到不法获取,早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取;Session 存储在服务端,安全性相对 Cookie 要好一些。
  • 存储大小不同, 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie。

第三层

为什么需要 Cookie 和 Session,他们有什么关联?

说起来为什么需要 Cookie ,这就需要从浏览器开始说起,我们都知道浏览器是没有状态的(HTTP 协议无状态),这意味着浏览器并不知道是张三还是李四在和服务端打交道。这个时候就需要有一个机制来告诉服务端,本次操作用户是否登录,是哪个用户在执行的操作,那这套机制的实现就需要 Cookie 和 Session 的配合。

那么 Cookie 和 Session 是如何配合的呢?我画了一张图大家可以先了解下。

用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建创建对应的 Session ,请求返回时将此 Session 的唯一标识信息 SessionID 返回给浏览器,浏览器接收到服务器返回的 SessionID 信息后,会将此信息存入到 Cookie 中,同时 Cookie 记录此 SessionID 属于哪个域名。

当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在 Cookie 信息,如果存在自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的 Session 信息,如果没有找到说明用户没有登录或者登录失效,如果找到 Session 证明用户已经登录可执行后面操作。

根据以上流程可知,SessionID 是连接 Cookie 和 Session 的一道桥梁,大部分系统也是根据此原理来验证用户登录状态。

第四层

既然服务端是根据 Cookie 中的信息判断用户是否登录,那么如果浏览器中禁止了 Cookie,如何保障整个机制的正常运转。

第一种方案,每次请求中都携带一个 SessionID 的参数,也可以 Post 的方式提交,也可以在请求的地址后面拼接 xxx?SessionID=123456...

第二种方案,Token 机制。Token 机制多用于 App 客户端和服务器交互的模式,也可以用于 Web 端做用户状态管理。

Token 的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。Token 机制和 Cookie 和 Session 的使用机制比较类似。

当用户第一次登录后,服务器根据提交的用户信息生成一个 Token,响应时将 Token 返回给客户端,以后客户端只需带上这个 Token 前来请求数据即可,无需再次登录验证。

四层楼的内容,一部分同学可以讲清楚。

第五层

如何考虑分布式 Session 问题?

在互联网公司为了可以支撑更大的流量,后端往往需要多台服务器共同来支撑前端用户请求,那如果用户在 A 服务器登录了,第二次请求跑到服务 B 就会出现登录失效问题。

分布式 Session 一般会有以下几种解决方案:

  • Nginx ip_hash 策略,服务端使用 Nginx 代理,每个请求按访问 IP 的 hash 分配,这样来自同一 IP 固定访问一个后台服务器,避免了在服务器 A 创建 Session,第二次分发到服务器 B 的现象。
  • Session 复制,任何一个服务器上的 Session 发生改变(增删改),该节点会把这个 Session 的所有内容序列化,然后广播给所有其它节点。
  • 共享 Session,服务端无状态话,将用户的 Session 等信息使用缓存中间件来统一管理,保障分发到每一个服务器的响应结果都一致。

建议采用第三种方案。

第六层

如何解决跨域请求?

解决跨域请求的常用方法是:

  • 通过代理来避免,比如使用 Nginx 在后端转发请求,避免了前端出现跨域的问题。
  • 通过 Jsonp 跨域
  • 其它跨域解决方案

Java Web基础面试问题——Cookie和Session相关推荐

  1. Java Web基础

    目录 Java Web基础 HTML基础 HTML补充 CSS基础 CSS补充 JavaScript基础 JavaScript补充(例题) Java Web补充 Java Web基础 HTML基础 标 ...

  2. Java web servers 间是如何实现 session 同步的

     Java web servers 间是如何实现 session 同步的 有一个多月的时间没有更新博客了,今天终于忙里偷闲,可以把近期的收获总结一下. 本文是关于Java web servers 之间 ...

  3. Java web后端4 会话 Cookie Session

    会话 会话:指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应的过程. 客户端和服务器的请求和响应的过程(对话双方只要有一方发生变化,都属于不同的会话) 超时间隔[距离上一次请求的 ...

  4. Java web基础学习笔记

    1.xml概述 1.1xml:xml一种数据存储格式,这种数据存储格式在存储数据内容的同时,还能够保存数据之间的关系 1.2xml保存数据的方法:xml利用标签来保存数据的内容,利用标签之间的嵌套关系 ...

  5. 【转】Java学习---Java Web基础面试题整理

    [原文]https://www.toutiao.com/i6592359948632457731/ 1.什么是Servlet? 可以从两个方面去看Servlet: a.API:有一个接口servlet ...

  6. 四、PHP基础——会话技术Cookie 和 Session

    会话技术初步认识 会话技术介绍 web会话可简单理解为:用户开一个浏览器,访问某一个web站点,在这个站点点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. HTTP协 ...

  7. Java Web学习总结(10)——Session详解

    摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术.本文将详细讨论session的工作机制并且对在Java ...

  8. java web数据库面试_数据库面试技巧,通过JDBC展示自己专业性,摘自java web轻量级开发面试教程...

    importjava.sql.Connection;2 importjava.sql.DriverManager;3 importjava.sql.ResultSet;4 importjava.sql ...

  9. java arraystoreexception_java基础面试

    前言 熬夜整理了一份java基础面试题,希望大家支持,如果文中有错误希望大家指正: 公众号:「知识追寻者」 ❝ 知识追寻者(Inheriting the spirit of open source, ...

最新文章

  1. 关于动态门户WEB博雅互动的源代码(HTML+CSS+javascript)
  2. Doom HDU - 5239(线段树+思维)
  3. Error:(1, 10) java: 需要class, interface或enum
  4. 【课题总结】OpenCV 抠图项目实战(3)抠图综述
  5. UVALive 4329 Ping pong
  6. Visual Studio 2019 16.2.2 发布
  7. Tomcat Maven插件分环境运行配置
  8. PDPS教程之工艺仿真必备软件
  9. Succinctly 中文系列教程(三)20220109 更新
  10. 实录分享|一篇文章看CNTV的容器化探索和平台搭建
  11. 文本溢出隐藏显示...和英文换行
  12. 【计算机视觉】深度相机(八)--OpenNI及与Kinect for windows SDK的比较
  13. 如何选购护眼灯呢?南卡/明基/孩视宝台灯哪个比较好?「测评三款热销护眼灯」
  14. HackerRank Truck Tour
  15. h3cr4900g3安装系统_H3C R4900 G2服务器通过HDM安装系统
  16. 第四次产业革命源于人工智能(趋势解读20k字)
  17. 《大话脑科学》之:熟练掌握十门外语之从入门到放弃之语言相关ERP
  18. 主机升级rsyslog后服务异常分析,rsyslog服务重启报错
  19. P2P 之 UDP穿透NAT的原理与实现(附源代码)
  20. python int 函数用法

热门文章

  1. 【控制工程1】弹簧系统运动控制方案及simulink仿真
  2. GNSS定位原理(伪距)
  3. ArcBlock 博客 | OCAP超简易集成攻略(Android 篇)
  4. day 3:蓝桥杯python 杨辉三角知识点
  5. 使用Docker安装Nginx并配置端口转发
  6. 如何把mkv转成mp4,请看详细步骤
  7. 【专题】2022年全球手游市场报告PDF合集分享(附原数据表)
  8. java基础笔记07-枚举、异常
  9. 挑战100+Python项目4:练习英语口语
  10. h5 获取当前地理位置信息