JSP与Servlet面试题
📋 本文节选自《Java常见面试题 8000 道》,返回 查看全部章节
88、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没有内置对象。
89、jsp 有哪些内置对象?作用分别是什么?
JSP九大内置对象:
1、 pageContext,页面上下文对象,相当于页面中所有功能的集合,通过它可以获取JSP页面的out、request、response、session、application对象;
2、 request;
3、 response;
4、 session;
5、 application,应用程序对象,application实现了用户间数据的共享,可存放全局变量,它开始于服务器启动,知道服务器关闭;
6、 page,就是JSP本身;
7、 exception;
8、 out,out用于在web浏览器内输出信息,并且管理应用服务器上的输出缓冲区,作用域page;
9、 config,取得服务器的配置信息;
90、forward 和 redirect 的区别?
1、 forward是直接请求转发;redirect是间接请求转发,又叫重定向;
2、 forward,客户端和浏览器执行一次请求;redirect,客户端和浏览器执行两次请求;
3、 forward,经典的MVC模式就是forward;redirect,用于避免用户的非正常访问(例如用户非正常访问,servlet就可以将HTTP请求重定向到登录页面);
4、 forward,地址不变;redirect,地址改变;
5、 forward常用方法:RequestDispatcher类的forward()方法;redirect常用方法:HttpServletRequest类的sendRedirect()方法;
91、说一下 jsp 的 4 种作用域?
application、session、request、page
92、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不支持跨域;
93、如果客户端禁止 cookie 能实现 session 还能用吗?
一般默认情况下,在会话中,服务器存储 session 的 sessionid 是通过 cookie 存到浏览器里。
如果浏览器禁用了 cookie,浏览器请求服务器无法携带 sessionid,服务器无法识别请求中的用户身份,session失效。
但是可以通过其他方法在禁用 cookie 的情况下,可以继续使用session。
1、 通过url重写,把sessionid作为参数追加的原url中,后续的浏览器与服务器交互中携带sessionid参数;
2、 服务器的返回数据中包含sessionid,浏览器发送请求时,携带sessionid参数;
3、 通过Http协议其他header字段,服务器每次返回时设置该header字段信息,浏览器中js读取该header字段,请求服务器时,js设置携带该header字段;
94、什么是上下文切换?
多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。
概括来说就是:当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。
上下文切换通常是计算密集型的。也就是说,它需要相当可观的处理器时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间。所以,上下文切换对系统来说意味着消耗大量的 CPU 时间,事实上,可能是操作系统中时间消耗最大的操作。
Linux 相比与其他操作系统(包括其他类 Unix 系统)有很多的优点,其中有一项就是,其上下文切换和模式切换的时间消耗非常少。
95、cookie、session、token
1、 session机制;
![ ][nbsp 12]
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机制;
![ ][nbsp 13]
适用于前后端分离的项目(前后端代码运行在不同的服务器下)
请求登录时,token和sessionid原理相同,是对key和key对应的用户信息进行加密后的加密字符,登录成功后,会在响应主体中将{token:“字符串”}返回给客户端。
客户端通过cookie都可以进行存储。再次请求时不会默认携带,需要在请求拦截器位置给请求头中添加认证字段Authorization携带token信息,服务器就可以通过token信息查找用户登录状态。
96、说一下 session 的工作原理?
当客户端登录完成后,会在服务端产生一个session,此时服务端会将sessionid返回给客户端浏览器。客户端将sessionid储存在浏览器的cookie中,当用户再次登录时,会获得对应的sessionid,然后将sessionid发送到服务端请求登录,服务端在内存中找到对应的sessionid,完成登录,如果找不到,返回登录页面。
97、http 响应码 301 和 302 代表的是什么?有什么区别?
1、 301和302状态码都表示重定向,当浏览器拿到服务器返回的这个状态码后悔自动跳转到一个新的URL地址;
2、 301代表永久性重定向,旧地址被永久移除,客户端向新地址发送请求;
3、 302代表暂时性重定向,旧地址还在,客户端继续向旧地址发送请求;
4、 303代表暂时性重定向,重定向到新地址时,必须使用GET方法请求新地址;
5、 307代表暂时性重定向,与302的区别在于307不允许从POST改为GET;
6、 307代表永久性重定向,与301的区别在于308不允许从POST改为GET;