Java 面试题 (四) --------- web 相关

1、jsp 和 servlet 有什么区别?

(1)servlet 是服务器端的 Java 程序,它担当客户端和服务端的中间层。

(2)JSP 全名为Java server pages,中文名叫Java服务器页面,其本质是一个简化的servlet设计。JSP是一种动态页面设计,它的主要目的是将表示逻辑从servlet中分离出来。

(3)JVM 只能识别 Java 代码,不能识别 JSP,JSP 编译后变成了 servlet,web 容器将 JSP 的代码编译成 JVM 能够识别的 Java 类(servlet)。

(4)JSP有内置对象、servlet没有内置对象。

2、forward 和 redirect 的区别?

forward 是直接请求转发;redirect 是间接请求转发,又叫重定向。

forward,客户端和浏览器执行一次请求;redirect,客户端和浏览器执行两次请求。
forward,经典的MVC模式就是forward;redirect,用于避免用户的非正常访问。(例如用户非正常访问,servlet就可以将HTTP请求重定向到登录页面)。
forward,地址不变;redirect,地址改变。

forward常用方法:RequestDispatcher类的forward()方法;redirect常用方法:HttpServletRequest类的sendRedirect()方法。

3、session 和 cookie 有什么区别?

(1)存储位置不同

cookie在客户端浏览器;
session在服务器;

(2)存储容量不同

cookie<=4K,一个站点最多保留20个cookie;
session没有上线,出于对服务器的保护,session内不可存过多东西,并且要设置session删除机制;

(3)存储方式不同

cookie只能保存ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据;
session中能存储任何类型的数据,包括并不局限于String、integer、list、map等;

(4)隐私策略不同

cookie对客户端是可见的,不安全;
session存储在服务器上,安全;

(5)有效期不同

开发可以通过设置cookie的属性,达到使cookie长期有效的效果;
session依赖于名为JESSIONID的cookie,而cookie JSESSIONID的过期时间默认为-1,只需关闭窗口该session就会失效,因而session达不到长期有效的效果;

(6)跨域支持上不同

cookie支持跨域;
session不支持跨域;

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

一般默认情况下,在会话中,服务器存储 session 的 sessionid 是通过 cookie 存到浏览器里。

如果浏览器禁用了 cookie,浏览器请求服务器无法携带 sessionid,服务器无法识别请求中的用户身份,session失效。

但是可以通过其他方法在禁用 cookie 的情况下,可以继续使用session。

通过 url 重写,把 sessionid 作为参数追加的原 url 中,后续的浏览器与服务器交互中携带 sessionid 参数。

服务器的返回数据中包含 sessionid,浏览器发送请求时,携带 sessionid 参数。

通过 Http 协议其他 header 字段,服务器每次返回时设置该 header 字段信息,浏览器中 js 读取该 header 字段,请求服务器时,js设置携带该 header 字段。

5、什么是上下文切换?

多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。

概括来说就是:当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。

上下文切换通常是计算密集型的。也就是说,它需要相当可观的处理器时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间。所以,上下文切换对系统来说意味着消耗大量的 CPU 时间,事实上,可能是操作系统中时间消耗最大的操作。

Linux 相比与其他操作系统(包括其他类 Unix 系统)有很多的优点,其中有一项就是,其上下文切换和模式切换的时间消耗非常少。

6、cookie、session、token

1、session 机制

在这里插入图片描述
session是服务端存储的一个对象,主要用来存储所有访问过该服务端的客户端的用户信息(也可以存储其他信息),从而实现保持用户会话状态。但是服务器重启时,内存会被销毁,存储的用户信息也就消失了。

不同的用户访问服务端的时候会在session对象中存储键值对,“键”用来存储开启这个用户信息的“钥匙”,在登录成功后,“钥匙”通过cookie返回给客户端,客户端存储为sessionId记录在cookie中。当客户端再次访问时,会默认携带cookie中的sessionId来实现会话机制。

(1)session是基于cookie的。

cookie的数据4k左右;
cookie存储数据的格式:字符串key=value
cookie存储有效期:可以自行通过expires进行具体的日期设置,如果没设置,默认是关闭浏览器时失效。
cookie有效范围:当前域名下有效。所以session这种会话存储方式方式只适用于客户端代码和服务端代码运行在同一台服务器上(前后端项目协议、域名、端口号都一致,即在一个项目下)

