发表于: 2020-07-12 22:34:19

1 1956


AOP

Http:

1. HttpServletRequest request Http请求

2. HttpServletResponse response Http返回

Cookie和Session的区别

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份Session通过在服务器端记录信息确定用户身份

cookie里放访问令牌token和其他加密信息。

1.1  Cookie机制

  在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。

  而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。

  Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。

 

1.1.1  什么是Cookie

  Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。查看某个网站颁发的Cookie很简单。在浏览器地址栏输入javascript:alert (document. cookie)就可以了(需要有网才能查看)。JavaScript脚本会弹出一个对话框显示本网站颁发的所有Cookie的内容

1.2  记录用户访问次数

  Java中把Cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是该Cookie类的对象。服务器通过操作Cookie类对象对客户端Cookie进行操作。通过request.getCookie()获取客户端提交的所有Cookie(以Cookie[]数组形式返回),通过response.addCookie(Cookiecookie)向客户端设置Cookie。

  Cookie对象使用key-value属性对的形式保存用户状态,一个Cookie对象保存一个属性对,一个request或者response同时使用多个Cookie。因为Cookie类位于包javax.servlet.http.*下面,所以JSP中不需要import该类。 

1.1.3  Cookie的不可跨域名性

  很多网站都会使用Cookie。例如,Google会向客户端颁发Cookie,Baidu也会向客户端颁发Cookie。那浏览器访问Google会不会也携带上Baidu颁发的Cookie呢?或者Google能不能修改Baidu颁发的Cookie呢?

  答案是否定的。Cookie具有不可跨域名性。根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。

  Cookie在客户端是由浏览器来管理的。浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie。

需要注意的是,虽然网站images.google.com与网站www.google.com同属于Google,但是域名不一样,二者同样不能互相操作彼此的Cookie。

1.1.6  设置Cookie的所有属性

  除了name与value之外,Cookie还具有其他几个常用的属性。每个属性对应一个getter方法与一个setter方法。Cookie类的所有属性如表1.1所示。

表1.1  Cookie常用属性

属  性  名

描    述

String name

该Cookie的名称。Cookie一旦创建,名称便不可更改

Object value

该Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码

int maxAge

该Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1

boolean secure

该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false

String path

该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”

String domain

可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”

String comment

该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明

int version

该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范

 



1.2  Session机制

  除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力

 
1.2.1  什么是Session

  Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

  如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。 

1.2.2  实现用户登录

  Session对应的类为javax.servlet.http.HttpSession类。每个来访者对应一个Session对象,所有该客户的状态信息都保存在这个Session对象里。Session对象是在客户端第一次请求服务器的时候创建的。Session也是一种key-value的属性对,通过getAttribute(Stringkey)和setAttribute(String key,Objectvalue)方法读写客户状态信息。Servlet里通过request.getSession()方法获取该客户的Session

参考链接: https://www.cnblogs.com/l199616j/p/11195667.html


cookie里没有token去session里拿,session里没有就去request里拿


CookieUtil.java

package utils;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CookieUtil {
public static void getCookie(HttpServletResponse response, String token){
Cookie cookie = new Cookie("cookie", token);

       //登录后多久没有进行操作,cookie没有更新然后过期
       cookie.setMaxAge(7*24*60*60);//设置cookie的最大生命周期为一周(cookie过期时间)
       //cookie属性path: 该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。
       // 如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”
       cookie.setPath("/"); // 设置路径为全路径(这样写的好处是同一项目下的页面都可以访问该cookie)
       response.addCookie(cookie);
   }

public static String getCookieByName(HttpServletRequest request, String name){
Cookie[] cookies = request.getCookies();
       if(null!=cookies){
for(Cookie cookie:cookies){
if(cookie.getName().equals(name)){
return cookie.getValue();
               }
}
}
return null;
   }
}

拦截器UserInterceptor.java

//HandlerInterceptorAdapter里有4个功能方法:preHandle, postHandle, afterCompletion, ...点进去看
public class UserInterceptor extends HandlerInterceptorAdapter {
Logger logger = Logger.getLogger(String.valueOf(UserInterceptor.class));


   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

//从session里拿token
       HttpSession session = request.getSession();
       logger.info(session.getId());
       logger.info(session.getCreationTime());
       logger.info(session.getLastAccessedTime());
       logger.info(session.getMaxInactiveInterval());//不操作多久时间session断掉
       String token = (String) session.getAttribute(("session11111"));
       logger.info("Token is "+token);

//       从cookie里拿token
//        String token = CookieUtil.getCookieByName(request, "cookie");
//        logger.info("Token is "+token);

       //从request里拿token
//        String token = request.getHeader("token");//把任意一个字符串放进请求头里,拿到token
//        logger.info("Token is " + token);


       //校验结果
       boolean result = TokenUtil.check(token);
       logger.info("result is " + result);

       //如果结果为true,放入信息
       if (result) {
request.setAttribute("id", JWT.decode(token).getClaim("id").toString());
       }

//如果结果为false,告诉前台“用户没有登录”,可以比如跳转到登录界面
       if (!result) {
response.setCharacterEncoding("UTF-8");
           response.setContentType("application/json; charset=utf-8");
           PrintWriter out = response.getWriter();
           JSONObject jsonObject = new JSONObject();
           jsonObject.put("code", -2);
           jsonObject.put("message", "用户没有登录");
           out.append(jsonObject.toString());
       }
return result;
   }

}

用户登录成功后,得到cookie:











返回列表 返回列表
评论

    分享到