java web——Session/Cookie/Servlet 详解

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

为了解决什么问题?

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 访问任何应用的资源
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值