(2)session持久化

用于解决重启服务器后session消失的问题。在数据库中存储session,而不是存储在内存中。通过包:express-mysql-session。

当客户端存储的cookie失效后,服务端的session不会立即销毁,会有一个延时,服务端会定期清理无效session,不会造成无效数据占用存储空间的问题。

2、token机制

在这里插入图片描述
适用于前后端分离的项目(前后端代码运行在不同的服务器下)

请求登录时,token和sessionid原理相同,是对key和key对应的用户信息进行加密后的加密字符,登录成功后,会在响应主体中将{token:“字符串”}返回给客户端。

客户端通过cookie都可以进行存储。再次请求时不会默认携带,需要在请求拦截器位置给请求头中添加认证字段Authorization携带token信息,服务器就可以通过token信息查找用户登录状态。

7、说一下 session 的工作原理?

当客户端登录完成后,会在服务端产生一个session,此时服务端会将sessionid返回给客户端浏览器。客户端将sessionid储存在浏览器的cookie中,当用户再次登录时,会获得对应的sessionid,然后将sessionid发送到服务端请求登录,服务端在内存中找到对应的sessionid,完成登录,如果找不到,返回登录页面。

8、http 响应码 301 和 302 代表的是什么?有什么区别?

301 和 302 状态码都表示重定向,当浏览器拿到服务器返回的这个状态码后悔自动跳转到一个新的 URL 地址。

301 代表永久性重定向,旧地址被永久移除,客户端向新地址发送请求。
302 代表暂时性重定向,旧地址还在,客户端继续向旧地址发送请求。
303 代表暂时性重定向,重定向到新地址时,必须使用GET方法请求新地址。
307 代表暂时性重定向,与302的区别在于307不允许从POST改为GET。
307 代表永久性重定向,与301的区别在于308不允许从POST改为GET。

9、简述 tcp 和 udp的区别?

TCP是传输控制协议,UDP是用户数据表协议;
TCP长连接,UDP无连接;
UDP程序结构较简单,只需发送,无须接收;
TCP可靠,保证数据正确性、顺序性;UDP不可靠,可能丢数据;
TCP适用于少量数据,UDP适用于大量数据传输;
TCP速度慢,UDP速度快;

10、tcp 为什么要三次握手,两次不行吗?为什么?

因为客户端和服务端都要确认连接,①客户端请求连接服务端;②针对客户端的请求确认应答,并请求建立连接;③针对服务端的请求确认应答,建立连接;

两次无法确保A能收到B的数据;

11、get 和 post 请求有哪些区别?

get请求参数是连接在url后面的,而post请求参数是存放在requestbody内的;
get请求因为浏览器对url长度有限制,所以参数个数有限制,而post请求参数个数没有限制;
因为get请求参数暴露在url上,所以安全方面post比get更加安全;
get请求只能进行url编码,而post请求可以支持多种编码方式;
get请求参数会保存在浏览器历史记录内,post请求并不会;
get请求浏览器会主动cache,post并不会,除非主动设置;
get请求产生1个tcp数据包,post请求产生2个tcp数据包;
在浏览器进行回退操作时,get请求是无害的,而post请求则会重新请求一次;
浏览器在发送get请求时会将header和data一起发送给服务器,服务器返回200状态码,而在发送post请求时,会先将header发送给服务器,服务器返回100,之后再将data发送给服务器,服务器返回 200 OK;

12、什么是 XSS 攻击,如何避免?

xss(Cross Site Scripting),即跨站脚本攻击,是一种常见于web应用程序中的计算机安全漏洞。指的是在用户浏览器上,在渲染DOM树的时候,执行了不可预期的JS脚本,从而发生了安全问题。

XSS就是通过在用户端注入恶意的可运行脚本,若服务端对用户的输入不进行处理,直接将用户的输入输出到浏览器,然后浏览器将会执行用户注入的脚本。 所以XSS攻击的核心就是浏览器渲染DOM的时候将文本信息解析成JS脚本从而引发JS脚本注入,那么XSS攻击的防御手段就是基于浏览器渲染这一步去做防御。只要我们使用HTML编码将浏览器需要渲染的信息编码后,浏览器在渲染DOM元素的时候,会自动解码需要渲染的信息,将上述信息解析成字符串而不是JS脚本,这就是我们防御XSS攻击的核心想法。

