您的位置:首页 > 编程语言 > Java开发

java web——Session/Cookie/Servlet 详解

2016-07-10 02:39 615 查看
这两年基本没做web开发,都是服务端的开发,最近要写几个web,发现基础知识忘得一塌糊涂!亡羊补牢,犹未晚也。

Cookie

为了解决什么问题?

Http协议是stateless(无状态的),一旦数据交换完毕,客户端与服务器端的连接就会关闭,在服务端不会保存每次请求以及返回的信息。

stateless的好处是:服务端压力相对很小,不用记录每个请求的信息;另外,因为无状态保证了http协议的简单性,因此使用广泛。

stateless的缺点:正是由于HTTP的stateless,因此服务端不会记录请求的相关信息,比如我们登录验证后,跳转另外的页面,会导致之前的验证失效,需要再次登录。

因此引入cookie来解决我们需要保留信息的场景,这样服务端可以识别客户端。

是什么?



打个比方,香港的警察办案总是首先出示警官证(大陆sir我就不说啥了),这个警官证就好比Cookie,香港警察去访问任何公民时,总是要携带Cookie。当然有的公民看完后就还了,有的看完就扔掉自己跑了。

具体的说,就是客户端发送请求,服务端接受到了之后,为了记录一下这个客端,会给客户端产生一些文本的东西(我们成为cookie),然后把这个返回给客户端。下次客户端请求时,会自动带上这个Cookie。Cookie保存在客户端上,默认一个Cookie的生命周期是一个会话(浏览器打开到关闭),但是可以通过设置setMaxAge属性,浏览器关闭后,Cookie会保存到硬盘,直到过期。

查看当前浏览器会话的Cookie,在这个浏览器地址栏输入JavaScript:alert (document. cookie)就可以了(需要有网才能查看)

另外,客户端对Cookie的所有属性都是只读

会产生的疑问

1.一个浏览器打开了不同网站,按照之前的说法,会话没有结束,许多不同网站的cookie都在浏览器上没有清除,那么会不会每次请求浏览器都会把所有的Cookie全部发过去

答案:不会,Cookie不可跨域名发送!浏览淘宝,会发送淘宝颁布的Cookie;浏览苏宁会发送苏宁颁布的Cookie。只会根据域名指定发送相应的Cookie。

2.Cookie乱码问题

为什么有时候(Server端)拿到Cookie会乱码。

答案:中文属于unicode字符,一个字符4字节;英文是ASCII编码,一字符两个字节;Cookie默认ASCII,需要使用中文,则要对中文unicode字符编码为UTF-8后放入cookie。

3.Cookie有效期问题

Cookie中的maxAge属性决定了Cookie的有效期,默认 maxAge=-1表示,会话结束后清楚内存中的cookie。如果服务端设置了maxAge,则客户端关闭了浏览器,如果maxAge没到期,则会把Cookie持久化到内存.

Cookie cookie = new Cookie("name","value");   // 新建Cookie,需要引入Servlet-api
cookie.setMaxAge(Integer.MAX_VALUE);           // 设置生命周期为MAX_VALUE
response.addCookie(cookie);                    // 输出到客户端


4.Cookie 修改、删除

Cookie并不提供修改、删除操作。如果要改变一个已有的Cookie,通常使用Cookie覆盖的方法。

注意:对于覆盖,必须保证这个新的Cookie除了 name、maxAge以为其他的属性(domain、path…)都与要修改的Cookie一样!比如,name相同,domain不同,则这个两个cookie不同。

删除Cookie:setMaxAge(-1)

修改Cookie:覆盖为新的同名Cookie

5.Cookie的Domain、Path属性具体是作用是??

比如:Cookie 的domain属性是www.google.com,表示这个Cookie只能发送给www.google.com的程序或服务器;

比如:Cookie 的path属性是/cookie/,表示这个Cookie只被/cookie/目录下的程序访问。

Cookie cookie = new Cookie("name","value");     // 新建Cookie
cookie.setPath("/cookie/");                          // 设置路径必须以/结尾
response.addCookie(cookie);                           // 输出到客户端


注意:页面只能获取它属于的Path的Cookie。例如/cookie/123/a.jsp不能获取到路径为/session/abc/的Cookie。

6.Cookie的安全性

Cookie又被劫持的可能,以下属性可以尽量保证安全性:

Cookie cookie = new Cookie(“time”, “20080808”); // 新建Cookie

cookie.setSecure(true); // 设置true,则这个Cookie只能在Https、SSL中使用

response.addCookie(cookie);

setHttpOnly方式js脚步拦截

SessionCookieConfig scconfig = request.getServletContext().getSesssionCookieConfig();
scconfig.setHttpOnly(true);


在JavaWeb中使用

Cookie: javax.servlet.http.Cookie

客户端: request.getCookie();

服务端: response.addCookie()

一个request或者response同时使用多个Cookie。因为Cookie类位于包javax.servlet.http.*下面,所以JSP中不需要import该类

在session出现之前都用Cookie做验证登录

Session



session与cookie类似。

session由服务器产生,保存在服务器上,然后会发送把sessionId给客户端,客户端保存在Cookie里,并且默认的setMaxAge(-1),关闭当前浏览器则清楚sessionId.

也就是说如果客户端清除了Cookie,这个session也就是不存在了。禁用cookie当然会导致session无法正常使用,当然可以把session拼到url里

Session的生命周期

服务端创建:第一次访问服务器时服务端生成Session(静态访问不会产生Session)

更新LastAccessedTime:多次访问同一个服务器都会更新最后访问时间等信息。

超时删除: setMaxInactiveInterval(longinterval)控制超时时间,如果超时,服务端删除这个Session.

默认大约20分钟,可以在web.xml中设置:

<session-config>
<session-timeout>60</session-timeout>      <!-- 单位:分钟 -->
</session-config>


使用

Session:javax.servlet.http.HttpSession

void HttpSession.setAttribute(String attribute, Object value)

void HttpSession.removeAttribute(String attribute)

String HttpSession.getId() //sessionId

返回Session的ID。该ID由服务器自动创建,不会重复

HttpSession session = request.getSession();
session.setAttribute("user", User);
session.setAttribute("loginTime", new Date());
response.sendRedirect(/A);


/A:
User u=(User)session.getAttribute("user");
Date loginTime =(Date)session.getAttribute("loginTime");


Seesion使用了Cookie技术,如果Cookie被禁用了,那么Seesion还能用吗?

URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。

Servlet

简单来说就是 J2EE指定的接口规范,通过对API的实现来处理各种不同的请求及其响应。

一个http请求到来,容器将请求封装成servlet中的request对象,

在request中你可以得到所有的http信息,然后你可以取出来操作,

最后你再把数据封装成servlet的response对象,应用容器将respose对象解析之后封装成一个http+response。

Forward与SendRedirect

forward



特点:

1.服务器端的跳转,从一个Servlet到另一个Servlet

2.

request.getRequestDispatcher(“/资源URI”).forward(request,response)


3.浏览器路径不变化,对浏览器透明。调转的Servlet共用 Session、Request、Response

4.forward 只能访问当前的WEB应用的资源

SendRedirect



response.sendRedirect(“/web应用/资源URI”);


1.request在两个Servlet中不同,也就是最初的request attribute失效,但可以用queryString方式传参到URL中

2.Session不失效

3.对用户透明,好比客户端再次访问另一个地址,但是用户不用动手点击。

4.sendRedirect 访问任何应用的资源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: