源代码
package cookie; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.http.*; public class LastAccessServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 指定服务器输出内容的编码方式UTF-8,防止发生乱码 response.setContentType("text/html;charset=utf-8"); String lastAccessTime=null; // 获取所有的cookie,并将这些cookie存放在数组中 Cookie[] cookies = request.getCookies(); // 遍历cookies数组 for (int i = 0; cookies!=null && i < cookies.length; i++) { if ("lastAccess".equals(cookies[i].getName())) { // 如果cookie的名称为lastAccess,则获取该cookie的值 lastAccessTime = cookies[i].getValue(); break; } else { System.out.println(cookies[i].getName()+cookies[i].getValue()); } } // 判断是否存在名称为lastAccess的cookie if (lastAccessTime == null) { response.getWriter().print("您是首次访问本站!!!"); } else { response.getWriter().print("您上次的访问时间是:"+ lastAccessTime); } // 创建cookie,将当前时间作为cookie的值发送给客户端 String currentTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()); Cookie cookie= new Cookie("lastAccess",currentTime); response.addCookie(cookie); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
点击运行后刷新网页发现并没有成功发送cookie也就是
response.addCookie(cookie);
这一句并没有运行。
检查Tomcat Localhost log 日志发现,cookie中存在无效字符(空格)。
解决方案:
在tomcat的根目录的conf目录context.xml加上下面的代码即可解决问题
<!-- 解决Cookie中不允许出现非法字符--> <CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" />
还有另一种解决办法,存Cookie之前先将需要传的字符串编码,使用的时候在解码,需要用到下面的俩个方法
URLEncoder类的静态方法encode()
URLDecoder类的静态方法decode()
String one=",,,,,";//全是逗号
//1.先编码
one=URLDecoder.decode(one,"utf-8") ;
//2.存Cookie
response.addCookie(new Cookie("name",one));
//3.后面需要获取Cookie中的one值,解码后再输出
one=URLDecoder.decode(one,"utf-8");
System.out.println(one);