预防:

1、获取用户的输入,不用innerHtml,用innerText.
2、对用户的输入进行过滤,如对& < > " ’ /等进行转义;

13、什么是 CSRF 攻击,如何避免?

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

1、攻击细节

跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。

例子

假如一家银行用以运行转账操作的URL地址如下:http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName

那么,一个恶意攻击者可以在另一个网站上放置如下代码:

<img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">

如果有账户名为Alice的用户访问了恶意站点,而她之前刚访问过银行不久,登录信息尚未过期,那么她就会损失1000资金。

这种恶意的网址可以有很多种形式,藏身于网页中的许多地方。此外,攻击者也不需要控制放置恶意网址的网站。例如他可以将这种地址藏在论坛,博客等任何用户生成信息的网站中。这意味着如果服务端没有合适的防御措施的话,用户即使访问熟悉的可信网站也有受攻击的危险。

透过例子能够看出,攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义运行操作。

2、防御措施

检查Referer字段

HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer字段应和请求的地址位于同一域名下。以上文银行操作为例,Referer字段地址通常应该是转账按钮所在的网页地址,应该也位于www.examplebank.com之下。而如果是CSRF攻击传来的请求,Referer字段会是包含恶意网址的地址,不会位于www.examplebank.com之下,这时候服务器就能识别出恶意的访问。

这种办法简单易行,工作量低,仅需要在关键访问处增加一步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的Referer字段。虽然http协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。

3、添加校验token

由于CSRF的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在cookie中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再运行CSRF攻击。这种数据通常是窗体中的一个数据项。服务器将其生成并附加在窗体中,其内容是一个伪随机数。当客户端通过窗体提交请求时,这个伪随机数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪随机数,而通过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个伪随机数的值,服务端就会因为校验token的值为空或者错误,拒绝这个可疑请求。

14、实现跨域的几种方式

实现跨域的几种方式

1、CORS

跨域资源共享,在后端的响应头中设置Access-Control-Allow-Origin: *即可。

2、jsonp

jsonp进行跨域的原理:利用script标签进行网络请求,在本地定义好接收数据的函数,然后通过在请求url中添加参数的方式发送本地函数名,后端通过解析url参数并返回js代码,其中就可包含调用本地函数及传入数据参数的代码。

3、nginx服务器代理

在nginx服务器的默认配置文件nginx.conf中添加:

http {
	server {
	    listen       8088;
	    #listen			 [::]:8088;
	    server_name  47.100.62.167;
	    #root				 /usr/share/nginx;
	    #server_name  localhost;
	    #server_name  192.168.1.3;
	
	    location / {
	      root   html;
	      index  index.html index.htm;
	      # 解决history路由模式下导致的404错误。
	      try_files $uri $uri/ /index.html;
	    }
	
	    # 为项目配置反向代理
	    location /api {
	      proxy_set_header X-Real-IP $remote_addr;
	      # 需要代理的目标url
	      proxy_pass http://111.229.37.167/api/;
	      # 以下配置关闭重定向,让服务端看到用户的IP,而不是nginx服务器的IP
	      proxy_redirect off;
	      proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
	      proxy_set_header Host $http_host;
	      proxy_set_header X-Real_IP $remote_addr;
	      proxy_set_header X-Nginx-Proxy true;
	    }
	}
}

15、websocket应用的是哪个协议

WebSocket是一个允许Web应用程序(通常指浏览器)与服务器进行双向通信的协议。HTML5的WebSocket API主要是为浏览器端提供了一个基于TCP协议实现全双工通信的方法。

WebSocket优势: 浏览器和服务器只需要要做一个握手的动作,在建立连接之后,双方可以在任意时刻,相互推送信息。同时,服务器与客户端之间交换的头信息很小。

16、说一下 tcp 粘包是怎么产生的?

发送方需要等缓冲区满才能发送出去,造成粘包;
接收方不及时接收缓冲区的包,造成粘包;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在森林中麋了鹿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值