精华内容
下载资源
问答
  • 关闭浏览器,直接访问显示页面时,还可以显示临时cookie,这是为什么?以下是我设置cookie Cookie cookie1 = new Cookie("testp","testpValue"); cookie1.setMaxAge(3600); resp.addCookie(cookie1); ...
  • JAVA WEB之cookie

    千次阅读 2019-07-04 09:02:21
    java中,把cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是该类的对象。服务器通过操作cookie类对象向客户端Cookie进行操作。...通过response.addCookie(Cookie cookie)向客户端设置CookieCookie具...

    java中,把cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是该类的对象。服务器通过操作cookie类对象向客户端Cookie进行操作。

    通过request.getCookie()获得客户端提交的所有Cookie(以数组的形式返回);

    通过response.addCookie(Cookie cookie)向客户端设置Cookie。

    Cookie具有不可跨域名性;浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。

    Cookie中使用的是ASCII。要在Cookie中使用Unicode字符时,需要对Unicode字符进行编码,否则会乱码。

    编码使用java.net.URLEncode类中的encode(String str, String encoding)

    解码使用java.net.URLDecoder类中的decode(String str, String encoding)

    属性名

    描述

    String name

    该Cookie的名称。Cookie一旦创建,名称便不可更改。

    Object value

    该Cookie的值。如果为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码

    int maxAge

    该Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为-1。

    boolean secure

    该Cookie是否仅被使用安全协议传输。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。

    String path

    该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”。

    String domain

    可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。

    String comment

    该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明。

    int version

    该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC2109规范。

     

    展开全文
  • Java Web 应用中,如果没有对 JESSIONID 这类 Cookie 信息设置 httpOnly 属性,会有什么风险呢?不同服务器对该属性的支持情况如何?登录成功后会话 ID 不变有问题吗?本文将介绍这些关于 Cookie 的问题。

    背景

    Java Web 应用中,如果没有对 JESSIONID 这类 Cookie 信息设置 httpOnly 属性,就存中这种风险:

    可以通过 js 的 document.cookie 打印会话信息,并窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查 看或变更用户记录以及执行事务。

    此外,会话 ID 应该在登陆成功后重置,迫使客户端得到一个新的会话 ID,这两项是会话相关的安全内容。本文将整理重置会话的方法和不同服务器对 httpOnly 属性支持的情况。

    登陆成功后重置 httpSession

    会话标识更新操作,是指在用户登录成功后,将旧的 Request 信息获取到一个临时对象中,然后调用会话对象的 invalidate 方法,再重新回写到新的会话对象,常规代码如下:

    /**
         * 重置sessionid,原session中的数据自动转存到新session中
         * @param request
         */
        private  HttpSession renewSessionId(HttpServletRequest request){
            HttpSession session = request.getSession(false);
            //首先将原session中的数据转移至一临时map中
            Map<String,Object> tempMap = new HashMap<String,Object>();
            Enumeration<String> sessionNames = session.getAttributeNames();
            while(sessionNames.hasMoreElements()){
                String sessionName = sessionNames.nextElement();
                tempMap.put(sessionName, session.getAttribute(sessionName));
            }
    
            //注销原session,为的是重置sessionId
            session.invalidate();
    
            //将临时map中的数据转移至新session
            session = request.getSession(true);
            logger.info("after session id: " + session.getId());
            for(Map.Entry<String, Object> entry : tempMap.entrySet()){
                session.setAttribute(entry.getKey(), entry.getValue());
            }
    
            return session;
        }
    

    httpOnly 属性

    Tomcat 下,request 的 Cookie 数量只有一个 JSESSIONID ,但是 Jboss 下有两个,为什么呢?
    在这里插入图片描述

    Tomcat 和 Jboss 的 httpOnly 配置

    Tomcat 默认是开启了 httpOnly 的,它在 context.xml 配置中是通过

    Context useHttpOnly="true"
    

    属性控制的,默认是 true 开启的,所以我们在一个 web 应用中,抓包的响应头域会自动带着这个属性。
    在这里插入图片描述
    使用 js 获取 cookie 是空的,
    在这里插入图片描述

    Jboss 的 httpOnly

    部署在 jboss 服务器上的应用,它的会话是可以通过 js 获取到的:
    在这里插入图片描述
    所以为了兼容所有服务器,保守的措施是,在登陆成功后,对 Response 的 Header 中关于会话的信息单独添加 httpOnly 属性:

    response.setHeader("Set-Cookie",httpResponse.getHeader("Set-Cookie")+";HttpOnly");
    

    编程启示录

    从这个 httpOlny 属性来看, Tomcat 的安全配置比 Jboss 要好呢。因为本地一直用 Tomcat 部署,所以总是无法复现这个问题,后来对比想了一下可能是部署服务器不同,继续验证果然在此。

    展开全文
  • Java Web中的Cookie

    Java Web中的Cookie

    Java Web中使用:

    java.servlet.http
    public class Cookie
    extends Object
    implements Cloneable, Serializable

    要创建一个Cookie,传递一个名称和值给Cookie的构造函数:

    Cookie cookie = new Cookie(name, value);

    创建一个Cookie之后,可以设置它的domain, path 和 maxAge等属性。

    • domain —— 可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“,”
    • path —— 该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie,注意最后一个字符必须为“/”
    • maxAge —— 该Cookie失效的时间,单位为秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,则该Cookie为临时的Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie,默认为-1
    • secure —— 该Cookie是否仅使用安全传输协议。默认为false
    • comment —— 该Cookie的用处说明,浏览器显示Cookie信息的时候显示该说明
    • version —— 该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC21099规范

    注意事项

    • domain参数必须以点“.”开始。另外,name相同但domain不同的两个Cookie是两个不同的Cookie


    • 页面只能获取它属于的Path的Cookie。例如:/session/test.jsp不能获取到路径为/session/abc/的Cookie


    • 为了将一个cookie发送到浏览器,需要在HttpServletResponse上调用add方法:

    HttpServletResponse.addCookie(Cookie cookie);


    当浏览器再次发出对同一个资源或者对同一台服务器中的不同资源的请求时,它会同时把从Web浏览器处收到的cookie再传回去。

    从客户端读取Cookie时,包括maxAge在内的其他属性都输不可读的,也不会被提交。浏览器提交Cookie时只会提交name和value属性。


    • 要访问浏览器发送的cookie,可以在HttpServletRequest中使用:

    Cookie[] HttpServletRequest.getCookies();


    方法。该方法将返回一个Cookie数组。如果请求中没有cookie,将返回null。


    • 没有删除cookie的方法。为了删除cookie,需要创建一个同名的cookie,将它的maxAge属性设置为0,并在HttpServletResponse中添加一个新的cookie:

    Cookie cookie = new Cookie(name, value);
    cookie.setMaxAge(0);
    response.addCookie(cookie);

    • 要想修改Cookie,只能使用一个同名的Cookie来覆盖原来的Cookie,达到修改的目的。


    • 修改,删除Cookie时,新建的Cookie除value, maxAge之外的属性,例如name, path, domain都要与原来的Cookie一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改,删除失败。


    使用示例

    logincheck.jsp

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <%
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        
        String action = request.getParameter("action");
        
        if (action != null){
    	    if (action.equals("login")){
    	    	String account = request.getParameter("account");
    	    	String password = request.getParameter("password");
    	    	
    	    	
    	    	System.out.println(account + password + request.getParameter("timeout"));
    	    	
    	    	int timeout = Integer.parseInt(request.getParameter("timeout"));
    	    	
    	    	String ssid = account;
    	    	
    	    	Cookie accountCookie = new Cookie("account", account);
    	    	accountCookie.setMaxAge(timeout);
    	    	
    	    	Cookie ssidCookie = new Cookie("ssid", ssid);
    	    	ssidCookie.setMaxAge(timeout);
    	    	
    	    	response.addCookie(accountCookie);
    	    	response.addCookie(ssidCookie);
    	    	
    	    	response.sendRedirect(request.getRequestURL() + "?" + System.currentTimeMillis());
    	    	return;
    	    }else
    	    if (action.equals("logout")){
    	    	Cookie accountCookie = new Cookie("account", "");
    	    	accountCookie.setMaxAge(0);
    	    	
    	    	Cookie ssidCookie = new Cookie("ssid", "");
    	    	ssidCookie.setMaxAge(0);
    	    	
    	    	response.addCookie(accountCookie);
    	    	response.addCookie(ssidCookie);
    	    	
    	    	response.sendRedirect(request.getRequestURL() + "?" + System.currentTimeMillis());
    	    	return;
    	    }
        }
        
        boolean login = false;
        String account = null;
        String ssid = null;
        
        if (request.getCookies() != null){
        	for (Cookie cookie : request.getCookies()){
        		if (cookie.getName().equals("account")){
        			account = cookie.getValue();
        		}
        		if (cookie.getName().equals("ssid")){
        			ssid = cookie.getValue();
        		}
        	}
        }
        
        if (account != null && ssid != null){
        	login = true;
        }
    %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    <% 
        if (login){
    %>    	
        	Welcome: ${cookie.account.value}.   
        	<a href="${oageContext.request.requestURL}?action=logout">
        	Logout</a>
    <%     
        }else{
    %>
        <form action="${pageContext.request.requestURL}?action=login" method="post">
            <table>
                <tr>
                    <td>Account: </td>
                    <td><input type="text" name="account" style="width:200px;"></td>
                </tr>
                <tr>
                    <td>Password: </td>
                    <td><input type="text" name="password" style="width:200px;"></td>
                </tr>
                <tr>
                    <td>Invalid Term:</td>
                    <td>
                        <input type="radio" name="timeout" value="-1" checked>关闭浏览器即失效<br/>
                        <input type="radio" name="timeout" value="<%= 30 * 24 * 60 * 60 %>">30天内有效<br/> 
                        <input type="radio" name="timeout" value="<%= Integer.MAX_VALUE %>" checked>永久有效<br/>
                    </td>
                </tr>
                <tr>
                    <td></td>
                    <td>
                        <input type="submit" value="Login"> 
                    </td>
                </tr>
            </table>
        </form>
    <%
        }
    %>
    </body>
    </html>

    在浏览器中访问如下URL:

    http://localhost:8080/base-webapp/jsp/cookie/logincheck.jsp






    展开全文
  • java cookie理解

    2018-04-16 14:12:50
    1. Cookie1.1. Cookie概述Cookie译为小型文本文件或小甜饼,Web应用程序利用Cookie在客户端缓存服务器端文件。Cookie是以键值对形式存储在客户端主机硬盘中,由服务器端发送给客户端,客户端再下一次访问服务器端...

    1. Cookie

    1.1. Cookie概述

    Cookie译为小型文本文件或小甜饼,Web应用程序利用Cookie在客户端缓存服务器端文件。Cookie是以键值对形式存储在客户端主机硬盘中,由服务器端发送给客户端,客户端再下一次访问服务器端时,服务器端可以获取到客户端Cookie缓存文件。

    Cookie是由服务器端创建的,然后由服务器端发送给客户端,客户端以键值对形式存储Cookie,并标注Cookie的来源。客户端再次访问服务器端时,存储的Cookie会保存在请求协议中,服务器端可以获取上次存储的缓存文件内容。

    Cookie的用途:

    • 管理浏览网站的人数(其中包含有多少人访问过,多少人是新用户等)
    • 电子商城中购物车功能(每买一样商品,保存一个Cookie
    • 用户自动登录功能(第一次登录时,将用户名和密码存储在Cookie

    Cookie的缺点:

    • 多人共用一台计算机(例如导致用户名和密码不安全等问题)。
    • Cookie被删除时,利用Cookie统计用户数量出现偏差。
    • 一人使用多台计算机(网站会将看成多个用户等问题)
    • Cookie会被附加在每次Http请求协议中,增加流量。
    • Cookie使用明文(未加密)传递的,安全性低。
    • Cookie的大小限制在4KB左右,无法存储复杂需求。

    1.2. 百度百科

    Cookie中文名称为小型文本文件,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。定义于RFC2109。为网景公司的前雇员Lou Montulli19933月所发明。

    Cookie一词用在程序设计中是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。从本质上讲,它可以看作是你的身份证。保存的信息片断以"/"(name-value pairs)的形式储存,一个"/"对仅仅是一条命名的数据。

    一个网站只能取得它放在你的电脑中的信息,它无法从其它的Cookie文件中取得信息,也无法得到你的电脑上的其它任何东西。 Cookie中的内容大多数经过了加密处理,因此一般用户看来只是一些毫无意义的字母数字组合,只有服务器的CGI处理程序才知道它们真正的含义。

    1.3. 维基百科

    Cookie(复数形态Cookies),中文名称为小型文本文件或小甜饼,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。定义于RFC2109。为网景公司的前雇员Lou Montulli19933月所发明。

    Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie

    内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie

    1.4. Cookie规范

    Http协议提供了有关Cookie的规范,现今市场上出现大量浏览器,一些浏览器对该Cookie规范进行了一些“扩展”,但Cookie缓存文件不会占满硬盘空间。

    • Cookie存储的大小上限为4KB
    • 一个服务器最多在客户端浏览器中可以保存20Cookie
    • 一个浏览器最多可以保存300Cookie

    值得注意的是,不同浏览器之间不能共享Cookie缓存文件。例如,上次使用IE浏览器访问网站,下次使用火狐浏览器访问该网站时,不能使用IE浏览器保存的Cookie缓存文件。

    1.5. 第一个Cookie

    下面我们通过具体操作来讨论一下CookieWeb应用程序运行中的状态,具体操作如下:

    • 创建一个Servlet用于向客户端发送Cookie信息。
    复制代码
    public class CookieServlet1 extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1 利用UUID生成一个随机字符串
            String id = UUID.randomUUID().toString();
            //2 创建Cookies实例对象
            Cookie cookie = new Cookie("id", id);
            //3 将Cookies实例对象,添加到Response对象中
            response.addCookie(cookie);
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
    复制代码
    • 创建另一个Servlet用于获取上次服务器端向客户端发送的Cookie信息。
    复制代码
    public class CookieServlet2 extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8");
            //1 通过Request对象获取上次服务器端发送的Cookie信息
            Cookie[] cookies = request.getCookies();
            //2 判断Request对象中的Cookie是否存在
            if(cookies != null){
                //3 遍历Request对象中的所有Cookie
             for (Cookie cookie : cookies) {
                    //4 获取每一个Cookie的名称
                    String name = cookie.getName();
                    //5 判断Cookie的名称是否存在是id
                    if(name.equals("id")){
                        //6 打印Cookie名称为id的Cookie值
                        response.getWriter().println("你的ID是"+cookie.getValue());
                    }
                }
            }
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
    复制代码
    • 配置Web工程的web.xml文件。
    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <display-name></display-name>
      <servlet>
        <servlet-name>CookieServlet1</servlet-name>
        <servlet-class>app.java.cookie.CookieServlet1</servlet-class>
      </servlet>
      <servlet>
        <servlet-name>CookieServlet2</servlet-name>
        <servlet-class>app.java.cookie.CookieServlet2</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>CookieServlet1</servlet-name>
        <url-pattern>/cookie1</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>CookieServlet2</servlet-name>
        <url-pattern>/cookie2</url-pattern>
      </servlet-mapping>    
    </web-app>
    复制代码

    1.6. 显示上次访问时间案例

    利用Cookie完成显示上次访问事件案例,首先需要分析一下整个案例的工作流程是怎么样的。

    根据分析的工作流程,具体的操作步骤如下:

    • 创建一个Servlet用于判断是否存在Cookies,并做出不同响应。
    复制代码
    public class CookieServlet3 extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
            //1 通过Request对象获取请求中的Cookies
            Cookie[] cookies = request.getCookies();
            //2 判断请求中的Cookies是否存在
            if(cookies != null){
                //3 遍历所有Cookies
                for (Cookie cookie : cookies) {
                    //4 获取每一个Cookies的名称
                    String name = cookie.getName();
                    //5 判断是否存在一个名为"lastvisit"的Cookie
                    if(name.equals("lastvisit")){
                        // 如果存在,说明不是第一次访问,显示上次访问的时间.
                        out.println("<h1>你上次访问的时间是"+cookie.getValue()+"</h1>");
                    }
                }
            }else{
                // 如果不存在,说明是第一次访问,显示欢迎信息.
                out.println("<h1>欢迎访问XXX网站.</h1>");
            }
            
            // 创建用于显示最后一次访问时间的Cookie实例对象
            Cookie cookie = new Cookie("lastvisit", new Date().toString());
            // 将Cookie实例对象添加到Response对象中
            response.addCookie(cookie);
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
    复制代码
    • 配置Web工程的web.xml文件。
    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <display-name></display-name>
      <servlet>
        <servlet-name>CookieServlet3</servlet-name>
        <servlet-class>app.java.cookie.CookieServlet3</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>CookieServlet3</servlet-name>
        <url-pattern>/cookie3</url-pattern>
      </servlet-mapping>    
    </web-app>
    复制代码

    1.7. 会话跟踪技术

    在上述案例中,如果关闭浏览器后,再次打开浏览器访问相同地址。会发现页面显示第一次访问的欢迎信息,而不是显示上次访问的时间。

    原因在于当关闭浏览器时,一次会话就结束了。再次打开浏览器访问相同地址时,而是开启了又一次的会话。由于Http协议是无状态的(记不住上次会话的状态),所以两次会话之间是相互独立的。

    会话(没有官方定义),可以简单理解为用户打开浏览器,访问某个网站,直到关闭浏览器,整个过程称之为一次会话。

    所谓协议的无状态是指同一个会话的连续两个请求相互独立。当浏览器发送请求给服务器时,服务器响应,同一个浏览器再次发送请求给服务器时,服务器依旧会响应,但是服务器不会知道是否是同一个浏览器发送的请求。每一次请求和响应都是相对独立的

    这种协议的无状态会话会阻碍实现例如购物车等功能,当用户选择一个商品后,再次选择另一个商品时,服务器端无法知道上一次选择的商品是什么。而为了解决这种协议的无状态会话,出现了CookieSession两种技术。

    Cookie是通过客户端保持状态的解决方案。从定义上来讲,Cookie就是由服务器端响应给客户端的特殊信息,而这些信息以文本文件的形式存储在客户端,然后每次客户端向服务器发送请求时都会携带这些特殊的信息。

    Session是通过服务器端保持状态的解决方案。通常会把Session译为会话,当客户端第一次向服务器端发送请求时,服务器端可以创建SessionSession的相关内容会保存在服务器端,并生成唯一的Session ID。客户端随后的请求都会携带这个Session ID,服务器端根据Session ID找到对应Session,再次使用。

    1.8. Cookie常用API

    JavaEE中提供了javax.servlet.http.Cookie类,该类提供了获取Cookie与设置Cookie的相关方法。具体内容如下:

    Method Summary

     String

    getDomain() 
              Returns the domain name set for this cookie.

     int

    getMaxAge() 
              Returns the maximum age of the cookie, specified in seconds, By default, -1 indicating the cookie will persist until browser shutdown.

     String

    getName() 
              Returns the name of the cookie.

     String

    getPath() 
              Returns the path on the server to which the browser returns this cookie.

     String

    getValue() 
              Returns the value of the cookie.

     void

    setDomain(String pattern) 
              Specifies the domain within which this cookie should be presented.

     void

    setMaxAge(int expiry) 
              Sets the maximum age of the cookie in seconds.

     void

    setPath(String uri) 
              Specifies a path for the cookie to which the client should return the cookie.

     void

    setValue(String newValue) 
              Assigns a new value to a cookie after the cookie is created.

    Cookie的常用API方法,可以通过几个方面分别学习讨论。

    • 向客户端响应Cookie与读取请求中的Cookie
      • 向客户端响应Cookies
    // 创建Cookie实例对象
    Cookie cookie = new Cookie("id", new Date().toString());
    // 将Cookie实例对象添加到Response对象中
    response.addCookie(cookie);
      • 读取请求中的Cookie
    复制代码
    //1 通过Request对象获取请求中的Cookies
    Cookie[] cookies = request.getCookies();
    //2 判断请求中的Cookies是否存在
    if(cookies != null){
        //3 遍历所有Cookies
        for (Cookie cookie : cookies) {
            return cookie;
        }
    }else{
        return null;
    }
    复制代码

    读取Cookie时,可以利用getName()方法、getValue()方法获取每一个Cookie中的名称和值,也可以利用setValue()方法重新设置对应名称的Cookie的值。但Cookie的名称只有创建时才能设置,一旦创建就不能更改(Cookie规范中认为Cookie的名称是唯一的)。

    复制代码
    if(cookies != null){
        // 遍历所有Cookies
        for (Cookie cookie : cookies) {
            // 获取每一个Cookies的名称
            String name = cookie.getName();
            // 判断是否存在一个名为"lastvisit"的Cookie
            if(name.equals("lastvisit")){
                // 如果存在,说明不是第一次访问,显示上次访问的时间.
                out.println("<h1>你上次访问的时间是"+cookie.getValue()+"</h1>");
            }
        }
    }
    复制代码
    • 会话Cookie与持久Cookie
      • 会话Cookie

          会话Cookie是保存在浏览器的内存中,当一次会话结束或关闭浏览器后,Cookie信息将会丢失或被删除。

      • 持久Cookie

          持久Cookie是保存在浏览器的临时文件夹中,当一次会话结束或关闭浏览器后,Cookie信息依然会被保存。

          值得注意的是,持久Cookie存在过期时间,过期后Cookie会被自动删除。

          可以利用setMaxAge(int age)方法设置持久Cookie的有效时间。

    // 创建Cookie实例对象
    Cookie cookie = new Cookie("id", new Date().toString());
    // 设置Cookie的有效时间
    cookie.setMaxAge(60 * 60);
    // 将Cookie实例对象添加到Response对象中
    response.addCookie(cookie);
    • 设置Cookie的有效访问路径
      • 设置Cookie的有效访问路径,使用setPath()方法。
      • 默认情况下,Cookie的有效访问路径为当前Web应用程序的根目录“/10_cookies”(Web应用程序的内部路径)。
      • 默认情况下,生成的持久Cookie文件的名称为有效访问路径
      • 设置setPath(“/”)表示Cookie的有效访问路径为当前Web应用程序下的所有目录。
      • 请求资源路径与Cookie的有效访问路径必须一致。
    复制代码
    // 创建Cookie实例对象
    Cookie cookie = new Cookie("id", new Date().toString());
    // 设置Cookie的有效时间
    cookie.setMaxAge(60 * 60);
    // 设置Cookie的有效访问路径
    cookie.setPath("/abc");
    // 将Cookie实例对象添加到Response对象中
    response.addCookie(cookie);
    复制代码

    这时生成的Cookie的有效访问路径为“/abc”。

    这时再次访问相同资源路径时,由于访问资源路径为http://localhost:8080/cookies,与Cookie的有效访问路径不一致,导致Cookie失效。

    • 设置Cookie的有效域名
      • 利用setDomain()方法设置Cookies的有效域名,例如setDomain(“.longestory.com”)
      • 大部分的浏览器不支持setDomain()方法,因为可能A网站生成B网站的域名Cookie(第三方Cookie)。
    • 删除持久Cookie
      • 可以将Cookie的最大有效时间设置为0。注意的是删除Cookie时,有效路径必须一致!

    1.9. 商品浏览记录案例

    通过Cookie来实现商品浏览记录的案例,首先我们需要分析该案例的实现流程,如下图:

    根据分析的实现流程,具体的实现步骤如下:

    • 创建一个JSP页面用于显示商品信息及商品浏览记录。
    复制代码
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>My JSP 'Show.jsp' starting page</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
      </head>
      <body>
        <!-- 商品列表 -->
        <h1>商品列表</h1>
        <a href="/cookies/show?id=1">Java编程思想</a><br>
        <a href="/cookies/show?id=2">Java设计模式</a><br>
        <a href="/cookies/show?id=3">Java语言入门</a><br>
        <a href="/cookies/show?id=4">数据结构和算法</a><br>
        <a href="/cookies/show?id=5">MySQL数据库</a><br>
        <!-- 浏览记录 -->
        <h1>浏览记录</h1>
        <h2><a href="/10_cookies/clear">清空记录</a></h2>
      </body>
    </html>
    复制代码
    • 创建一个Servlet用于向客户端响应Cookie信息。
    复制代码
    public class ShowServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1 通过Request对象获取请求参数ID
            String id = request.getParameter("id");
            //2 通过Request对象获取Cookie信息
            Cookie[] cookies = request.getCookies();
            //3 判断请求中的Cookies是否存在
            if(cookies != null){
                //4 遍历所有Cookies
                for (Cookie cookie : cookies) {
                    //5 获取每一个Cookies的名称
                    String name = cookie.getName();
                    //6 判断是否存在一个名为"history"的Cookie
                    if(name.equals("history")){// 存在名为"history"的Cookie
                        // 获取Cookie的value值
                        String value = cookie.getValue();
                        // 将Cookie的value值以","切割
                        String[] ids = value.split(",");
                        // 遍历所有书籍ID
                        for (String eachId : ids) {
                            // 判断当前ID是否已经存在Cookie信息中
                            if(!eachId.equals(id)){// 表示当前ID不存在Cookie信息中
                                // 创建用于存储商品浏览记录的Cookie实例对象,将当前书籍ID添加到Cookie信息中
                                Cookie resCookie = new Cookie("history", value + "," + id);
                                // 设置当前Cookie的生命为1天
                                resCookie.setMaxAge(60*60*24);
                                // 设置当前Cookie的有效路径为当前Web应用程序下所有目录
                                resCookie.setPath("/");
                                // 将当前Cookie添加到Response对象中
                                response.addCookie(resCookie);
                            }
                        }
                    }else{// 不存在名为"history"的Cookie
                        // 创建用于存储商品浏览记录的Cookie实例对象
                        Cookie resCookie = new Cookie("history", id);
                        // 设置当前Cookie的生命为1天
                        resCookie.setMaxAge(60*60*24);
                        // 设置当前Cookie的有效路径为当前Web应用程序下所有目录
                        resCookie.setPath("/");
                        // 将当前Cookie添加到Response对象中
                        response.addCookie(resCookie);
                    }
                }
            }else{// 不存在Cookie,表示这是浏览的第一个商品
                // 创建用于存储商品浏览记录的Cookie实例对象
                Cookie cookie = new Cookie("history", id);
                // 设置当前Cookie的生命为1天
                cookie.setMaxAge(60*60*24);
                // 设置当前Cookie的有效路径为当前Web应用程序下所有目录
                cookie.setPath("/");
                // 将当前Cookie添加到Response对象中
                response.addCookie(cookie);
            }
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().println("商品浏览成功!<a href='/cookies/02_cookie/show.jsp'>返回 </a>");
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
    复制代码
    • 配置Web工程的web.xml文件。
    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <display-name></display-name>
      <servlet>
    <servlet-name>ShowServlet</servlet-name>
        <servlet-class>app.java.cookie.ShowServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>ShowServlet</servlet-name>
        <url-pattern>/show</url-pattern>
      </servlet-mapping>    
    </web-app>
    复制代码
    • 发布Web工程到Tomcat服务器,并启动Tomcat服务器。
    • 打开浏览器,在地址栏中输入http://localhost:8080/cookies/02_cookie/show.jsp。
    • 在商品显示页面,点击浏览某一书籍后,返回商品显示页面。
    • 在商品显示页面,再次点击浏览某一书籍后,返回商品显示页面。
    • Cookie信息设置成功,下面将浏览的商品信息添加到对应JSP页面中。
    复制代码
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title>My JSP 'Show.jsp' starting page</title>
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
      </head>
      <body>
        <!-- 商品列表 -->
        <h1>商品列表</h1>
        <a href="/10_cookies/show?id=1">Java编程思想</a><br>
        <a href="/10_cookies/show?id=2">Java设计模式</a><br>
        <a href="/10_cookies/show?id=3">Java语言入门</a><br>
        <a href="/10_cookies/show?id=4">数据结构和算法</a><br>
        <a href="/10_cookies/show?id=5">MySQL数据库</a><br>
        <!-- 浏览记录 -->
        <h1>浏览记录</h1>
        <h2><a href="/10_cookies/clear">清空记录</a></h2>
        <%
            Cookie[] cookies = request.getCookies();
            if(cookies!=null){
                for (Cookie cookie : cookies) {
                    String name = cookie.getName();
                    if(name.equals("history")){
                        String value = cookie.getValue();
                        String[] ids = value.split(",");
                        String[] names = {"Java编程思想","Java设计模式","Java语言入门","数据结构和算法","MySQL数据库"};
                        for(String id : ids){
                            out.println(names[Integer.parseInt(id)-1]+"<br/>");
                        }
                    }else{
                out.println("<h2>无任何商品浏览记录!</h2>");
            }
                }
            }else{
                out.println("<h2>无任何商品浏览记录!</h2>");
            }
         %>
      </body>
    </html>
    复制代码
    • 重新打开浏览器,在地址栏中输入http://localhost:8080/cookies/02_cookie/show.jsp。
    • 浏览几本书籍后,在商品显示页面的浏览记录中,会显示已浏览的书籍内容。
    • 至此,该案例已经完成。但仔细测试案例,会发现在点击第二本书籍后,服务器端响应的Cookie信息共有两个。

    之所以效果正确的原因,在于浏览器使用了第二个Cookie信息中的history的值。出现这种问题的根本原因在于Servlet中处理Cookie的逻辑代码出现逻辑混乱。上述Servlet代码可以进行优化。

    • 创建一个名为CookieUtil”的工具类,用于判断Cookie是否存在对应信息。
    复制代码
    public class CookieUtil {
        public static Cookie findCookie(Cookie[] cookies, String name){
            if(cookies != null){
                for (Cookie cookie : cookies) {
                    String cookieName = cookie.getName();
                    if(cookieName.equals(name)){
                        return cookie;
                    }
                return null;
            }else{
                return null;
            }
        }
    }
    复制代码
    • 将之前的Servlet代码进行改写如下。
    复制代码
    public class ShowServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1 通过Request对象获取请求参数ID
            String id = request.getParameter("id");
            //2 通过Request对象获取Cookie信息
            Cookie[] cookies = request.getCookies();
            //3 调用CookieUtil类的findCookie()方法,查找对应Cookie信息
            Cookie cookie = CookieUtil.findCookie(cookies, "history");
            //4 判断名为"history"的Cookie信息是否存在
            if (cookie == null) {// 不存在名为"history"的Cookie
                // 创建用于存储商品浏览记录的Cookie实例对象
                Cookie resCookie = new Cookie("history", id);
                // 设置当前Cookie的生命为1天
                resCookie.setMaxAge(60*60*24);
                // 设置当前Cookie的有效路径为当前Web应用程序下所有目录
                resCookie.setPath("/");
                // 将当前Cookie添加到Response对象中
                response.addCookie(resCookie);
            }else{// 存在名为"history"的Cookie
                // 获取Cookie的value值
                String value = cookie.getValue();
                // 将Cookie的value值以","切割
                String[] ids = value.split(",");
                // 遍历所有书籍ID
                for (String eachId : ids) {
                    // 判断当前ID是否已经存在Cookie信息中
                    if(!eachId.equals(id)){// 表示当前ID不存在Cookie信息中
                        // 创建Cookie实例对象,将当前书籍ID添加到Cookie信息中
                        Cookie resCookie = new Cookie("history", value + "," + id);
                        // 设置当前Cookie的生命为1天
                        resCookie.setMaxAge(60*60*24);
                        // 设置当前Cookie的有效路径为当前Web应用程序下所有目录
                        resCookie.setPath("/");
                        // 将当前Cookie添加到Response对象中
                        response.addCookie(resCookie);
                    }
                }
            }
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().println("商品浏览成功!<a href='/cookies/02_cookie/show.jsp'>返回 </a>");
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
    复制代码
    • 打开浏览器,在地址栏中输入http://localhost:8080/cookies/02_cookie/show.jsp。浏览第二本书籍后,服务器端响应的Cookie信息只有一个。

    显示浏览商品的逻辑优化完成后,最后来完成清空浏览商品记录信息(实际就是删除Cookie信息即可)。

    • 创建一个Servlet用于清空浏览商品记录信息。
    复制代码
    public class ClearServlet extends HttpServlet {
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            Cookie cookie = new Cookie("history", "");
            cookie.setMaxAge(0);
            cookie.setPath("/");
            response.addCookie(cookie);
    
            response.sendRedirect("/cookies/02_cookie/show.jsp");
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    }
    复制代码
    • 配置Web工程的web.xml文件。
    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <display-name></display-name>
      <servlet>
        <servlet-name>ClearServlet</servlet-name>
        <servlet-class>app.java.cookie.ClearServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>ClearServlet</servlet-name>
        <url-pattern>/clear</url-pattern>
    </web-app>
    复制代码
    展开全文
  • Java下的Cookie和Session

    2015-11-02 12:53:17
    Session是一种服务器端...Cookie是由 Netscape 公司发明的、用于跟踪用户会话的一种方式。 Cookie 是由服务器发送给客户的片段信息,存储在客户端浏览器的内存中或硬盘上,在客户随后对该服务器的请求中发回它。 Cooki
  • 在了解cookie和session之前,先理解下"状态管理"的定义: ...下面开始进入正题,简单介绍下java中的cookie和Session: 一、Cookie 什么是cookie?  服务器临时存放在浏览器的少量数据 cookie的工作原理?
  • Javacookie与session

    2017-04-02 22:05:03
    常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么...
  • java cookie和session

    千次阅读 2017-03-06 18:40:45
    常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。 Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态。它们有各自...
  • Java基础系列(基础):Java使用Cookie增删改查操作! 前言 今天博主将为大家分享:Java基础系列(基础):Java使用Cookie增删改查操作!不喜勿喷,如有异议欢迎讨论! 什么是Cookie? Cookie是由W3C组织提出...
  • 如何设置Cookie

    千次阅读 2018-03-25 09:30:52
    简单的查了一下,常用的语言设置Cookie的语法,发现太不一样,不好全部掌握,如何设置自己需要的Cookie,需要掌握点小技能。这里讲的主要是参数部分,也许会对php和java开发的程序员有很大的帮助。下面的参数大家...
  • Java设置session的详细解释 简单通俗的讲session就是象一个临时的容器,用来存放临时的东西。从你登陆开始就保存在session里,当然你可以自己设置它的有效时间和页面,举个简单的例子:我们做一个购书的JSP网站,...
  • 三:Session和cookie部分 Cookie在客户端,session在服务器端,cookie的功能 需要浏览器支持。...通过response.addCookie(Cookie cookie)向客户端设置cookie. 记录用户访问次数 request.setCharacterEnc
  • JavaCookie的使用

    千次阅读 2019-06-26 17:52:57
    Cookie 技术其实是浏览器端的数据存储技术,解决了不同请求需要使用相同的请求数据的问题。我们把请求需要共享的请求数据,存储在浏览器端,避免用户进行重复的书写请求数据。但是哪些数据需要使用 Cookie 技术存储...
  • Java利用Cookie实现自动登录

    千次阅读 2014-05-30 16:16:24
    //设置Cookie的存在时间 resp.addCookie(cookie); //响应Cookie mtxt="登陆成功!!!"; //提示信息 req.setAttribute("mtxt", mtxt); //信息传递 req.setAttribute("username", username); req....
  • java Cookie的有效期

    千次阅读 2013-12-03 19:55:31
    Cookie的有效期 Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。 如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后...
  • JAVA设置HttpOnly Cookies

    千次阅读 2019-02-22 15:10:29
    核心: 1.获取cookie ...2.判断cookie是存储用户信息的,设置HttpOnly for (Cookie cookie2 : cookies) { System.out.println(cookie2.getName()); System.out.println(cookie2); if (cookie2.g...
  • java cookie与session

    2013-10-22 11:43:56
    Session是一种服务器端技术, Session 对象在服务器端创建,通常采用散列表来存储信息,... Cookie 是由服务器发送给客户的片段信息,存储在客户端浏览器的内存中或硬盘上,在客户随后对该服务器的请求中发回它。 Co
  • Java Web的状态管理cookie和session

    千次阅读 2019-12-15 11:08:52
    Web之状态管理cookie和session 回顾 1、重定向和跳转 重定向:用户请求servlet,处理之后,再给浏览器重定向的一个地址,浏览器又请求重定向的地址。属于浏览器行为,浏览器至少请求两次服务器。第一次请求的数据就...
  • Cookie cookiePassword=new Cookie("loginpassword", loginpassword); cookieName.setPath(request.getContextPath());  cookiePassword.setPath(request.getContextPath());  cookieName....
  • 【转】JAVACookie MaxAge属性及其使用

    万次阅读 2018-05-06 06:18:12
    出处:http://www.iteye.com转自:http://hi.baidu.com/suofang/item/06ea24ba63a7dceb4fc7fd17API文档中对MaxAge的描述:public void setMaxAge(int expiry)Sets the maximum age of the cookie in seconds.A ...
  • [Java开发之路](26)Cookie机制

    千次阅读 2016-07-12 22:28:55
    1. Cookie机制 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份...
  • Session是一种服务器端技术, Session 对象在服务器端创建,通常采用散列表来存储信息,例如,... Cookie 是由服务器发送给客户的片段信息,存储在客户端浏览器的内存中或硬盘上,在客户随后对该服务器的请求中发回它。
  • javacookie和session的比较

    千次阅读 2013-06-03 14:27:22
    cookie和session的比较 一、对于cookie: ...来设置,如果没有设置setMaxAge, 则cookie的生命周期当浏览器关闭的时候,就消亡了 ④cookie可以被多个同类型的浏览器共享 可以把cookie想象成一张表 比较
  • Java中的session和cookie

    2019-05-28 00:26:25
    cookie cookie是小段文本信息,在网络服务器上生成,并发给浏览器,通过使用cookie可以记录一些请求数据。流览器将cookie以key/value的形式保存到客户端的某个指定目录下。 在使用cookie时,应确保客户端上允许使用...
  • HttpCookie和session详解(Java

    千次阅读 2019-03-19 13:32:39
    Cookie技术是客户端的解决方案,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。让我们说得更具体一些:当用户...
  • 中级JAVACookie和Session区别

    千次阅读 2019-03-15 15:30:37
    为什么要有cookie/session? 在客户端浏览器向服务器发送请求,服务器做出响应之后,二者便会断开连接(一次会话结束)。那么下次用户再来请求服务器,服务器没有任何办法去识别此用户是谁。比如web系统常用的用户登录...
  • API文档中对MaxAge的描述: ...A positive valueindicates that the cookie will expire after that many seconds have passed. Note that the value is the maximum age when the cookie will ex.
  • 什么是Cookie?  Cookie是当你浏览某网站时,网站存储在你机器上的一个小文本文件,它记录了你的用户ID,密码、浏览过的网页、停留的时间等信息,当你再次来到该网站时,网站通过读取Cookie,得知你的相关信息,就...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,468
精华内容 8,587
关键字:

java设置临时cookie

java 订阅