1.转发和重定向的区别?
- 转发: 转发地址栏路径不变、 转发只能访问当前服务器下的资源、转发是一次请求,可以使用request对象来共享数据。
- 重定向:地址栏发生变化、重定向可以访问其他站点(服务器)的资源、重定向是两次请求(告诉客户端去访问其他地址),不能使用request对象来共享数据。
2.Cookie的特点
- Cookie是客户端会话技术,将数据保存到客户端。
- 浏览器对于单个cookie 的大小有限制(4kb) 以及对同一个域名下的总cookie数量也有限制(20个),cookie一般用于存出少量的不太敏感的数据,在不登录的情况下,完成服务器对客户端的身份识别。
3.Cookie的生命周期
- 默认情况下,当浏览器关闭后,Cookie数据被销毁。
- 如果想要持久化存储,可以使用setMaxAge(int seconds)。正数:将Cookie数据写到硬盘的文件中,持久化存储,并指定cookie存活时间,时间到后,cookie文件自动失效。负数:默认值。零:删除cookie信息。
4.Cookie可以存储中文数据吗?
- 在tomcat 8 之前cookie中不能直接存储中文数据,需要将中文数据转码—一般采用URL编码(%E3)。
- 在tomcat 8 之后,cookie支持中文数据,特殊字符还是不支持,建议使用URL编码存储,URL解码解析。
5.Cookie的共享范围是什么?
- 假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie默认情况下不能共享。通过setPath(String path)设置cookie的获取范围,默认情况下,设置为当前的虚拟目录,如果要共享,则可以将path设置为/。
- 不同的tomcat服务器间cookie共享问题:通过setDomain(String path)设置一级域名,如果一级域名相同,那么多个服务器之间cookie可以共享。例如setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享。(不建议这么设置!)
6.Session
- Session是服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。
- Session的实现是依赖于Cookie的,服务器是通过cookie中的JESSIONID判断session是否是同一个的。若浏览器禁用Cookie的话,可以通过 URL重写机制 将sessionid传回服务器。
7.Session的生命周期?当客户端关闭后,服务器不关闭,两次获取session是否为同一个?客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
- 服务器关闭、session对象调用invalidate() 时销毁,session默认失效时间 30分钟。
- 在默认情况下,当客户端关闭服务端不关闭时,两次获取session值不是同一个。
- 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。(JESSIONID的默认时效是当前会话)
- 客户端不关闭,服务端关闭,两次获取的session值也不是同一个。但是要确保数据不丢失。tomcat自动完成以下工作。session的钝化: 在服务器正常关闭之前,将session对象序列化到硬盘上。session的活化: 在服务器启动后,将session文件转化为内存中的session对象即可。但是IDEA不支持这种操作,因为每次用IDEA重启tomcat时会自动删除catalina_base中work目录(程序动态生成的文件),这样在关闭tomcat时生成的session序列化文件也会被删除。
8.Session的特点,和Cookie有什么区别?
- Session用于存储一次会话的多次请求的数据,存在服务器端。session可以存储任意类型,任意大小的数据。
- Session存储数据在服务器端,Cookie存储数据在客户端。
- Session没有存储数据的大小限制,Cookie有数据大小限制。
- Session存储数据是安全的,使用Cookie存储数据相对于使用Session来说不安全。
9.过滤器和拦截器的区别
10.JSP四大作用域
application:在所有应用程序中有效,即只要这个网站运行着,这个作用域就有效,这个指的程序的运行过程。
session:在当前会话中有效,即从浏览器访问服务器开始,这个指的是用户的一个访问过程,即这次会话的开始到结束
request:在当前请求中有效,负责多个servlet之间的信息共享,即将信息放入到request中,在整个请求阶段都是有效的,即用户访问的这个阶段都可以获取到这个数据
page:在当前页面有效,即在一个jsp页面上是有效的。
11. Servlet总结
在Java Web程序中,Servlet主要负责接收用户请求 HttpServletRequest,在doGet(),doPost()中做相应的处理,并将回应HttpServletResponse反馈给用户。Servlet 可以设置初始化参数,供Servlet内部使用。一个Servlet类只会有一个实例,在它初始化时调用init()方法,销毁时调用destroy()方法。Servlet需要在web.xml中配置(MyEclipse中创建Servlet会自动配置),一个Servlet可以设置多个URL访问。Servlet不是线程安全,因此要谨慎使用类变量。
12. Servlet生命周期
- Web容器加载Servlet并将其实例化后,Servlet生命周期开始,容器运行其init()方法进行Servlet的初始化;
- 请求到达时调用Servlet的service()方法,service()方法会根据需要调用与请求对应的doGet或doPost等方法;
- 当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的destroy()方法。
init方法和destroy方法只会执行一次,service方法客户端每次请求Servlet都会执行。Servlet中有时会用到一些需要初始化与销毁的资源,因此可以把初始化资源的代码放入init方法中,销毁资源的代码放入destroy方法中,这样就不需要每次处理客户端的请求都要初始化与销毁资源。
13. Servlet与线程安全
Servlet不是线程安全的,多线程并发的读写会导致数据不同步的问题。 解决的办法是尽量不要定义name属性,而是要把name变量分别定义在doGet()和doPost()方法内(局部变量是线程安全的)。虽然使用synchronized(name){}语句块可以解决问题,但是会造成线程的等待,不是很科学的办法。
注意:多线程的并发的读写Servlet类属性会导致数据不同步。但是如果只是并发地读取属性而不写入,则不存在数据不同步的问题。因此Servlet里的只读属性最好定义为final类型的。