重定向:请求2次,tomcat创建了2个request对象
转发: 请求1次,tomcat创建了2个request对象将第一个request中的内容,拷贝给第二个request。值相同,对象不同
会话:当访问web资源之后,通过连接继续请求当前站点的资源,然后关闭浏览器的整个过程。
会话技术:cookie、session(两个都是回话级别的)
* 要求保存数据:服务器
* 保存数据:浏览器
* IE;将cookie保存到指定目录中,以文件的形式存储
* 火狐或谷歌:将cookie保存到指定的文件中
* 会话级cookie:当整个会话结束后(浏览器关闭),
cookie信息将被删除(cookie在内存中,默认setMaxAge(0) ,单位s)
* setMaxAge
* 单位:秒
* 如果设置的值为零,则进行删除操作。
* request.getCookies();获得当前web项目的所有的cookie信息
* 获得当前浏览器中的cookie
* 获得当前servlet所在目录,以及之上的所有目录下的cookie信息
* 通过setPath可以设置cookie的访问路径
(一个项目中保存的cookie都在该项目文件夹中)
* 在cookie中存放中文
* 编码:String returnData = URLEncoder.encode(data, "UTF-8");
* 解码:String value = URLDecoder.decode(c.getValue(), "UTF-8");
* cookie的value可以设置多少个字符:4kb
*session:服务器在服务器端创建一个内存区域,用来存放当前用户的所有信息,通过cookie关联。
* session:
* tomcat创建
* 销毁:默认30分钟(可以修改,单位min)
* 当用浏览器访问web站点后,如果web站点有servlet创建了 getSession().getAttribute("**"),
那么就创建了一个session.
tomcat自动添加cookie,JSESSIONID=DFE75A1E9CCAA1591F900FA3B1AEE9F3 ,会话级
下次再访问这个servlet就有session了,不需要再创建,但是如果你把浏览器关闭,
会话级关闭,再访问这个servlet又要重新创建,如果不想重新创建,那么就需要把这个
cookie持久化:
//创建cookie
Cookie cookie = new Cookie("JSESSIONID",session.getId());
//设置有效时间(持久化)
cookie.setMaxAge(60*30);
//通知浏览器
response.addCookie(cookie);
* URL重写
* 问题描述:
为了解决用户把安全级别调很高,禁用cookie,那么服务器创建的cookie
(JSESSIONID=DFE75A1E9CCAA1591F900FA3B1AEE9F3)也就没法创建,那么即使不关闭浏览器
session都访问不到,只能每次都创建一个新的。
这样我们可以采用:URL重写
* 实质就是在url链接后面加上session的id信息,也就是
在链接后面加上 ;jsessionid=***** ,注意是小写
*问题:不知道浏览器是否禁用cookie,如果用户没禁用,那么加上后面一串显得多余
*解决方法:response提交了两个方法来解决,如果用户禁用了cookie,那么就在链接后
加上;jsessionid=**,如果没有禁用,讲cookie保存到用户浏览器,不要后面那一串
两个方法为:1、public String encodeURL(String url)
2、public String encodeRedirectURL(String url)
*一般情况选择encodeURL
* 两个方法区别在于,如果参数为空字符串,返回结果不同
1、url = null -- >返回绝对路径
2、url = null -- >不做处理
源码如下:
public String encodeURL(String url) {
String absolute = toAbsolute(url); //加上绝对路径
if (isEncodeable(absolute)) { //判断是否要添加jsessionid后缀
if(url.equalsIgnoreCase("")){ //如果url为空,
url = absolute;
}
//在后面加上后缀jsessionid
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/
* 总结:
* 验证码的session保存验证码,需要考虑用户的Cookie是否禁用了
* 将所有的链接全部进行URL重写(过滤器)
来自传智梁桐老师