发表于: 2020-07-26 23:05:28

1 2111


cookie

 一般来说,cookie通过HTTP Headers从服务器端返回到浏览器上。将不重要的信息存在cookie中,减轻服务器压力

        cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。

        cookie的使用是由浏览器按照一定的原则在后台携带给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。

缺点

 1、cookie数量和长度的限制。一般每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被截掉。

 2、安全性问题。如果cookie被人拦截了,那人就可以取得所有的session信息。即使加密也与事无补,因为拦截者并不需要知道cookie的意义,他只要原样转发cookie就可以达到目的了

/**
* 读取所有cookie
* 注意二、从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交namevalue属性。maxAge属性只被浏览器用来判断Cookie是否过期
* @param request
* @param response
*/
@RequestMapping("/showCookies")
public void showCookies(HttpServletRequest request,HttpServletResponse response ){

Cookie[] cookies = request.getCookies();//这样便可以获取一个cookie数组
   if (null==cookies) {
System.out.println("没有cookie=========");
   } else {
for(Cookie cookie : cookies){
System.out.println("name:"+cookie.getName()+",value:"+ cookie.getValue());
       }
}

}
/**
* 添加cookie
* @param response
* @param name
* @param value
*/
@RequestMapping("/addCookie")
public void addCookie(HttpServletResponse response,String name,String value){
Cookie cookie = new Cookie(name.trim(), value.trim());
   cookie.setMaxAge(30 * 60);// 设置为30min
   cookie.setPath("/");
   System.out.println("已添加===============");
   response.addCookie(cookie);
}
/**
* 修改cookie
* @param request
* @param response
* @param name
* @param value
* 注意一、修改、删除Cookie时,新建的CookievaluemaxAge之外的所有属性,例如namepathdomain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。
*/
@RequestMapping("/editCookie")
public void editCookie(HttpServletRequest request,HttpServletResponse response,String name,String value){
Cookie[] cookies = request.getCookies();
   if (null==cookies) {
System.out.println("没有cookie==============");
   } else {
for(Cookie cookie : cookies){
if(cookie.getName().equals(name)){
System.out.println("原值为:"+cookie.getValue());
               cookie.setValue(value);
               cookie.setPath("/");
               cookie.setMaxAge(30 * 60);// 设置为30min
               System.out.println("被修改的cookie名字为:"+cookie.getName()+",新值为:"+cookie.getValue());
               response.addCookie(cookie);
               break;
           }
}
}

}
/**
* 删除cookie
* @param request
* @param response
* @param name
*/
@RequestMapping("/delCookie")
public void delCookie(HttpServletRequest request,HttpServletResponse response,String name){
Cookie[] cookies = request.getCookies();
   if (null==cookies) {
System.out.println("没有cookie==============");
   } else {
for(Cookie cookie : cookies){
if(cookie.getName().equals(name)){
cookie.setValue(null);
               cookie.setMaxAge(0);// 立即销毁cookie
               cookie.setPath("/");
               System.out.println("被删除的cookie名字为:"+cookie.getName());
               response.addCookie(cookie);
               break;
           }
}
}

操作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;
   }

应用

1session(会话)

2购物车(cookie+DB)

拦截器

/**
* 自定义拦截器
*/
public class MyInterceptor1 implements HandlerInterceptor {

@Autowired
   AccountService accountService;

   private static Logger logger = LogManager.getLogger(MyInterceptor1.class);

   public boolean preHandle(HttpServletRequest httpServletRequestHttpServletResponse httpServletResponseObject handler) throws Exception {
// 判断session
       Cookie[] cookies = httpServletRequest.getCookies();
       logger.info("Cookie长度为: " + cookies.length);
       logger.info("拦截器获取到的Cookie: " + String.valueOf(cookies));
       if (cookies != null) {
logger.info("开始遍历");
           // 遍历
           for (Cookie cookie : cookies) {
logger.info("当前cookie的值: " + cookie.getValue() + " 名字为:" + cookie.getName());
               // 判断是否有token
               if (cookie.getName().equals("token")) {
String tokenDES = cookie.getValue();
                   logger.info("tokenDES: " + tokenDES);

                   String token = DESUtils.getDecryptString(tokenDES);//解密
                   logger.info("token的解密value:" + token);

                   // 分割字符串 获取id
                   Long id = Long.valueOf(token.split("=")[0]);
                   logger.info("id为: " + id);
                       return true;
               }
}
}
// token验证失败 跳回登陆页面
       // httpServletRequest https://blog.csdn.net/gris0509/article/details/6340987
       httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/tologin");
       return false;
   }
}

明日计划 登录注册完善

今日问题 暂无


返回列表 返回列表
评论

    分享到