Cookie在浏览器中无法存在的问题
我采取以正确的写法往错误写法推导,展示错误,并给予解决
1 简单写法,正常情况下
代码:
此代码主要功能是:第一次访问servlet,创建一个cookie;第二次再访问这个servlet,读取cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/CookieServlet")
public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置request编码
request.setCharacterEncoding("utf-8");
//设置response编码
response.setContentType("text/html;charset=utf-8");
//第一次访问服务器,服务器向客户端写cookie
//设置cookie的名字
String cookieName="lastTime";
//设置cookie的内容
String cookieValue="cookieValue!!!";
//创建cookie
Cookie cookie = new Cookie(cookieName,cookieValue);
//设置cookie的有效时间
cookie.setMaxAge(60*60);//秒为单位 3600s为1小时
//添加cookie
response.addCookie(cookie);
//读取cookie
Cookie[] cookies = request.getCookies();
//cookie内的值拿出
String lastTime=null;
//不为空则读出来输出到页面
if (cookies!=null && cookies.length>0){
for(Cookie cookieNew:cookies){
String cookieRequestName=cookieNew.getName();
if ("lastTime".equals(cookieRequestName)){
lastTime=cookieNew.getValue();
break;
}
}
//输出到页面
response.getWriter().println("您已经访问过了,lastTime="+lastTime);
}else {
//输出到页面
response.getWriter().println("您是第一次访问本页面!");
}
}
}
运行结果:
第一次访问:
查看一下cookie(谷歌浏览器):
第二次访问:
最简单的cookie创建,可以发现并没有出错;
而且楼主在“360浏览器”、“火狐”、“Edge”、“IE”、“谷歌”测试均无问题。
2. 修改cookie内容(添加一个空格),出现错误
问题:
对cookie内容添加一个空格!
//设置cookie的内容
String cookieValue="cookie Value!!!";
谷歌报错:
原因:
整体意思就是这个cookie内容有个字符我们无法识别!
那个字符是什么呢?是空格;为什么无法识别空格?又是编码跟解码的问题。
在ASCII码中32对应的就是空格。
解决方法:
1.望梅止渴法:删去空格,不用不报错;
2.服务器使用URLEncoder.encode()编码;客户端/服务端再使用URLDecoder.decode()解码;
需要导包import java.net.*;
上代码:
发送cookie时对内容的编码
//设置cookie的内容
String cookieValue="cookie Value!!!我不仅要空格还打中文!!!";
//给此内容编码
cookieValue=URLEncoder.encode(cookieValue,"utf-8");
接收cookie时对内容的解码
for(Cookie cookieNew:cookies){
String cookieRequestName=cookieNew.getName();
if ("lastTime".equals(cookieRequestName)){
lastTime=cookieNew.getValue();
//解码
lastTime=URLDecoder.decode(lastTime,"utf-8");
break;
}
}
再次运行:
查看一下编码过的cookie长啥样?
此错误结束。
此方法适用于内容需要有空格,或者内容需要有中文。
3. setPath()后,输出页面无法读取cookie
问题:
我在正确代码基础上给cookie设置setPath():
//设置cookie的获取范围
cookie.setPath("/Session");
//添加cookie
response.addCookie(cookie);
再次运行:刷新后仍是这个页面
原因:
查看一下cookie
可以看到cookie仍是存在的,为什么当前页面读取不了呢?因为设置了路径/Session,这代表着只有这个/Session路径下的服务器资源可以访问这个cookie,其他资源可远观而不可亵玩焉。
解决:
1.在Session目录下的资源去访问这个cookie
用SessionServlet去访问cookie
成功。
2.如果想让当前项目的所有资源都能访问此cookie,那么就设置setPath("/");
3.或者不去设置这个方法,默认值也是setPath("/")。
4. setDomain()后,输出页面没有cookie
问题:
我在正确代码基础上给cookie设置setDomain():
//设置cookie的跨域访问
cookie.setDomain("127.0.0.1");
//添加cookie
response.addCookie(cookie);
运行:
无设置的cookie
原因:
setDomain()是为了跨域访问的,默认值是localhost,我这里虽然填“127.0.0.1”确实是本机的ip,但不支持这种写法。
如:setDomain(".baidu.com"),那么 tieba.baidu.com 和 news.baidu.com 中 Cookie 可以共享;
我们这里并没有设置域名,不需要对这个方法进行设置。
解决方法:
1.删除setDomain();采用默认值localhost;
2.setDomain(“localhost”);
适用任意一种,页面恢复到正确水平。
以上就是cookie的正确写法以及cookie可能出现的一些错误。
如果对您有所帮助,请点赞支持一下作者~