精华内容
下载资源
问答
  • 目录 cookie Cookie的由来 什么是Cookie ...删除Cookie Session Session的由来 Django中Session相关方法 Session流程解析 Session版登陆验证 Django中的Session配置 CBV中加装饰器相关 ...

    目录

    cookie

    Cookie的由来

    什么是Cookie

    Cookie的原理

    查看Cookie

    Django中操作Cookie

    获取Cookie

    设置Cookie

    删除Cookie

    Session

    Session的由来

    Django中Session相关方法

    Session流程解析

    Session版登陆验证

    Django中的Session配置

    CBV中加装饰器相关

    1. 加在CBV视图的get或post方法上

    2. 加在dispatch方法上

    3. 直接加在视图类上,但method_decorator必须传 name 关键字参数

    补充

    分页

    自定义分页

    Django内置分页


    cookie

    Cookie的由来

    大家都知道HTTP协议是无状态的。

    无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。

    一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。

    状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样一个场景下诞生。

    什么是Cookie

    Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。

    Cookie的原理

    cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。

    查看Cookie

    我们使用Chrome浏览器,打开开发者工具。

    Django中操作Cookie

    获取Cookie

    request.COOKIES['key']
    request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

    参数:

    • default: 默认值
    • salt: 加密盐
    • max_age: 后台控制过期时间

    设置Cookie

    rep = HttpResponse(...)
    rep = render(request, ...)
    
    rep.set_cookie(key,value,...)
    rep.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...)
    参数:
    • key, 键
    • value='', 值
    • max_age=None, 超时时间
    • expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
    • path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
    • domain=None, Cookie生效的域名
    • secure=False, https传输
    • httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

    删除Cookie

    def logout(request):
        rep = redirect("/login/")
        rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值
        return rep

    Cookie版登陆校验

     

    def check_login(func):
        @wraps(func)
        def inner(request, *args, **kwargs):
            next_url = request.get_full_path()
            if request.get_signed_cookie("login", salt="SSS", default=None) == "yes":
                # 已经登录的用户...
                return func(request, *args, **kwargs)
            else:
                # 没有登录的用户,跳转刚到登录页面
                return redirect("/login/?next={}".format(next_url))
        return inner
    
    
    def login(request):
        if request.method == "POST":
            username = request.POST.get("username")
            passwd = request.POST.get("password")
            if username == "xxx" and passwd == "dashabi":
                next_url = request.GET.get("next")
                if next_url and next_url != "/logout/":
                    response = redirect(next_url)
                else:
                    response = redirect("/class_list/")
                response.set_signed_cookie("login", "yes", salt="SSS")
                return response
        return render(request, "login.html")

    Session

    Session的由来

    Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session。

    问题来了,基于HTTP协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的Cookie就起到桥接的作用。

    我们可以给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。

    总结而言:Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本。

    另外,上述所说的Cookie和Session其实是共通性的东西,不限于语言和框架。

    Django中Session相关方法

     

    # 获取、设置、删除Session中数据
    request.session['k1']
    request.session.get('k1',None)
    request.session['k1'] = 123
    request.session.setdefault('k1',123) # 存在则不设置
    del request.session['k1']
    
    
    # 所有 键、值、键值对
    request.session.keys()
    request.session.values()
    request.session.items()
    request.session.iterkeys()
    request.session.itervalues()
    request.session.iteritems()
    
    # 会话session的key
    request.session.session_key
    
    # 将所有Session失效日期小于当前日期的数据删除
    request.session.clear_expired()
    
    # 检查会话session的key在数据库中是否存在
    request.session.exists("session_key")
    
    # 删除当前会话的所有Session数据
    request.session.delete()
      
    # 删除当前的会话数据并删除会话的Cookie。
    request.session.flush() 
        这用于确保前面的会话数据不可以再次被用户的浏览器访问
        例如,django.contrib.auth.logout() 函数中就会调用它。
    
    # 设置会话Session和Cookie的超时时间
    request.session.set_expiry(value)
        * 如果value是个整数,session会在些秒数后失效。
        * 如果value是个datatime或timedelta,session就会在这个时间后失效。
        * 如果value是0,用户关闭浏览器session就会失效。
        * 如果value是None,session会依赖全局session失效策略。

    Session流程解析

    Session版登陆验证

     

    from functools import wraps
    
    
    def check_login(func):
        @wraps(func)
        def inner(request, *args, **kwargs):
            next_url = request.get_full_path()
            if request.session.get("user"):
                return func(request, *args, **kwargs)
            else:
                return redirect("/login/?next={}".format(next_url))
        return inner
    
    
    def login(request):
        if request.method == "POST":
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
    
            if user == "alex" and pwd == "alex1234":
                # 设置session
                request.session["user"] = user
                # 获取跳到登陆页面之前的URL
                next_url = request.GET.get("next")
                # 如果有,就跳转回登陆之前的URL
                if next_url:
                    return redirect(next_url)
                # 否则默认跳转到index页面
                else:
                    return redirect("/index/")
        return render(request, "login.html")
    
    
    @check_login
    def logout(request):
        # 删除所有当前请求相关的session
        request.session.delete()
        return redirect("/login/")
    
    
    @check_login
    def index(request):
        current_user = request.session.get("user", None)
        return render(request, "index.html", {"user": current_user})

    Django中的Session配置

    Django中默认支持Session,其内部提供了5种类型的Session供开发者使用。

     

    1. 数据库Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
    
    2. 缓存Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
    
    3. 文件Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 
    
    4. 缓存+数据库
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
    
    5. 加密Cookie Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
    
    其他公用设置项:
    SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
    SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
    SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
    SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)

    CBV中加装饰器相关

    CBV实现的登录视图

    class LoginView(View):
    
        def get(self, request):
            """
            处理GET请求
            """
            return render(request, 'login.html')
    
        def post(self, request):
            """
            处理POST请求 
            """
            user = request.POST.get('user')
            pwd = request.POST.get('pwd')
            if user == 'alex' and pwd == "alex1234":
                next_url = request.GET.get("next")
                # 生成随机字符串
                # 写浏览器cookie -> session_id: 随机字符串
                # 写到服务端session:
                # {
                #     "随机字符串": {'user':'alex'}
                # }
                request.session['user'] = user
                if next_url:
                    return redirect(next_url)
                else:
                    return redirect('/index/')
            return render(request, 'login.html')

     

    要在CBV视图中使用我们上面的check_login装饰器,有以下三种方式:

    from django.utils.decorators import method_decorator

    1. 加在CBV视图的get或post方法上

     

    from django.utils.decorators import method_decorator
    
    
    class HomeView(View):
    
        def dispatch(self, request, *args, **kwargs):
            return super(HomeView, self).dispatch(request, *args, **kwargs)
    
        def get(self, request):
            return render(request, "home.html")
        
        @method_decorator(check_login)
        def post(self, request):
            print("Home View POST method...")
            return redirect("/index/")

    2. 加在dispatch方法上

     

    from django.utils.decorators import method_decorator
    
    
    class HomeView(View):
    
        @method_decorator(check_login)
        def dispatch(self, request, *args, **kwargs):
            return super(HomeView, self).dispatch(request, *args, **kwargs)
    
        def get(self, request):
            return render(request, "home.html")
    
        def post(self, request):
            print("Home View POST method...")
            return redirect("/index/")

    因为CBV中首先执行的就是dispatch方法,所以这么写相当于给get和post方法都加上了登录校验。

    3. 直接加在视图类上,但method_decorator必须传 name 关键字参数

    如果get方法和post方法都需要登录校验的话就写两个装饰器。

     

    from django.utils.decorators import method_decorator
    
    @method_decorator(check_login, name="get")
    @method_decorator(check_login, name="post")
    class HomeView(View):
    
        def dispatch(self, request, *args, **kwargs):
            return super(HomeView, self).dispatch(request, *args, **kwargs)
    
        def get(self, request):
            return render(request, "home.html")
    
        def post(self, request):
            print("Home View POST method...")
            return redirect("/index/")

    补充

    CSRF Token相关装饰器在CBV只能加到dispatch方法上,或者加在视图类上然后name参数指定为dispatch方法。

    备注:

    • csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
    • csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

     

    from django.views.decorators.csrf import csrf_exempt, csrf_protect
    from django.utils.decorators import method_decorator
    
    
    class HomeView(View):
    
        @method_decorator(csrf_exempt)
        def dispatch(self, request, *args, **kwargs):
            return super(HomeView, self).dispatch(request, *args, **kwargs)
    
        def get(self, request):
            return render(request, "home.html")
    
        def post(self, request):
            print("Home View POST method...")
            return redirect("/index/")

    或者

    from django.views.decorators.csrf import csrf_exempt, csrf_protect
    from django.utils.decorators import method_decorator
    
    
    @method_decorator(csrf_exempt, name='dispatch')
    class HomeView(View):
       
        def dispatch(self, request, *args, **kwargs):
            return super(HomeView, self).dispatch(request, *args, **kwargs)
    
        def get(self, request):
            return render(request, "home.html")
    
        def post(self, request):
            print("Home View POST method...")
            return redirect("/index/")

    分页

    当数据库中数据有很多,我们通常会在前端页面做分页展示。

    分页的数据可以在前端页面实现,也可以在后端实现分页。

    后端实现分页的原理就是每次只请求一页数据。

    准备工作

    我们使用脚本批量创建一些测试数据(将下面的代码保存到bulk_create.py文件中放到Django项目的根目录,直接执行即可。):

    import os
    
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
    
        import django
        django.setup()
    
        from app01 import models
        bulk_obj = (models.Publisher(name='沙河第{}出版社'.format(i)) for i in range(300))
        models.Publisher.objects.bulk_create(bulk_obj)

    自定义分页

    def publisher_list(request):
        # 从URL中取当前访问的页码数
        try:
            current_page = int(request.GET.get('page'))
        except Exception as e:
            # 取不到或者页码数不是数字都默认展示第1页
            current_page = 1
        # 总数据量
        total_count = models.Publisher.objects.count()
        # 定义每页显示多少条数据
        per_page = 10
        # 计算出总页码数
        total_page, more = divmod(total_count, per_page)
        if more:
            total_page += 1
        # 定义页面上最多显示多少页码(为了左右对称,一般设为奇数)
        max_show = 11
        half_show = max_show // 2
        # 计算一下页面显示的页码范围
        if total_page <= max_show:  # 总页码数小于最大显示页码数
            page_start = 1
            page_end = total_page
        elif current_page + half_show >= total_page:  # 右边越界
            page_end = total_page
            page_start = total_page - max_show
        elif current_page - half_show <= 1:  # 左边越界
            page_start = 1
            page_end = max_show
        else:  # 正常页码区间
            page_start = current_page - half_show
            page_end = current_page + half_show
        # 数据索引起始位置
        data_start = (current_page-1) * per_page
        data_end = current_page * per_page
    
        publisher_list = models.Publisher.objects.all()[data_start:data_end]
    
        # 生成页面上显示的页码
        page_html_list = []
        page_html_list.append('<nav aria-label="Page navigation"><ul class="pagination">')
        # 加首页
        first_li = '<li><a href="/publisher_list/?page=1">首页</a></li>'
        page_html_list.append(first_li)
        # 加上一页
        if current_page == 1:
            prev_li = '<li><a href="#"><span aria-hidden="true">&laquo;</span></a></li>'
        else:
            prev_li = '<li><a href="/publisher_list/?page={}"><span aria-hidden="true">&laquo;</span></a></li>'.format(current_page - 1)
        page_html_list.append(prev_li)
        for i in range(page_start, page_end + 1):
            if i == current_page:
                li_tag = '<li class="active"><a href="/publisher_list/?page={0}">{0}</a></li>'.format(i)
            else:
                li_tag = '<li><a href="/publisher_list/?page={0}">{0}</a></li>'.format(i)
            page_html_list.append(li_tag)
        # 加下一页
        if current_page == total_page:
            next_li = '<li><a href="#"><span aria-hidden="true">&raquo;</span></a></li>'
        else:
            next_li = '<li><a href="/publisher_list/?page={}"><span aria-hidden="true">&raquo;</span></a></li>'.format(current_page + 1)
        page_html_list.append(next_li)
        # 加尾页
        page_end_li = '<li><a href="/publisher_list/?page={}">尾页</a></li>'.format(total_page)
        page_html_list.append(page_end_li)
        page_html_list.append('</ul></nav>')
        page_html = "".join(page_html_list)
        return render(request, "publisher_list.html", {"publisher_list": publisher_list, "page_html": page_html})
    class Pagination(object):
        """自定义分页(Bootstrap版)"""
        def __init__(self, current_page, total_count, base_url, per_page=10, max_show=11):
            """
            :param current_page: 当前请求的页码
            :param total_count: 总数据量
            :param base_url: 请求的URL
            :param per_page: 每页显示的数据量,默认值为10
            :param max_show: 页面上最多显示多少个页码,默认值为11
            """
            try:
                self.current_page = int(current_page)
            except Exception as e:
                # 取不到或者页码数不是数字都默认展示第1页
                self.current_page = 1
            # 定义每页显示多少条数据
            self.per_page = per_page
            # 计算出总页码数
            total_page, more = divmod(total_count, per_page)
            if more:
                total_page += 1
            self.total_page = total_page
            # 定义页面上最多显示多少页码(为了左右对称,一般设为奇数)
            self.max_show = max_show
            self.half_show = max_show // 2
            self.base_url = base_url
    
        @property
        def start(self):
            return (self.current_page-1) * self.per_page
    
        @property
        def end(self):
            return self.current_page * self.per_page
    
        def page_html(self):
            # 计算一下页面显示的页码范围
            if self.total_page <= self.max_show:  # 总页码数小于最大显示页码数
                page_start = 1
                page_end = self.total_page
            elif self.current_page + self.half_show >= self.total_page:  # 右边越界
                page_end = self.total_page
                page_start = self.total_page - self.max_show
            elif self.current_page - self.half_show <= 1:  # 左边越界
                page_start = 1
                page_end = self.max_show
            else:  # 正常页码区间
                page_start = self.current_page - self.half_show
                page_end = self.current_page + self.half_show
            # 生成页面上显示的页码
            page_html_list = []
            page_html_list.append('<nav aria-label="Page navigation"><ul class="pagination">')
            # 加首页
            first_li = '<li><a href="{}?page=1">首页</a></li>'.format(self.base_url)
            page_html_list.append(first_li)
            # 加上一页
            if self.current_page == 1:
                prev_li = '<li><a href="#"><span aria-hidden="true">&laquo;</span></a></li>'
            else:
                prev_li = '<li><a href="{}?page={}"><span aria-hidden="true">&laquo;</span></a></li>'.format(
                    self.base_url, self.current_page - 1)
            page_html_list.append(prev_li)
            for i in range(page_start, page_end + 1):
                if i == self.current_page:
                    li_tag = '<li class="active"><a href="{0}?page={1}">{1}</a></li>'.format(self.base_url, i)
                else:
                    li_tag = '<li><a href="{0}?page={1}">{1}</a></li>'.format(self.base_url, i)
                page_html_list.append(li_tag)
            # 加下一页
            if self.current_page == self.total_page:
                next_li = '<li><a href="#"><span aria-hidden="true">&raquo;</span></a></li>'
            else:
                next_li = '<li><a href="{}?page={}"><span aria-hidden="true">&raquo;</span></a></li>'.format(
                    self.base_url, self.current_page + 1)
            page_html_list.append(next_li)
            # 加尾页
            page_end_li = '<li><a href="{}?page={}">尾页</a></li>'.format(self.base_url, self.total_page)
            page_html_list.append(page_end_li)
            page_html_list.append('</ul></nav>')
            return "".join(page_html_list)
    def publisher_list(request):
        # 从URL中取当前访问的页码数
        current_page = int(request.GET.get('page'))
        # 比len(models.Publisher.objects.all())更高效
        total_count = models.Publisher.objects.count()
        page_obj = Pagination(current_page, total_count, request.path_info)
        data = models.Publisher.objects.all()[page_obj.start:page_obj.end]
        page_html = page_obj.page_html()
        return render(request, "publisher_list.html", {"publisher_list": data, "page_html": page_html})

    Django内置分页

    from django.shortcuts import render
    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    
    L = []
    for i in range(999):
        L.append(i)
    
    def index(request):
        current_page = request.GET.get('p')
    
        paginator = Paginator(L, 10)
        # per_page: 每页显示条目数量
        # count:    数据总个数
        # num_pages:总页数
        # page_range:总页数的索引范围,如: (1,10),(1,200)
        # page:     page对象
        try:
            posts = paginator.page(current_page)
            # has_next              是否有下一页
            # next_page_number      下一页页码
            # has_previous          是否有上一页
            # previous_page_number  上一页页码
            # object_list           分页之后的数据列表
            # number                当前页
            # paginator             paginator对象
        except PageNotAnInteger:
            posts = paginator.page(1)
        except EmptyPage:
            posts = paginator.page(paginator.num_pages)
        return render(request, 'index.html', {'posts': posts})
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <ul>
        {% for item in posts %}
            <li>{{ item }}</li>
        {% endfor %}
    </ul>
    <div class="pagination">
          <span class="step-links">
            {% if posts.has_previous %}
                <a href="?p={{ posts.previous_page_number }}">Previous</a>
            {% endif %}
              <span class="current">
                Page {{ posts.number }} of {{ posts.paginator.num_pages }}.
              </span>
              {% if posts.has_next %}
                  <a href="?p={{ posts.next_page_number }}">Next</a>
              {% endif %}
          </span>
    </div>
    </body>
    </html>

    转载:https://www.cnblogs.com/liwenzhou/p/8343243.html

     

     

     

     

     

     

     

     

     

     

    展开全文
  • Cookie对象的几个常用方法:Add:新增一个Cookie对象Clear:清楚会话状态中的所有数据Remove:删除会话中的项Get:通过变量名或索引得到Cookie的变量值GetKey:以索引值来获取Cookie的变量名...

    httpcookie对象,是成键值对出现的。


    Cookie对象的常用的几个属性:
    Name:获取或设置Cookie的名称
    Expires:获取或设置Cookie的过期时间


    Cookie对象的几个常用方法:
    Add:新增一个Cookie对象
    Clear:清楚会话状态中的所有数据
    Remove:删除会话中的项
    Get:通过变量名或索引得到Cookie的变量值
    GetKey:以索引值来获取Cookie的变量名称


    页面设计:

    <table border="1" style="width: 40%">
                
    <tr>
                    
    <td colspan="2" style="text-align: center">
                        用户登录
    </td>
                
    </tr>
                
    <tr>
                    
    <td>
                        用户名:
    </td>
                    
    <td >
                        
    <asp:TextBox ID="TextBox1" runat="server" ></asp:TextBox></td>
                
    </tr>
                
    <tr>
                    
    <td>
                        密 码:
    </td>
                    
    <td >
                        
    <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox></td>    
                
    </tr>
                
    <tr>
                    
    <td width="34%">
                        Cookie有效期:
    </td>
                    
    <td style="width: 336px"><asp:RadioButtonList ID="RadioButtonList1" runat="server" RepeatDirection="Horizontal">
                            
    <asp:ListItem Value="1" Selected="True">1天</asp:ListItem>
                            
    <asp:ListItem Value="2">1个月</asp:ListItem>
                            
    <asp:ListItem Value="3">半年</asp:ListItem>
                            
    <asp:ListItem Value="4">1年</asp:ListItem>
                        
    </asp:RadioButtonList></td>
                
    </tr>
                
    <tr>
                    
    <td colspan="2" style="text-align: center">
                        
    <asp:Button ID="btnlog" runat="server" Text="登录" OnClick="btnlog_Click" />
                        
    <asp:Button ID="btnreg" runat="server" Text="注册" /></td>
                
    </tr>
            
    </table>

     

     


    后台代码:

    ExpandedBlockStart.gif代码
    protected void btnlog_Click(object sender, EventArgs e)
    {
    string name = "admin";
    string pass = "admin";
    if (this.TextBox1.Text == "admin" && this.TextBox2.Text == "admin")
    {
    if (this.RadioButtonList1.SelectedValue.ToString() == "1")
    {
    this.Response.Cookies["UserName"].Expires = DateTime.Now.AddDays(1);
    this.Response.Cookies["Password"].Expires = DateTime.Now.AddDays(1);
    }
    if (RadioButtonList1.SelectedValue.ToString() == "2")
    {
    this.Response.Cookies["UserName"].Expires = DateTime.Now.AddMonths(1);
    this.Response.Cookies["Password"].Expires = DateTime.Now.AddMonths(1);
    }
    if (RadioButtonList1.SelectedValue.ToString() == "3")
    {
    this.Response.Cookies["UserName"].Expires = DateTime.Now.AddYears(1 / 2);
    this.Response.Cookies["Password"].Expires = DateTime.Now.AddYears(1 / 2);
    }
    if (RadioButtonList1.SelectedValue.ToString() == "4")
    {
    this.Response.Cookies["UserName"].Expires = DateTime.Now.AddYears(1);
    this.Response.Cookies["Password"].Expires = DateTime.Now.AddYears(1);
    }
    this.Response.Cookies["UserName"].Value = this.TextBox1.Text;
    this.Response.Cookies["Password"].Value = this.TextBox2.Text;
    Response.Redirect(
    "getcookie.aspx");
    }
    else
    {
    Response.Redirect(
    "cookie.aspx");
    }

    }

     

    转到“getcookie.aspx”页面中

    protected void Page_Load(object sender, EventArgs e)
    {
    this.lab.Text = "欢迎" + this.Request.Cookies["UserName"].Value + "回来";
    }

     

    由于并非所有的浏览器都支持Cookie,并且数据信息是以文本的形式保存在客户端机器中,因此最好不要保存敏感的、为加密的数据,否则会影响到网站的安全性。

    string pass="admin";
    Response.Cookies[
    "pass"].Value=FormsAuthentication.HashPasswordForStoringInConfigFile(pass,"md5");

     

     

    转载于:https://www.cnblogs.com/greatandforever/archive/2009/12/07/1618815.html

    展开全文
  • Cookie浅析

    2012-04-14 11:18:00
    在JS里,内置于BOM对象有一种称为Cookie的对象,它形如: name=**;domain=**;path=**;.... 在FireFox浏览器里可以...设置和查询、删除cookie方法如下所示: var CookieUtil={ /** * 获取指定名称的cookie的值...

    在JS里,内置于BOM对象有一种称为Cookie的对象,它形如:

    name=**;domain=**;path=**;....

    在FireFox浏览器里可以通过编辑 ->首选项->隐私->自定义历史记录设置里,查看cookie的值等

     

    设置和查询、删除cookie的方法如下所示:

    var CookieUtil={
    		
    	/**
    	 * 获取指定名称的cookie的值
    	 */
    	get:function(name){
    		var cookieName=encodeURIComponent(name)+"=";
    		var cookieStart=document.cookie.indexOf(cookieName);
    		var cookieValue=null;
    		if(cookieStart>=-1){
    			var cookieEnd=document.cookie.indexOf(";", cookieStart);
    			if(cookieEnd==-1){
    				cookieEnd=document.cookie.length;
    			}
    			cookieValue=decodeURIComponent(document.cookie.substring(cookieStart, cookieEnd));
    		}		
    		return cookieValue;
    	},
    	
    	/**
    	 * 设置cookie
    	 * 形如name=**;expires=**;domain=**;secure
    	 * 
    	 * @param name  Cookie的名称
    	 * @param value Cookie的值
    	 * @param expires Cookie的过期时间
    	 * @param path 对于指定域,才会向服务器发送cookie
    	 * @param domain Cookie对于哪个域是有效的,所有向该域发送的请求里都会包含这个cookie信息
    	 * @param secure 指定后,cookie只有在使用ssl连接的时候才会发送到服务器(https以SSL为基础)
    	 */	
    	set:function(name,value,expires,path,domain,secure){
    		var cookieText=encodeURIComponent(name)+"="+encodeURIComponent(value);
    		if(expires instanceof Date){
    			cookieText+=";expires="+expires.toGMTString();
    		}
    		if(path){
    			cookieText+=";path="+path;
    		}
    		if(domain){
    			cookieText+=";domain="+domain;
    		}
    		if(secure){
    			cookieText+=";secure";
    		}
    		document.cookie=cookieText;
    	},
    	
    	//取消cookie
    	unset:function(name, value, path, domain, secure){
    		this.set(name, value, new Date(0), path, domain, secure);
    	}	
    };
    

     

     调用的例子如下所示:

    (function(){
    	CookieUtil.set('name', 'Nicholas');
    	CookieUtil.set('book','thinking in java');
    	console.log('Cookie:'+CookieUtil.get('name'));
    	console.log('Cookie:'+CookieUtil.get('book'));
    	
    	CookieUtil.unset('name');
    	CookieUtil.unset('book');
    	CookieUtil.set('book', 'thinking in python', new Date('January 1,2013'), '/book/','http://wrox.com');
    })();

    转载于:https://www.cnblogs.com/bestchenwu/archive/2012/04/14/9655393.html

    展开全文
  • ​​​​​​目录 0x00 错误与异常 0x01 用户自定义错误 0x02 错误的显示控制: 0x03 记录错误日志 ...3.删除cookie方法 0x08 SESSION 0x09 关闭Cookie怎么办? 0x0A关于session的配置 ...

    ​​​​​​目录

    0x00 错误与异常

    0x01 用户自定义错误

    0x02 错误的显示控制:

    0x03 记录错误日志

    0x04 异常

    0x05自定义异常类

    0x06 会话

    0x07 Cookie

    1.cookie的原理

    2.cookie的使用

    3.删除cookie的方法

    0x08 SESSION

    0x09 关闭Cookie怎么办?

    0x0A关于session的配置

    0x0C 用户登录实战


    0x00 错误与异常

    错误:语法错误,编译错误

    异常:逻辑上的错误,即按照我们的逻辑不应该出现,但是仍然出现的错误。

    错误级别:

    E_ALL:所有的错误值

    E_ERROR:致命的运行时错误 1 Fatal Error 例如重复定义函数。

    E_PARSE:编译时的解析错误

    E_WARNING:警告,例如引入了一个不存在的文件。

    E_NOTICE:运行时的提醒,通常是逻辑上的错误。例如,使用了一个未定义的变量

    E_USER_EROOR:用户自定义的致命错误

    E_USER_WARING:用户自定义的警告

    E_USER_NOTICE:用户自定义的提醒

    deprecated:废弃的,表示你用了比较老的,已经废弃的东西。

    0x01 用户自定义错误

    <?php
    set_error_handler('Produce_Error',E_ALL);
    function Produce_Error($a,$b,$c,$d){
    
    echo '这是我定义的错误处理函数';
    
    echo '<br/>';
    
    echo '错误级别'.$a;
    
    echo '<br/>';
    
    echo '错误信息:'.$b;
    
    echo '<br/>';
    
    echo '发生错误的脚本的绝对路径'.$c;
    
    echo '<br/>';
    
    echo '错误行号:'.$d;
    
    echo '<br/>';
    
    }
    echo $a;
    
    ?>

    trigger_error(“自定义错误提示”,错误提示类型)

    错误提示类型:E_USER_ERROR,E_USER_NOTICE(默认),E_USER_PARSE,E_USER_WARNING

    trigger_error(“我是用户自定义的错误”,);

    E_USER_NOTICE错误之后的代码仍然可以执行。

    注册错误处理函数:

    set_error_handler(”错误处理函数名“,E_ALL);

    例如:

    上线前需要错误显示,来修改代码,上线后则必须屏蔽掉错误的显示,屏蔽错误显示的方法有以下几种:

    第一种:错误抑制符@ 

    可以控制notice 和warning的错误

    不推荐这样用。最好的方法就是不要出现错误

    1.脚本中

    在哪个脚本中设置,只在哪个脚本中生效。

    脚本中的配置优先于配置文件中的配置。

    Ini_set(‘display_errors’,true);//true或者1表示展示错误

    Ini_set(‘display_errors’,false);//false 或者0表示不展示错误

    例如:

    修改错误级别:

    首先打开错误显示,然后限定只报告ERROR错误和NOTICE错误。

    在所有php脚本中都生效。

    打开php.ini,修改:

    Development Value:On//开发环境中打开

    Production Value:Off//生产环境即线上环境关闭。

    display error = On

    error_reporting  = E_ALL表示报告所有错误,前提是display error打开。可以修改此选项,只报告特定的错误。

    然后重启

    0x02 错误的显示控制:

    <?php
    echo @$a;
    
    @include_once 'lalala.php';
    
    ?>

    第二种修改错误的级别

    <?php
    ini_set('display_errors',false);
    echo $a;
    include_once 'lalala.php';
    ?>

    注意:这个不能屏蔽解析错误,因为解析错误是在代码执行之前,解析时报的错误,这个时候代码还没有执行,所以屏蔽错误的语句还没有生效。

    <?php
    ini_set('display_errors',true);
    error_reporting(E_ERROR|E_NOTICE);
    echo $a;
    
    include_once 'lalala.php';
    
    ?>

    2.修改配置文件

    <?php
    try{
    echo 'before','<br/>';
    
    throw new Exception('我是一个异常信息');//Exception是一个内置的类。throw关键字用于抛出异常
    
    //改变执行流程
    echo 'after'.'<br/>';
    
    }catch(Exception $e){//Exception用于限定$e的类型,即限定$e必须是Exception的一个对象
    
    echo $e->getMessage();//打印收到的异常信息。
    
    echo '执行流程已改变';
    
    }
    ?>

    0x03 记录错误日志

    在php.ini中配置:

    log_errors = On;

    Error_log = php_error.log //表示错误日志存储到php_error.log这个文件中,可以修改该文件名称。

    默认在脚本的同源文件夹中保存该文件。

    在脚本中可以向错误日志中写入自定义的错误。

    error_log(‘自定义的错误信息,自动发送到错误日志’,0); //0默认向系统日志中写。系统日志就是上文中提到的那个日志

    Error_log('自定义错误信息’,3,’xxx.txt’);3表示向自定义的xxx.txt中写入错误信息。

    0x04 异常

    自定义的异常类必须继承系统的异常类

    一次请求一次响应就是一个会话

    0x05自定义异常类

    <?php
    class MyException extends Exception{
    
    public function test(){
    
    echo '这是自定义的异常类';
    
    }
    }
    try{
    throw new MyException('这是自定义的异常类');
    
    }catch(MyException $mye){
    
    echo $mye->test();
    
    }
    ?>

    0x06 会话

    其中path限定了cookie什么情况下被发送。

    如果设置为true,那么只能通过http请求的方式获得cookie,例如:js的document.cookie这种方式就不能输出httponly属性为true的cookie行了。

    <?php
    setcookie('only','189',time()+3600,"/","",false,true);
    ?>
    
    <?php
    var_dump($_COOKIE);
    echo '<script>alert(document.cookie);</script>'
    
    ?>

    删除cookie

     

    0x07 Cookie

    1.cookie的原理

    cookie存储在客户端(浏览器)

    但是cookie是服务器生成的一小段ASCII文本,然后将cookie存到http响应的set-cookie键值对发给浏览器,设置浏览器的cookie

    当浏览器收到这段文本后,会以键值对的形式将cookie存在本地的一个目录下。

    当浏览器下一次向同一个服务器发送请求的时候,就会将本地存储的cookie加入http请求的cookie键值对发给服务器。

    Cookie值会自动存入服务器的php脚本的$_COOKIE数组中。

    注意:$_COOKIE数组只有当请求中有cookie键值对的时候,才会被填充数据。也就是说如果在同一个脚本中setcookie和var_dump($COOKIE)。

    那么第一次请求这个页面的时候,是不会打印出$COOKIE的。因为第一次请求中并没有cookie键值对。

    2.cookie的使用

    setcookie(name,value)设置cookie的键和值,如果没有指定第三个参数(删除cookie的时间),默认为当关闭浏览器后自动删除cookie

    setcookie(’name’,’xiaoming’,time()+60*60) 第三个参数的单位为s

    设置cookie的过期时间(expires)为设置成功之后的1个小时后,即便是关闭浏览器,只要没有到cookie的过期时间,cookie还会存在我们的客户端。

    time()返回的当前时间的时间戳,

    即请求/Company目录下的任何一个php文件时,该cookie(number:189)都会被包在请求中发送

    请求/(服务器公开根目录)下的任何一个php文件时,该cookie(name:xiaoming)都会被包在请求中发送

    也就是说

    在setcookie函数中,如果不设置path参数,那么默认cookie的发送范围就是当前文件夹。

    设置path:

    Setcookie(’name’,’dahua’,time()+7*24*3600,’\’);设置cookie的path属性为公开根目录,也就是说,不论请求公开目录(及其子目录)下那个php文件,这个cookie都会被带在请求中发过去。

     

    setcookie函数的第五个参数是域名Domain,建议设置为”“,表示当前域名

    第六个参数设置https,如果设置为1或者true,表示该cookie只能以https的方式来设置。如果不是https,那么就会设置失败。0表示关闭

    第七个参数设置httponly,默认为false或者空,

    3.删除cookie的方法

    方法一:将值设置为空

    setcookie(要删除的cookie名,’’,time()-1,以前在哪个路径下设置的就要在哪个路径下删)

    或者setcookie(要删除的cookie名.null,time()-1,path)

    方法二:

    unset($_COOKIE['name'])这种方式最好不要用,有坑。

    0x08 SESSION

    1.session原理:

    session值 == 超市门前储物柜里存放的东西 >>打印出来一个条形码session_id

    将session_id以cookie的形式存起来

    即 session的存取依靠于cookie

    session值存在服务器上。

    session_id以cookie的形式存在客户端。

     

    2.session使用

    setSession.php

    step1.先启动session:

    <?php
    session_start();
    ?>

    启动session时服务器会做两个操作:

    1.在服务器端生成文件sess(存在公开目录下的tmp文件夹中),大小为0KB,里面是空的,将来要存我们设置的session值。该文件的文件名由sess_'sessionID'组成。例如:sess_snrkjg35mrt0fmtt7a37uqdavn

    2.在客户端设置cookie,即响应报文的set-cookie字段 :PHPSESSID = snrkjg35mrt0fmtt7a37uqdavn

    step2.赋值

    <?php
    //setSession.php
    session_start();
    $_SESSION['username'] = 'xiaoming';
    ?>

    该session值将会被存入sess文件中

    step3.访问

    例如:

    可以在同一个文件访问它,也可以在另一文件比如printSession.php来访问它。同样,在访问前也必须session_start()

    <?php
    //printSession.php
    session_start();
    echo $_SESSION['username'];
    ?>

    当浏览器请求printSession.php的时候,请求头中cookie字段中便存有session_id。服务器接到请求后,根据session_id去寻找服务器上对应的sess文件。然后将sess文件中存储的值响应给浏览器。

    一旦session_id被删除,那么请求printSesson.php时,cookie字段中就没有session_id。服务器收到请求后更无法找到对应的sess文件。也无法将值返回给浏览器。

    session_id被删除后,再次请求setSession.php文件,将重新设置session_id;

    同一台终端的不同浏览器,请求setSession.php文件,在服务器端将为每个浏览器生成各自的sess文件。并且返回各自的session_id存在各个浏览器上。

    3.删除session

    deleteSession.php

    <?php
    session_start();
    session_destroy();
    ?>

     这种方式直接删除了整个sess的文件(并不会删除客户端的存储session_id的cookie,要删除此cookie,需要我们自己手动删除)。但是如果我们只想删除sess文件中的一个键值对呢?

    <?php
    session_start();
    unset($_SESSION['user']);
    ?>

    这种方式只删除session文件中,索引为user的session值,不会删除其他的数据。

    4.如何在php脚本中输出session_id的cookie键值对呢?

    <?php
    session_start();
    echo session_name();//key
    echo '<br/>';
    echo session_id();//value
    echo '<br/>';
    ?>

    0x09 关闭Cookie怎么办?

    关闭cookie的方法:

    FireFox 首选项>>隐私与安全>>Cookie>>权限管理>>输入网址,可以禁止访问该网址时使用cookie

    关闭cookie,只是禁止在请求头中发送cookie字段。并没有禁止响应头中set-Cookie字段。也就是说服务器仍然可以设置浏览器上的cookie,但是浏览器不能向服务器发送cookie

    当浏览器关闭cookie后,session还能用吗?

    能!

    当关闭cookie后,setSession.php可以正常运行,设置浏览器上的cookie,向sess文件中存值。但是,如果反复请求setSession.php,将会更新浏览器上的cookie(即session_id),并在服务器上生成新的sess文件。

    因为反复请求setSession时,本应该发送第一次设置好的session_id。这样服务器就知道session_id已经设置好了。但是,因为关闭了cookie。所以,不能成功发送。所以,服务器认为session_id并没有设置成功,所以生成了新的sess文件,并在set-cookie中存了新的session_id.

    <?php
    //setSession.php
    session_start();
    $_SESSION['username'] = 'xiaoming';
    $_SESSION['pwd'] = '23141';
    
    ?>

    解决方法:

    getSession.php

    <?php
    //printSession.php
    session_id('snrkjg35mrt0fmtt7a37uqdavn');//对应的session_id
    session_start();
    echo $_SESSION['username'];
    ?>

    这样一来就不需要浏览器向服务器发送session_id了。直接请求该printSession脚本,脚本中就存了session_id.

    完整版解决方案:

    用get传参发送session_id.

    <?php
    //setSession.php
    session_start();
    $_SESSION['username'] = 'xiaoming';
    $session_id = session_id();
    echo "<a href = 'printSession.php?sid=".$session_id."'>发送session_id</a>";
    ?>

    printSession.php

    <?php
    //printSession.php
    session_id($_GET['sid']);//对应的session_id
    session_start();
    echo $_SESSION['username'];
    ?>

    0x0A关于session的配置

    php.ini中

    session.save_handler = files

    表示session值存在sess文件中。以后可以修改为Redis数据库。

    session.save_path=‘C:\xxx\xxx\xxx’;

    表示服务器上sess文件存储的位置,可以自定义;

    session.name = PHPSESSID

    表示session_id的cookie的键是PHPSESSID,可以修改

    session.auto_start = 0

    表示每次都需要手动输入session_start.可以修改为1.以后就不需要session_start了。但是不建议这样搞

    0x0B session和cookie的区别:

    session值存在服务端,cookie存在客户端

    session存储的大小可以说没限制,cookie最大为4KB

    session安全一些。cookie相对不安全

    session的存取基于cookie。但是cookie关闭后,session照样可以用。

    0x0C 用户登录实战

    流程:

    1. 用户输入用户名,密码
    2. 用户名和密码正确,设置session,跳转到用户中心
    3. 如果错误,跳转到登录页面。

    忘了说明你敲得说,敲个几百遍,绝对忘不了。

    php中header("Location:路径")函数可以用来跳转页面。

    login.html

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset = 'utf-8'/>
        </head>
        <body>
            <form action="login.php" method = "post">
                    用户名:<input type="text" name="username" id=""/><br/>
                    密码:<input type="password" name="password" id=""><br/>
                    <input type = "submit" value = "登录"/><br/>
            </form>
        </body>
    </html>
    

    login.php

    <?php
    //var_dump($_POST);
    $user_name = $_POST['username'];
    $password = $_POST['password'];
    if($user_name == 'XDU' && $password == '123456'){
        echo '登录成功';
        session_start();
        $_SESSION['username'] = $user_name;
        header('Location:user.php?username='.$user_name);
    }else{
        echo '失败';
    }
    ?>

    user.php用户中心

    为什么要先判断$_SESSION['username']是否存在呢?因为如果不判断,用户可以从url栏中输入用户中心的网址,直接跳过登录,访问用户中心。

    凡是正常登录的用户,必然会存一个session值。我们只要判断有没有这个session值,就可以将正常登录用户和非正常访问用户中心的用户区分开。

    <?php
    session_start();
    if(isset($_SESSION['username'])){
        $user_name = $_GET['username'];
        echo $user_name.',欢迎到用户中心!';
        echo '<a href="logout.php">退出</a>';
    }else{
        header('Location:login.html');
    }
    ?>

    logout.php

    <?php
    session_start();
    unset($_SESSION['username']);
    header('Location:login.html');
    ?>

     

    展开全文
  • 本页概要更多信息针对站点的隐私操作高级隐私设置导入自定义隐私首选项如何查看和删除 Cookie为高级用户和 IT 专业人员提供的附加信息自定义隐私(和安全)设置禁止用户访问所有隐私设置方法 1:使用“组策略”管理...
  • 文章目录csrf简单用法COOKIE登录校验案例sessionclass怎样使用装饰器补充AJAXAJAX请求如何设置csrf_tokenDjango内置的serializers序列化方法JS 操作替代删除提示框Form组件form校验RegexValidator验证器,通过form_...
  • 写入缓存Cookie自定义的User-Agent等参数,但是对于有几十个接口的网络层,我才不想用注解配置Headers,目前网上很多文章的方法真对这两个版本都不是很适用,有的给出的方法已经被删除,有的方法会报出异常 ...
  • AsyncQueryHandler的作用异步对数据库进行增加、删除、更新、查询操作。... 自定义继承AsyncQueryHandler的子类,实现相关的方法。 void onDeleteComplete(int token, Object cookie, int result)
  • 指南-源码

    2021-02-09 04:39:53
    组态储存资料检索数据删除资料闪存数据自定义驱动程序 表格要求手动创建验证器错误讯息验证规则自订规则 组态写入特定频道创建自定义渠道 刀片模板本土化资产编制 认证方式授权书加密/散列CSRF保护XSS保护 产生指令...
  • 升级方法 ---------------------------------------------------- 1. 将升级包中 upload 下所有的文件上传至网站根目录覆盖。 2. 访问 upgrade 目录(例如 http://test.com/upgrade/ ),执行升级。 3. 登陆管理...
  • 文章目录一、Django 请求(一)常见的请求方式(二)请求状态码(三)Django请求对象二、Django表单1、定义数据库模型2、前端构建表单3、后端接收保存数据三、Django CSRF在表单当中添加csrf的方法:四、Django后端...
  • 6.4 cookie 6.5 会话状态 6.5.1 会话架构 6.5.2 使用会话状态 6.5.3 配置会话状态 6.5.4 会话状态安全 6.6 应用程序状态 6.7 总结 第二部分 数据访问 第7章 基础 7.1 ADO.NET架构 7.1.1 ADO...
  • 某B2B自动发帖 v1.0

    2021-02-07 16:45:53
    信息之家B2B自动发帖是一个非常实用便捷的自动发帖小工具,主要面向在B2B论坛网站运营内容的小伙伴们使用,可以帮助大家更加轻松高效的完成内容运行工作,支持自定义账号、标题、内容、段落、图片等设置,使用方法也...
  • 9.3.5 删除记录 289 9.3.6 插入记录 289 9.3.7 sqldatasource 的不足 290 9.4 objectdatasource 291 9.4.1 选择记录 291 9.4.2 更新记录 295 9.4.3 使用数据对象执行更新 296 9.5 数据源控件的限制 299...
  • 本阶段主要带领大家学习会话控制中SESSIONH和COOKIE的概念和用法、还有文件操作、MySQL数据库建表,数据查询,添加,修改,删除等基本操作命令以及PHP面向过程方式操作数据库的方法。 步骤4: PHP项目实战 在本阶段,...
  • 本资料仅用于学习,请查看后24小时之内删除。 【课程内容】 第1章 01 计算机发展史 02 计算机系统 03 小结 04 数据的概念 05 进制转换 06 原码补码反码 07 物理层和数据链路层 08 网络层和arp协议 09 传输层和应用...
  • asp.net本质论(带目录)

    2015-12-27 00:43:49
    6.7.6 删除所有的缓存项目 /246 6.7.7 Web 服务器端的页面缓存 /247 6.7.8 页面局部缓存 /249 6.7.9 自定义的输出缓存提供器 /253 6.8 Memcached /254 6.8.1 下载和安装 Memcached /255 6.8.2 在 ASP.NET 中...
  • 3-08.cs 用一个输入参数通过值传递一个变量给一个方法。 3-09.cs 一维数组的使用。 3-10.cs 使用代理类型。 3-11.cs 使用接口。 3-12.cs 装箱操作。 3-13.cs 字符串操作。 3-14.cs if语句的使用。 3-15.cs ...
  • Android 上百实例源码分析以及开源分析 集合打包4

    千次下载 热门讨论 2012-07-10 21:54:03
    从该项目源代码中,可以 掌握socket连接、管理cookie方法。 Shadow项目 20个目标文件,TorProxy项目83个目标文件。感兴趣的童靴可以好好研究哟。 11、jamendo-开源在线音乐 本项目共113个目标文件。 粗略介绍每...
  • 基于ORM实现用户增加删除修改以及查看详细 Django字段类型介绍 DjangoORM字段参数介绍 DjangoORM外键操作 基于DjangoORM的外键实现增加用户(含select标签) 作业 第20周 课程安排 上课内容回顾 Django一对多的...
  • ThinkPHP实战(夏磊)

    2018-05-28 04:40:08
    .2.4cookie删除 141 .3分页 141 .3.1分页语法 141 .3.2测试 142 .4文件上传 145 .5验证码 146 .6图像处理 149 .6.1实例化Image 149 .6.2获取图片基本信息 149 .6.3图像裁剪 150 .6.4图像缩略图 151 .6.5...
  • 实例158 数据删除方法 实例159 数据分页的方法 实例160 对结果集进行分页的方法 实例161 关闭数据库的方法 实例162 数据库事务处理的方法 实例163 调用数据库存储过程的方法 第6章 Servlet技术 6.1 ...
  • 6、弹出一次不再重复弹出,使用Cookie控制弹出时间间隔; 7、如果设置自动弹出,则页面加载完毕后延迟3秒弹出; 8、可自定义“关于我们”弹出窗口信息内容。 9、删除上个版本的“技术支持:bbs.7drc.com”信息;...
  • 9-21 5.cookie②-更新cookie 删除cookie cookie运用案例 9-21 6.cookie③-雇员管理系统使用cookie技术 1.显示上传登录时间2.保留登录id 9-23 1回顾 9-23 2.session①-session原理介绍 保存session 9-23 3.session②-...
  • 9-21 5.cookie②-更新cookie 删除cookie cookie运用案例 9-21 6.cookie③-雇员管理系统使用cookie技术 1.显示上传登录时间2.保留登录id 9-23 1回顾 9-23 2.session①-session原理介绍 保存session 9-23 3.session②-...
  • 9-21 5.cookie②-更新cookie 删除cookie cookie运用案例 9-21 6.cookie③-雇员管理系统使用cookie技术 1.显示上传登录时间2.保留登录id 9-23 1回顾 9-23 2.session①-session原理介绍 保存session 9-23 3.session②-...
  • Response增加COOKIE相关方法,调整basicAuth()参数,增加digestAuth()方法; Helper::createFolders()增加返回值(bool); FileCache删除Request Cache相关逻辑,Memcache增加多服务器支持; RequestCache接口...
  • 浅说 XSS 和 CSRF

    2021-01-09 07:07:28
    将一些隐私数据像 cookie、session 发送给攻击者,将受害者重定向到一个由攻击者控制的网站,在受害者的机器上进行一些恶意操作。 <p>XSS攻击可以分为3类:反射型(非持久型)、存储...

空空如也

空空如也

1 2 3 4 5 6
收藏数 102
精华内容 40
关键字:

自定义删除cookie方法