一篇复习完JavaWeb Servlet基础知识

一、Servlet简介

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是指用Java语言编写的服务器端程序。

主要功能在于交互式浏览和修改数据(即用于接收和响应客户端的HTTP请求),生成动态Web内容 。

Servlet在扩展基于HTTP的Web服务器时执行以下主要任务。

(1)读取客户端(浏览器)发送的显式的数据。这包括网页上的HTML表单,或者也可以是来自Applet或自定义的HTTP客户端程序的表单。

(2)读取客户端(浏览器)发送的隐式的HTTP请求数据。这包括Cookies、媒体类型和浏览器能理解的压缩格式等。

(3)处理数据并生成结果。这个过程可能需要访问数据库,执行RMI或CORBA调用,调用Web服务,或者直接计算得出对应的响应。

(4)发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML或XML)、二进制文件(GIF图像)、Excel等。

(5)发送隐式的HTTP响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如HTML),设置Cookies和缓存参数,以及其他类似的任务。

Servlet在扩展基于HTTP的Web服务器时遵循以下过程。

(1)将第一个到达服务器的HTTP请求委派到Servlet容器。

(2)Servlet通过调用init()方法进行初始化。

(3)Servlet调用service()方法来处理客户端的请求,并在适当的时候调用doGet、doPost、doPut、doDelete等方法。

(4)Servlet通过调用destroy()方法终止(结束)。

(5)由JVM的垃圾回收器对Servlet进行垃圾回收。

这一过程包含Servlet从创建直到毁灭的整个过程,又被称为Servlet的生命周期.

 

 1. Servlet的声明

     <servlet>
     <servlet-name>Servlet的名字(自己定义的)</servlet-name>
     <servlet-class>Servlet的完整类名</servlet-class>
     </servlet>

2. Servlet访问方式的声明

     <servlet-mapping>
     <servlet-name>Servlet的名字(应该和声明的时候保持一致)</servlet>
     <url-pattern>访问路径</url-pattern>
     </servlet-mapping>

二、请求头信息

一个HTTP请求报文由请求行、请求头部、空行和请求数据4个部分组成 

 

1. 请求行

请求行由请求方法字段、URL字段和HTTP版本字段三个字段组成,用空格分隔。

例如,GET /index.html HTTP/1.1。

HTTP的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。

这里介绍最常用的GET方法和POST方法。

GET:使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制,如/index.jsp?id=100&op=bind。

POST:POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据。 

 2. 请求头部

请求头部由关键字/值对组成,每行一对,关键字和值之间用英文冒号“:”分隔。

 

3. 空行

最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。

对于一个完整的HTTP请求来说空行是必需的,否则服务器会认为本次请求的数据尚未完全发送到服务器,处于等待状态。

4. 请求数据

请求数据不在GET方法中使用,而是在POST方法中使用。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。 

三、响应头信息

1. 状态行

状态行包括协议版本号、状态码、状态描述。其中,状态码由三位数字组成,表示请求是否被理解或被满足。

2. 响应头

响应头是由关键字/值对组成,每行一对,关键字和值之间用英文冒号“:”分隔。与请求头不同,响应头部通知浏览器有关于服务器响应的信息。 

 

3. 空行

与请求一样,响应头和响应体必须由空行连接。

4. 响应体

响应体主要是包含服务器对于浏览器请求的响应消息,该响应消息可以是一个HTML文档。浏览器可以直接识别这个HTML文件。而如果访问的是一个JSP文件,响应回去的是一个HTML文件,就说明服务器将该JSP翻译成了一个HTML,然后再响应给浏览器。 

 四、Cookie

 Cookie,原意饼干,用来在浏览器端存储用户的状态信息,然后在访问后端的时候将这部分信息带回到后端。

Cookie本质是浏览器保存信息(保存至服务器)的一种方式,可以理解为一个文件,服务器可以通过响应浏览器的set-cookie的标头,得到Cookie的信息。

工作原理

(1)发起请求时:浏览器检查所有存储的Cookie,如果某个Cookie所声明的作用范围(由路径和域决定)大于等于将要请求的资源所在的位置,则把该Cookie附在请求资源的HTTP请求头上发送给服务器。

(2)处理请求时:在服务器端,一般会对请求头中带的Cookie信息做检查(比如说登录检查),如果检查通过,才能进行实际的业务处理。

