会话
什么是会话?
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
会话是访问特定web站点时用户执行的一组活动,记住不同会话过程称为会话跟踪。
会话过程中要解决的一些问题?
每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据。
例如:用户点击超链接通过一个servlet购买了一个商品,程序应该保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户商品为用户结帐。
Cookie
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这 样, web资源处理的就是用户各自的数据了。
Session
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
会话:当访问web资源之后,通过连接继续请求当前站点的资源,然后关闭浏览器的整个过程。
会话技术:cookie、session
cookie:将服务器的数据保存到浏览器端的技术
要求保存数据:服务器
保存数据:浏览器
IE;将cookie保存到指定目录中,以文件的形式存储
火狐或谷歌:将cookie保存到指定的文件中
使用HTTP协议进行通信
会话级cookie:当整个会话结束后,cookie信息将被删除(cookie在内存中)
持久化cookie:将cookie保存到硬盘中
setMaxAge
单位:秒
如果设置的值为零,则进行删除操作。
request.getCookies();获得当前web项目的所有的cookie信息
获得当前浏览器中的cookie
获得当前servlet所在目录,以及之上的所有目录下的cookie信息
通过setPath可以设置cookie的访问路径
在cookie中存放中文
编码:String returnData = URLEncoder.encode(data, "UTF-8");
解码:String value = URLDecoder.decode(c.getValue(), "UTF-8");
package cn.itcast.cookie; import java.io.IOException; import java.net.URLDecoder; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CnCookieServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //String[] -- byte[] //"中文".getBytes("UTF-8") -- byte[] -- > 12,45,67,98 //12,45,67,98 --> String[] -- byte[] -- new String() //读取cookie Cookie[] cookies = request.getCookies(); if(cookies != null){ for(Cookie c : cookies){ System.out.println(c.getName() + ":" + c.getValue()); //获得cn的值,然后解码 if("cn".equals(c.getName())){ String value = URLDecoder.decode(c.getValue(), "UTF-8"); System.out.println(value); } } } String data = "中文"; String returnData = URLEncoder.encode(data, "UTF-8"); //base64 Cookie cookie = new Cookie("cn",returnData); response.addCookie(cookie); } }
cookie的value可以设置多少个字符:4kb
session:服务器在服务器端创建一个内存区域,用来存放当前用户的所有信息,通过cookie关联。
前提:必须使用cookie
session:
tomcat创建
销毁:30分钟
URL重写
一般情况选择encodeURL
两个方法区别在于,如果参数为空字符串,返回结果不同。
public String encodeURL(String url) {
String absolute = toAbsolute(url);
if (isEncodeable(absolute)) {
// W3c spec clearly said
if (url.equalsIgnoreCase("")){ //
url = absolute;
}
return (toEncoded(url, request.getSessionInternal().getIdInternal()));
} else {
return (url);
}
}
public String encodeRedirectURL(String url) {
if (isEncodeable(toAbsolute(url))) {
return (toEncoded(url, request.getSessionInternal().getIdInternal()));
} else {
return (url);
}
}
注意:参数url必须有效,否则返回没有改变的URL
当使用"/"开头,相对于web站点
response.encodeURL("/day07/urlSessionServlet2")
/day07/urlSessionServlet2;jsessionid=F85DB5EFDDB9A6B170AF2B4959EFC4FC
获得Web的绝对路径
String absolute = toAbsolute(url);
http://localhost:8080/day07/
总结:
需要考虑用户的Cookie是否禁用了
将所有的链接全部进行URL重写(过滤器)