java使用cookie和session

当某个用户发出页面请求时,WEB服务器只是简单的进行响应,然后就关闭与该用户的连接,请求的相关数据将不再存在,这样明显有不好的地方。cookie和session解决了这一问题,客户端(一般是浏览器)与服务器之间的交互,将操作所涉及的数据记录下来,保存在cookie(保存在浏览器客户端)或者session(保存在服务器)中。

一、cookie

1、什么是cookie

浏览器在访问服务器时,服务器将一些数据以 set-cookie 消息头的形式发送给浏览器。浏览器会将这些数据保存起来。当浏览器再次访问服务器时,会将这些数据以 cookie 消息头的形式发送给服务器。

2、创建 cookie

Cookie cookie = new Cookie(String name,String value);
response.addCookie(cookie);12

cookie的name不可以重复,和Map集合类似,当有重复的name的时候,会替代。

3、查询cookie

//如果没有 cookie,则返回 null。
Cookie[] cookies = request.getCookies();
String name = cookie.getName();
String value = cookie.getValue();1234

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);12345678

4、session保存时间设置

服务器会将超过指定时间的 session 对象删除(在指定的时间内,该 session 对象没有 
使用)。 
两种设置方式: 
方式一: 
session.setMaxInactiveInterval(int seconds); 
方式二: 
服务器有一个缺省的超时限制,可以通过相应的配置文件来重新设置。比如可以修改 tomcat 的 web.xml(tomcat_home/conf 下面)。

<session-config>
    <session-timeout>30</session-timeout>
</session-config>123

另外,也可以叧修改某个应用的 web.xml。

5、session删除

session.invalidate();

三、用cookie记录最近10条记录

用cookie查询最近一个月请求的前10条历史记录。cookie的中文要求转码和解码。如下图 


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 cookie1234567

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);
        }12345678910111213

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";
    }12345678910

至此即可查询出最近一个月的前10条历史记录。
--------------------- 
作者:俺就不起网名 
来源:CSDN 
原文:https://blog.csdn.net/u012385190/article/details/51957749 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/m0_37364073/article/details/83311959
今日推荐