服务器是怎么判断客户端传来的cookie是正确的,服务端的cookie是一直存储在内存中的吗,那cookie对应的是哪一个进程或线程?

服务器是怎么判断客户端传来的cookie是正确的,服务端的cookie是一直存储在内存中的吗,那cookie对应的是哪一个进程或线程?

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7707109
  • 这篇博客也不错, 你可以看下什么是cookie以及cookie的特性、优缺点
  • 除此之外, 这篇博客: 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;
    	}
    }

  • 您还可以看一下 刘海龙老师的渗透测试视频教程课程中的 COOKIE注入小节, 巩固相关知识点

在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容器通常会使用一些技术,例如共享内存或分布式缓存系统。