在浏览器对服务器发送请求后,服务器响应后关闭连接,浏览器的连接数据存在cookie中,服务器的数据存在session中。
一.cookie
浏览器在访问服务器时,服务器将一些数据以 set-cookie 消息头的形式发送给浏览器。浏览器会将这些数据保存起来。当浏览器再次访问服务器时,会将这些数据以 cookie 消息头的形式发送给服务器。
1、什么是cookie
浏览器在访问服务器时,服务器将一些数据以 set-cookie 消息头的形式发送给浏览器。浏览器会将这些数据保存起来。当浏览器再次访问服务器时,会将这些数据以 cookie 消息头的形式发送给服务器。
2、创建 cookie
Cookie cookie = new Cookie(String name,String value);
response.addCookie(cookie);
cookie的name不可以重复,和Map集合类似,当有重复的name的时候,会替代。
3、查询cookie
//如果没有 cookie,则返回 null。
Cookie[] cookies = request.getCookies();
String name = cookie.getName();
String value = cookie.getValue();
4、cookie 保存时的编码问题
cookie 的值叧能是ascii 字符,如果是中文,需要将中文转换成 ascii 字符形式。可以使用 URLEncoder.encode()方法和 URLDecoder.decode()方法来进行这种转换。
5、cookie 的保存时间
cookie.setMaxAge(int seconds);//单位为秒
seconds > 0
浏览器会将 cookie 以文件的方式保存在硬盘上。在超过指定的时间以后,会删除该文件。
seconds < 0
默认值,浏览器会将 cookie 保存在内存里面。叧有当浏览器关闭以后,才会删除。
seconds = 0
立即删除该 Cookie
6、删除 cookie
比如要删除一个 name 为”username”的 cookie。
Cookie c = new Cookie(“username”,”“);
c.setMaxAge(0);
cookie.setPath(request.getContextPath());//路径
response.addCookie(c);
7、cookie 的限制
cookie 可以禁止
cookie 的大小有限制(4k 左右)
cookie 的数量也有限制(浏览器大约能保存 300 个)
cookie 的值叧能是字符串,要考虑编码问题。
cookie 不安全
8、cookie 的路径问题
浏览器在向服务器上的某个地址发送请求时,会先比较 cookie 的路径不向访问的路径(地址)是否匹配, 叧有匹配的 cookie, 才会发送。
cookie 的路径可以通过 cookie.setPath(String path)方法来设置。如果没有设置, 则有一个缺省的路径,缺省的路径是生成该 cookie 的组件的路径。
比如: /appname/addCookie 保存了一个 cookie,则该 cookie 的路径就是/appname/addCookie。
规则:
cookie 的路径必须是要访问的路径的上层目录戒者是不要访问的路径相等, 浏览器才会将 cookie 发送给服务器。一般可以设置 setPath(“/appname”),表示访问该应用下的所有地址,均会发送
二. Session
1、什么是session
浏览器访问服务器时,服务器会创建一个 session 对象(该对象有一个唯一的 id, 一般称为 sessionId)。服务器在缺省情况下,会将 sessionId 以 cookie 机制发送给浏览器。当浏览器再次访问服务器时, 会将sessionId 发送给服务器。 服务器依据 sessionId 就可以找到对应的 session 对象。
2、如何获得 session 对象
HttpSession session = request.getSession();
3、HttpSession 接口提供的一些方法
//获得 sessionId。
String session.getId();
//绑订数据
session.setAttribute(String name,Object obj);
//获取数据
Object session.getAttribute(String name);
//删除绑定
session.removeAttribute(String name);
4、session保存时间设置
服务器会将超过指定时间的 session 对象删除(在指定的时间内,该 session 对象没有
使用)。
两种设置方式:
方式一:
session.setMaxInactiveInterval(int seconds);
方式二:
服务器有一个缺省的超时限制,可以通过相应的配置文件来重新设置。比如可以修改 tomcat 的 web.xml(tomcat_home/conf 下面)。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
另外,也可以叧修改某个应用的 web.xml。
5、session删除
session.invalidate();
1、加入cookie到客户端
Cookie[] cookies = request.getCookies();//浏览器在第一请求时调用该方法会返回null
//浏览器第一次请求返回到浏览器之前会创建一个名为JSESSIONID 的cookie
//param(请求参数)中文转码
String paramEnd = URLEncoder.encode(param);
Cookie cookie = new Cookie("param"+cookies.length,paramEnd);//name不可以重复
cookie.setMaxAge(60*60*24*30);//保留一个月的时间
response.addCookie(cookie);//cookie在第一次加入时会创建一个JSESSIONID cookie
2、获取所有满足条件的cookie
Cookie[] cookies = request.getCookies();
if(cookies!=null && cookies.length>0){
Map<String,Object> historyPar = (Map<String, Object>)new ListOrderedMap();//按存入顺序取出,HashMap并不是按存入顺序取出
for(int i=cookies.length-1;i>=0;i--){
Cookie cookie = cookies[i];
String cookVal = URLDecoder.decode(cookie.getValue());
if(cookie.getName().startsWith("param")){
if(historyPar.size()==10) break;//查询最近10条记录
historyPar.put(cookVal, cookVal);//map的key值用cookie的value,以免历史记录重复
}
}
model.addAttribute("historyPar",historyPar);
}
3、js实现历史清除
//删除该路径下所有cookie
function cleanCookie(){
var keys=document.cookie.match(/[^ =;]+(?=\=)/g);
if (keys) {
for (var i = keys.length; i--;){
document.cookie=keys[i]+'=0;expires=' + new Date( 0).toUTCString()
}
}
window.location.href="${ctx}/searchController/globalSearch";
}
至此即可查询出最近一个月的前10条历史记录。