1 会话跟踪技术
在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束。 在一个会话的多个请求中共享数据,这就是会话跟踪技术。例如在一个会话中的请求如下: 请求银行主页;
- 请求登录(请求参数是用户名和密码);
- 请求转账(请求参数与转账相关的数据);
- 请求信誉卡还款(请求参数与还款相关的数据)。
在这上会话中当前用户信息必须在这个会话中共享的,因为登录的是张三,那么在转账和还款时一定是相对张三的转账和还款!这就说明我们必须在一个会话过程中有共享数据的能力。
2 会话路径技术使用Cookie或session完成
我们知道HTTP协议是无状态协议,也就是说每个请求都是独立的!无法记录前一次请求的状态。但HTTP协议中可以使用Cookie来完成会话跟踪!在Web开发中,使用session来完成会话跟踪,session底层依赖Cookie技术。
cookie
定义:具体一个浏览器针对一个服务器有值(key-value)
设置cookie
views.py
from django.shortcuts import render, HttpResponse, redirect # Create your views here. from app01.models import UserInfo def login(request): if request.method == 'POST': user = request.POST.get('user') pwd = request.POST.get('pwd') user = UserInfo.objects.filter(user=user, pwd=pwd).first() if user: ''' 响应体: return HttpResponse() return render() return redirect() 响应体都可以设置cookie ''' response = HttpResponse('登陆成功') response.set_cookie('is_login', True) response.set_cookie('username', user.user) # 后面登陆的会把前面的覆盖 return response return render(request, 'login.html') def index(request): print(request.COOKIES) # {'csrftoken': '略', 'is_login': 'True'} is_login = request.COOKIES.get('is_login') if is_login: username = request.COOKIES.get('username') return render(request, 'index.html', locals()) else: return redirect('/login')
html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <h3>Hi, {{ username }}</h3> </body> </html>
cookie参数
''' class HttpResponseBase: def set_cookie(self, key, 键 value='', 值 max_age=None, 超长时间 cookie需要延续的时间(以秒为单位) 如果参数是 None`` ,这个cookie会延续到浏览器关闭为止。 expires=None, 超长时间 expires默认None ,cookie失效的实际日期/时间。 path='/', Cookie生效的路径, 浏览器只会把cookie回传给带有该路径的页面,这样可以避免将 cookie传给站点中的其他的应用。 / 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问 domain=None, Cookie生效的域名 你可用这个参数来构造一个跨站cookie。 如, domain=".example.com" 所构造的cookie对下面这些站点都是可读的: www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。 如果该参数设置为 None ,cookie只能由设置它的站点读取。 secure=False, 如果设置为 True ,浏览器将通过HTTPS来回传cookie。 httponly=False 只能http协议传输,无法被JavaScript获取 (不是绝对,底层抓包可以获取到也可以被覆盖) ): pass '''
实操
def login(request): if request.method == 'POST': user = request.POST.get('user') pwd = request.POST.get('pwd') user = UserInfo.objects.filter(user=user, pwd=pwd).first() if user: ''' 响应体: return HttpResponse() return render() return redirect() 响应体都可以设置cookie ''' response = HttpResponse('登陆成功') response.set_cookie('is_login', True, max_age=15) # import datetime # data = datetime.datetime(year=2019, month=2, day=1, hour=9, minute=28, second=30) # GMT时间,固定在哪一个时刻失效 # response.set_cookie('username', user.user, expires=data) # 后面登陆的会把前面的覆盖 response.set_cookie('username', user.user, path='/index/') # 只有index下的视图函数可以获得这个cookie return response return render(request, 'login.html')
def index(request): print(request.COOKIES) # {'csrftoken': '略', 'is_login': 'True'} is_login = request.COOKIES.get('is_login') if is_login: username = request.COOKIES.get('username') # 保存上次访问时间 import datetime now = datetime.datetime.now().strftime('%Y-%m-%d %X') last_time = request.COOKIES.get('last_visit_time','') # 记录的上次访问index的时间,如果记录login的就写到login里面 response = render(request, 'index.html', {'username': username, 'last_time': last_time}) response.set_cookie('last_visit_time', now) # 把上次时间保存到cookie return response else: return redirect('/login')