(3)如果校验不通过,例如没有找到Cookie或者Cookie信息不正确(可能是伪造),跳转让其登录,登录完成之后,在响应中返回Cookie信息,浏览器会根据返回的Cookie信息,保存在硬盘或者内存中供下次使用。

 

 通过Servlet设置Cookie包括以下三个步骤。

步骤1:创建一个Cookie对象。

可以通过调用带有Cookie名称和Cookie值的Cookie构造函数,Cookie名称和Cookie值都是字符串,

例如:Cookie cookie = new Cookie("key","value");

另外,无论是名字还是值,都不应该包含空格或“[ ]()=, " / ? @ : ”字符。

步骤2:设置最大生存周期。

可以通过调用setMaxAge方法来指定Cookie能够保持有效的时间(以s为单位)。

例如:cookie.setMaxAge(60*60*24); ——设置一个最长有效期为24小时的cookie

步骤3:发送Cookie到HTTP响应头。

可以通过使用response.addCookie来添加HTTP响应头中的Cookie。

例如:response.addCookie(cookie);

通过Servlet删除Cookie是非常简单的,只需要按照以下三个步骤进行即可。

步骤1:读取一个现有的Cookie,并把它存储在Cookie对象中。

步骤2:使用setMaxAge()方法设置Cookie的年龄为零,来删除现有的Cookie。

步骤3:把这个Cookie添加到响应头。 

//删除第i个cookie

Cookie cookie = HttpServletRequest. getCookies()[i];

cookie.setMaxAge(0);

response.addCookie(cookie);

五、Session 

Session是用来在服务器端保存用户的信息

其工作原理如下。

(1)浏览器发起请求时,服务器首先会读取请求头中的Session信息。如果没有找到Session信息或者本地检索不到此Session ID,就新生成一个Session ID,存储到服务器硬盘或者内存中。

(2)浏览器接收到响应,会将这个返回的Session ID在本地内存也保存一份,供下一次请求使用。Session保存在本地的其中一种实现方案是保存信息在Cookie上,但是实际上Cookie并不是Session保存的唯一解决方案,使用URL重写的方式也可以(把Session id直接附加在URL路径的后面)。

有以下三种方式来维持Web客户端和Web服务器之间的Session会话。

1. Cookies

一个Web服务器可以分配一个唯一的Session会话ID作为每个Web客户端的Cookie,对于客户端的后续请求可以使用接收到的Cookie来识别。这可能不是一个有效的方法,因为很多浏览器不支持Cookie,所以建议不要使用这种方式来维持Session会话。

2. 隐藏的表单字段

一个Web服务器可以发送一个隐藏的HTML表单字段,以及一个唯一的Session会话ID,例如:<input type="hidden" name="sessionid" value="12345">该条目意味着,当表单被提交时,指定的名称和值会被自动包含在GET或POST数据中。每次当Web浏览器发送回请求时,session_id值可以用于保持不同的Web浏览器的跟踪。

这可能是一种保持Session会话跟踪的有效方式,但是单击常规的超文本链接(<A HREF…>)不会导致表单提交,因此隐藏的表单字段也不支持常规的Session会话跟踪。

3. URL重写

可以在每个URL末尾追加一些额外的数据来标识Session会话,服务器会把该Session会话标识符与已存储的有关Session会话的数据相关联。

例如,http://w3cschool.cc/file.htm;sessionid=12345,Session会话标识符被附加为sessionid=12345,标识符可被Web服务器访问以识别客户端。

URL重写是一种更好的维持Session会话的方式,它在浏览器不支持Cookie时能够很好地工作,但是它的缺点是会动态生成每个URL来为页面分配一个Session会话ID,即使是在很简单的静态HTML页面中也会如此。

 Servlet还提供了HttpSession接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。Servlet容器使用这个接口来创建一个HTTP客户端和HTTP服务器之间的Session会话。会话持续一个指定的时间段,跨多个连接或页面请求。通过调用HttpServletRequest的公共方法getSession()来获取HttpSession对象,例如:

HttpSession session = request.getSession();

 

 有以下几种选择来删除Session会话数据。

(1)移除一个特定的属性:通过调用public void removeAttribute(String name)方法来删除与特定的键相关联的值。

