服务器是怎么判断客户端传来的cookie是正确的,服务端的cookie是一直存储在内存中的吗,那cookie对应的是哪一个进程或线程?
public class CookieUtil(){ /** * 根据名字获取cookie的值 默认使用“utf-8”编码 * @param request * @param name cookie名字 * @return */ public static String getCookieValueByName(HttpServletRequest request,String name){ Cookie cookie = getCookieByName(request,name); if(cookie!=null&&StringUtil.isNotBlank(cookie.getValue())){ return URLDecoder.decode(cookie.getValue(),"UTF-8″); }else if(cookie.getValue()!=null){ return ""; }else{ return null; } } /** * 根据名字修改cookie * @param request * @param name cookie名字 * @param value cookie值 * @param expire cookie新的过期时间--为0则表示删除 * @param created cookie不存在是否新建 * @return */ public static Cookie modCookieByName(HttpServletRequest request,String name,String value, Integer expire,boolean created){ Cookie cookie=getCookieByName(); if(null!=cookie){ cookie.setMaxAge(expire); cookie.setValue(URLEncoder.encode(value.trim(),"UTF-8″)); }else(null==cookie){ if(created){ Cookie cookie=createCookie(name,value,expire); } } return cookie; } /** * 新建cookie 默认path为“/”,默认所有值进行UTF-8编码 * @param request * @param name cookie名字 * @param value cookie值 * @param expire cookie过期时间--为0则表示删除 * @return */ public static Cookie createCookie(String name,String value,Integer expire){ Cookie cookie = new Cookie(name.trim(), URLEncoder.encode(value.trim(),”UTF-8″)); cookie.setMaxAge(expire); cookie.setPath("/"); return cookie; } /** * 根据名字获取cookie * @param request * @param name cookie名字 * @return */ public static Cookie getCookieByName(HttpServletRequest request,String name){ Map<String,Cookie> cookieMap = ReadCookieMap(request); if(cookieMap.containsKey(name)){ Cookie cookie = (Cookie)cookieMap.get(name.trim(); return cookie; }else{ return null; } } /** * 将cookie封装到Map里面 * @param request * @return */ private static Map<String,Cookie> ReadCookieMap(HttpServletRequest request){ Map<String,Cookie> cookieMap = new HashMap<String,Cookie>(); Cookie[] cookies = request.getCookies(); if(null!=cookies){ for(Cookie cookie : cookies){ cookieMap.put(cookie.getName(), cookie); } } return cookieMap; } }
在Java中,服务器通常使用Servlet容器(例如Tomcat、Jetty等)来处理HTTP请求和响应。当客户端发送请求时,Servlet容器会从请求头中获取cookie,然后使用Java Servlet API提供的Cookie类来解析和处理cookie。
具体来说,在Java Servlet API中,可以通过HttpServletRequest对象的getCookies()方法获取客户端传来的所有cookie,返回一个Cookie对象数组。开发人员可以遍历这个Cookie对象数组,找到特定名称的cookie,并获取其值。
对于服务端存储cookie的方式,在Java中也有多种选择。一种常见的方式是使用Java Servlet API提供的HttpSession接口来存储会话信息。HttpSession接口提供了一个key-value存储的机制,可以将会话信息存储在内存或磁盘上。当客户端发送请求时,Servlet容器会从cookie中获取session ID,并根据session ID在HttpSession中查找对应的会话信息,以确定用户的身份和会话状态。
对于多进程或多线程的服务器,不同的进程或线程可以共享同一个HttpSession。为了实现多进程或多线程共享HttpSession,Servlet容器通常会使用一些技术,例如共享内存或分布式缓存系统。