发表于: 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时只会提交name与value属性。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时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原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 httpServletRequest, HttpServletResponse httpServletResponse, Object 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;
}
}
明日计划 登录注册完善
今日问题 暂无
评论