(2)删除整个Session会话:可以通过调用public void invalidate()方法来丢弃整个Session会话。设置Session会话过期时间:或者可以通过调用public void setMaxInactiveInterval(int interval)方法来单独设置Session会话超时。

(3)注销用户:如果使用的是支持Servlet 2.4的服务器,可以调用logout来注销Web服务器的客户端,并把属于所有用户的所有Session会话设置为无效。

(4)web.xml配置:如果使用的是Tomcat,除了上述方法,还可以在web.xml文件中配置Session会话超时,代码如下。

 在一个Servlet中的getMaxInactiveInterval()方法会返回Session会话的超时时间,以s为单位。所以,如果在web.xml中配置Session会话超时时间为15min,那么getMaxInactiveInterval()会返回900。

六、Servlet API编程常用的类和接口 

javax.servlet.Servlet接口

Servlet抽象集是javax.servlet.Servlet接口,它规定了必须由Servlet类实现由Servlet引擎识别和管理的方法集。

Servlet接口的基本目标是提供生命期,有init()、service()和destroy()等方法。

Servlet接口中有以下几个方法。

(1)void init(ServletConfit config)throws ServletException——在Servlet被载入后和实施服务前由Servlet引擎进行一次性调用。如果init()产生溢出UnavailableException,则Servlet退出服务。

(2)ServletConfig getServletConfig()——返回传递到Servlet的init()方法的ServletConfig对象。 

(3)void service(ServletRequest request, ServletResponse response)throws ServletException, IOException——处理request对象中描述的请求,使用response对象返回请求结果。

(4)String getServletInfo()——返回描述Servlet的一个字符串。

(5)void destory()——当Servlet将要卸载时由Servlet引擎调用。 

javax.servlet.GenericServlet类

GenericServlet是一种与协议无关的Servlet,是一种跟本不对请求提供服务的Servlet,而是简单地从init()方法启动后台线程并在destory()中杀死。它可以用于模拟操作系统的端口监控进程。Servlet API提供了Servlet接口的直接实现,称为GenericServlet。此类提供除了service()方法外所有接口中方法的默认实现。这意味着通过简单地扩展GenericServlet可以编写一个基本的Servlet。

除了Servlet接口外,GenericServlet也实现了ServletConfig接口,处理初始化参数和Servlet上下文,提供对授权传递到init()方法中的ServletConfig对象的方法。

GenericServlet类中有以下几个方法:

(1)String getInitParameter(String name)——返回具有指定名称的初始化参数值,一般通过调用config.getInitParameter(name)方法来实现。 

(2)ServletConfig getServletConfig()——返回传递到init()方法的ServletConfig对象。

(3)ServletContext getServletContext()——返回在config对象中引用的ServletContext。

(4)void init()throws ServletException——可以被跳过以处理Servlet初始化。在config对象被保存后init(ServletConfig config)的结尾处自动被调用,Servlet作者经常会忘记调用super.init(config)。

(5)void log(String msg, Throwable t)——编写一个入口和Servlet注册的栈轨迹。此方法也是ServletContext中相应方法的一个副本。

(6)abstract void service(Request request, Response response)throws ServletException, IOException——由Servlet引擎调用为请求对象描述的请求提供服务。这是GenericServlet中唯一的抽象方法。因此它也是唯一必须被子类所覆盖的方法。

(7)String getServletName()——返回在Web应用发布描述器(web.xml)中指定的Servlet的名字。

javax.servlet.http.HttpServlet类

虽然Servlet API允许扩展到其他协议,但最终所有的Servlet均在Web环境下实施操作,只有几种Servlet直接扩展了GenericServlet。对Servlet更一般的操作是扩展其HTTP子类HttpServlet。HttpServlet类通过调用指定到HTTP请求方法的方法实现service(),亦即对DELETE、HEAD、GET、OPTIONS、POST、PUT和TRACE,分别调用doDelete()、doHead()、doGet()、doOptions()、doPost()、doPut()和doTrace()方法,将请求和响应对象置入其HTTP指定子类。 

HttpServlet类中有以下几个方法。

(1)void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException——由Servlet引擎调用处理一个HTTP GET请求。输入参数、HTTP头标和输入流可从request对象、response头标和response对象的输出流中获得。

(2)void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException——由Servlet引擎调用处理一个HTTP POST请求。输入参数、HTTP头标和输入流可从request对象、response头标和response对象的输出流中获得。

(3)void doDelete(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException——由Servlet引擎调用处理一个HTTP DELETE请求。请求URI指出资源被删除。

(4)void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException——Service(Request request, Response response)调用的一个立即方法,带有指定HTTP请求和响应。此方法实际上将请求导向doGet()、doPost()等。

(5)void service(Request request, Response response)throws ServletException, IOException——将请求和响应对象置入其指定的HTTP子类,并调用指定HTTP的service()方法。 

javax.servlet.ServletRequest类

ServletRequest接口封装了客户端请求的细节。它与协议无关,并有一个指定HTTP的子接口。

ServletRequest主要处理的是:

(1)找到客户端的主机名和IP地址。

(2)检索请求参数。

(3)取得和设置属性。

(4)取得输入和输出流。 

ServletRequest类中有以下几个方法。

(1)Object getAttribute(String name)——返回具有指定名字的请求属性,如果不存在则返回null。属性可由Servlet引擎设置或使用setAttribute()显式加入。

(2)String getCharacteEncoding()——返回请求所用的字符编码。

(3)String getParameter(String name)——返回指定输入参数,如果不存在,返回null。(4)Enumeration getParameterName()——返回请求中所有参数名的一个可能为空的枚举。

(5)String[] getParameterValues(String name)——返回指定输入参数名的取值数组,如果取值不存在则返回null。它在参数具有多个取值的情况下十分有用。 

(6)String getServerName()——返回处理请求的服务器的主机名。

(7)String getServerPort()——返回接收主机正在侦听的端口号。

(8)String getRemoteAddr()——返回客户端主机的数字型IP地址。

(9)String getRemoteHost()——如果正确,返回客户端主机名。

(10)void setAttribute(String name, Object obj)——以指定名称保存请求中指定对象的引用。

(11)void removeAttribute(String name)——从请求中删除指定属性。

(12)boolean isSecure()——如果请求使用了如HTTPS安全隧道,返回true。

javax.servlet.http.HttpServletRequest接口

HttpServletRequest类主要处理的是: 

(1)读取和写入HTTP头标。

(2)取得和设置Cookies。

(3)取得路径信息。

(4)标识HTTP会话。

HttpServletRequest接口中有以下几个方法。

(1)String getAuthType()——如果Servlet由一个鉴定方案所保护,如HTTP基本鉴定,则返回方案名称。

(2)String getContextPath()——返回指定Servlet上下文(Web应用)的URL的前缀。

(3)Cookie[] getCookies()——返回与请求相关Cookie的一个数组。

(4)Long getDateHeader(String name)——将输出转换成适合构建Date对象的long类型取值的getHeader()的简化版。

(5)int getIntHeader(String name)——将输出转换为int取值的getHeader()的简化版。 

(6)String getMethod()——返回HTTP请求方法(例如GET、POST等)。

(7)String getPathInfo()——返回在URL中指定的任意附加路径信息。

(8)String getPathTranslated()——返回在URL中指定的任意附加路径信息,被子转换成一个实际路径。

(9)String getQueryString()——返回查询字符串,即URL中“?”后面的部分。

(10)String getRequestedSessionId()——返回客户端的会话ID。

(11)String getRequestURI()——返回URL中一部分,从“/”开始,包括上下文,但不包括任意查询字符串。

(12)String getServletPath()——返回请求URI上下文后的子串。

(13)HttpSession getSession(boolean create)——返回当前HTTP会话,如果不存在,则创建一个新的会话,create参数为true。

(14)boolean isRequestedSessionIdFromCookie()——如果请求的会话ID由一个Cookie对象提供,则返回true,否则为false。

(15)boolean isRequestedSessionIdFromURL()——如果请求的会话ID在请求URL中解码,返回true,否则为false。

(16)boolean isRequestedSessionIdValid()——如果客户端返回的会话ID仍然有效,则返回true。

(17)Boolean isUserInRole(String role)——如果当前已通过鉴定用户与指定角色相关,则返回true,如果不是或用户未通过鉴定,则返回false。

 javax.servlet.ServletResponse接口

ServletResponse对象将一个Servlet生成的结果传到发出请求的客户端。ServletResponse操作主要是作为输出流及其内容类型和长度的包容器,它由Servlet引擎创建。

ServletResponse接口中有以下方法。

(1)void flushBuffer()throws IOException——发送缓存到客户端的输出内容。因为HTTP需要头标在内容前被发送,调用此方法发送状态行和响应头标,以确认请求。

(2)int getBufferSize()——返回响应使用的缓存大小。如果缓存无效则返回0。

(3)String getCharacterEncoding()——返回响应使用字符解码的名字。除非显式设置,否则为ISO-8859。

(4)Locale getLocale()——返回响应使用的现场。除非用setLocale()修改,否则默认为服务器现场。

(5)OutputStream getOutputStream()throws IOException——返回二进制输出写入客户端的流,此方法和getWriter()方法二者只能调用其一。

(6)Writer getWriter()throws IOException——返回文本输出写入客户端的一个字符写入器,此方法和getOutputStream()二者只能调用其一。

(7)boolean isCommitted()——如果状态和响应头标已经被发回客户端,则返回true,在响应被确认后发送响应头标毫无作用。

(8)void reset()——清除输出缓存及任何响应头标。如果响应已得到确认,则引发事件IllegalStateException。

(9)void setBufferSize(int nBytes)——设置响应的最小缓存大小。实际缓存大小可以更大,可以通过调用getBufferSize()得到。如果输出已被写入,则产生IllegalStateException。

(10)void setContentLength(int length)——设置内容体的长度。

(11)void setContentType(String type)——设置内容类型。在HTTP Servlet中即设置Content-Type头标。

(12)void setLocale(Locale locale)——设置响应使用的现场。在HTTP Servlet中,将对Content-Type头标取值产生影响。

javax.servlet.http.HttpServletResponse接口

HttpServletResponse加入表示状态码、状态信息和响应头标的方法,它还负责对URL中写入一Web页面的HTTP会话ID进行解码。

HttpServletResponse接口中有以下几个方法。

(1)void addCookie(Cookie cookie)——将一个Set-Cookie头标加入到响应。

(2)void setHeader(String name, String value)——设置具有指定名字和取值的一个响应头标。

(3)String encodeRedirectURL(String url)——对重定向的url进行编码,如果不需要编码,就直接返回这个url。 

(4)void sendError(int status)——设置响应状态码为指定值(可选的状态信息)。HttpServletResponse定义了一个完整的整数常量集合表示有效状态值。

(5)void setStatus(int status)——设置响应状态码为指定值。只应用于不产生错误的响应,而错误响应使用sendError()。

javax.servlet.ServletContext接口

一个Servlet上下文是Servlet引擎提供用来服务于Web应用的接口。Servlet上下文具有名字(它属于Web应用的名字)唯一映射到文件系统的一个目录。一个Servlet可以通过ServletConfig对象的getServletContext()方法得到Servlet上下文的引用,如果Servlet直接或间接调用子类GenericServlet,则可以使用getServletContext()方法。

Web应用中Servlet可以使用Servlet上下文得到。

(1)在调用期间保存和检索属性的功能,并与其他Servlet共享这些属性。

(2)读取Web应用中文件内容和其他静态资源的功能。

(3)互相发送请求的方式。

(4)记录错误和信息化消息的功能。 

ServletContext接口中有以下几个方法。

(1)Object getAttribute(String name)——返回Servlet上下文中具有指定名字的对象,或使用已指定名捆绑一个对象。从Web应用的标准观点看,这样的对象是全局对象,因为它们可以被同一Servlet在另一时刻访问,或上下文中任意其他Servlet访问。

(2)void setAttribute(String name, Object obj)——设置Servlet上下文中具有指定名字的对象。

(3)ServletContext getContext(String uripath)——返回映射到另一URL的Servlet上下文。在同一服务器中URL必须是以“/”开头的绝对路径。

(4)String getInitParameter(String name)——返回指定上下文范围的初始化参数值。此方法与ServletConfig方法名称不一样,后者只应用于已编码的指定Servlet。此方法应用于上下文中所有的参数。 

(5)int getMajorVersion()——返回此上下文中支持Servlet API级别的最大和最小版本号。

(6)String getMimeType(String fileName)——返回指定文件名的MIME类型。典型情况是基于文件扩展名,而不是文件本身的内容(它可以不必存在)。如果MIME类型未知,可以返回null。

(7)String getRealPath(String path)——给定一个URI,返回文件系统中URI对应的绝对路径。如果不能进行映射,返回null。

(8)URL getResource(String path)——返回相对于Servlet上下文或读取URL的输入流的指定绝对路径相对应的URL,如果资源不存在则返回null。

(9)String getServerInfo()——返回Servlet引擎的名称和版本号。

(10)void log(String message, Throwable t)——将一个消息写入Servlet注册,如果给出Throwable参数,则包含栈轨迹。

(11)void removeAttribute(String name)——从Servlet上下文中删除指定属性。

Servlet类和接口的关系图 

 

 

就业面试解析与技巧 

面试官:简述一下自己对Servlet作用原理和Servlet生命周期的理解。

应聘者:Servlet工作原理主要是反射+回调。

Servlet的执行是其容器如Tomcat通过web.xml的配置反射出Servlet对象后回调其Service方法。目前,所有的MVC框架的Controller基本都是这种模式。

Servlet生命周期主要包括三部分:

①初始化,Web容器加载Servlet,调用init()方法;

②处理请求,当请求到达时,运行其service()方法,service()自动派遣运行与请求相对应的do×××(doGet或者doPost)方法;

③销毁,服务结束,Web容器会调用Servlet的distroy()方法销毁Servlet。

技巧:开放性试题,在正确表达对其认识的基础上,语言应尽量简洁。另外,用一句话表达自己对其相关应用的正确看法,会得到HR的赏识,解析里提到的MVC框架即是。

面试官:请列举几个你所熟知的请求头和响应头。

应聘者:1. HTTP请求头

(1)accept:浏览器通过这个头告诉服务器,它所支持的数据类型,如text/html, image/jpeg。

(2)accept-Charset:浏览器通过这个头告诉服务器,它支持哪种字符集。

(3)host:浏览器通过这个头告诉服务器,它想访问哪台主机。 

(4)if-modified-since:浏览器通过这个头告诉服务器,缓存数据的时间。

(5)Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是维持链接。

2. HTTP响应头

(1)location:服务器通过这个头告诉浏览器跳到哪里。

(2)server:服务器通过这个头告诉浏览器服务器的型号。

(3)refresh:服务器通过这个头告诉浏览器定时刷新。以下三个表示服务器通过这个头告诉浏览器不要缓存。

(1)expires:-1。

(2)cache-control:no-cache。

(3)pragma:no-cache。

技巧:开放性试题,写出常用的几个即可,切勿只写名字,不写作用,只需要用简洁的语言描述一下其功能即可,如果在最后再简单对比总结一下,会更加得到HR的赏识。

面试官:请对比分析一下Cookie和Session的区别。

应聘者:

1. 保存位置稍有区别

Cookie数据存放在客户的浏览器上,服务器端不用保存。Session数据放在服务器上,本地内存也有一份。

2. 安全性不同

Cookie安全性不如Session。因为普通Cookie保存在本地硬盘上,黑客可以伪造URL等方式发起XSS攻击,获取本地硬盘保存状态的Cookie,进而窃取用户的敏感信息。Session则不同,只有在用户登录此网站时发起XSS攻击才能获取Session信息,关闭浏览器之后,Session即被销毁,安全性较Cookie要好。

3. 跨域支持上的不同 

Cookie支持跨域名访问,例如,将domain属性设置为“.biaodianfu.com”,则以“.biaodianfu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中,例如Google、Baidu、Sina等。而Session则不会支持跨域名访问。Session仅在它所在的域名内有效。

4. 服务器压力的不同

Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。因而像Google、Baidu、Sina这样并发访问量极高的网站,是不太可能运用Session来追踪客户会话的。考虑到减轻服务器性能方面,应当使用Cookie。

5. 存取方式的不同

Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比较艰难的。而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类、对象等,运用起来十分方便。可以把Session看作一个Java容器类。

6. Cookie的保存内容大小有限制

单个Cookie保存的数据不能超过4KB,很多浏览器都限制一个站点最多保存20个Cookie。

7. 目前应用不同

Cookie常用于单点登录,保存公共加密信息。Session常用于验证码,多用户同时登录、在线统计等。

技巧:尽量将所有方面都涵盖在答案里,并尽可能多地表达清楚差别,且一定要注意,题目要求对比分析,不能只简单说区别,重要的是要对比和分析。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值