精华内容
下载资源
问答
  • 网站中点击退出,如果仅仅是重定向到登录/出页面,此时在浏览器地址栏中输入登录后的某个页面地址如主页,你会发现不用登录就能访问,这种退出并不安全了,下面通过本文给大家介绍安全退出时清空Session或Cookie的...
  • django session 登录 from django.views.decorators.csrf import csrf_exempt # 登录页 @csrf_exempt def login(request): print('login==================') # 获取验证码 verification_code_ = verification_...

    django session 登录

    from django.views.decorators.csrf import csrf_exempt
    # 登录页
    @csrf_exempt
    def login(request):
        print('login==================')
        # 获取验证码
        verification_code_ = verification_code(len=4)
        if (request.method == 'POST'):
            body = request.POST
            # 用户名
            user_name = body['user_name']
            # 密码
            password = body['password']
            # 验证码
            Verification_Code = body['Verification_Code']
    
            # request.session.set_expiry(1800000) # 30分钟后过期
            # 把用户名存进session
            request.session['username'] = user_name
            # request.session['is_login'] = True
            # 退出浏览器session失效(必须所有浏览器都关闭时,才能彻底清除session)
            
            request.session.set_expiry(0)
    
            return redirect('../index/')
        return render(request, 'backend/login.html', {'verification_code': verification_code_, })
    
    # 点击退出登录
    def login_out(request):
        request.session.flush()  # 清空session
        # login_status = 0
        # return render(request, 'backend/index.html', {'login_status': login_status, })
        return redirect('../login/')
    
    
    # 首页
    def index(request):
        print('index===============')
        # 调用 判断session 是否过期 方法
        session_exist_ = session_exist(request)
        # 判断session 是否过期
        if session_exist_:
            list_ = models.Test.objects.all() # 获取所有的数据
            count = models.Test.objects.all().count() # 查询所有数据的个数
            limit = 2 # 每页展示的个数
            paginator = Paginator(list_, limit)
            page = request.GET.get('page')
            contacts = paginator.get_page(page)
            # request.session.set_expiry(0)
            return render(request, 'backend/index.html', {'list': contacts, 'count': count, 'limit': limit})
        else:
            print(2)
            return redirect('../login/')
    
    # 判断session 是否过期
    def session_exist(request):
        session_key = request.session.session_key
        # 判断 session_key是否存在
        if session_key == None:
            return False
        else:
            return True
            
    # 获取验证码
    def verification_code(len=4):
        ''' 随机生成4位的验证码 '''
        # 注意: 这里我们生成的是0-9A-Za-z的列表,当然你也可以指定这个list,这里很灵活
        # 比如: code_list = ['P','y','t','h','o','n','T','a','b'] # PythonTab的字母
        code_list = []
        for i in range(10):  # 0-9数字
            code_list.append(str(i))
        for i in range(65, 91):  # 对应从“A”到“Z”的ASCII码
            code_list.append(chr(i))
        for i in range(97, 123):  # 对应从“a”到“z”的ASCII码
            code_list.append(chr(i))
        myslice = random.sample(code_list, len)  # 从list中随机获取6个元素,作为一个片断返回
        verification_code = ''.join(myslice)  # list to string
        return verification_code
    
    # url
    urlpatterns = [
        path('admin/', admin.site.urls),
        # url(r'^$', TemplateView.as_view(template_name="backend/login.html")),
        # path('', TemplateView.as_view(template_name="backend/login.html")),
        # 登录
        path('login/', views.login),
        # 更新验证码
        path('verification_code_do/', views.verification_code_do),
        # 退出登录
        path('login_out/', views.login_out),
        # 首页
        path('index/', views.index),
    
    ]
    
    <!-- 登录页 -->
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <title>Login</title>
      <meta name="renderer" content="webkit">
      <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
      <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
      <meta name="apple-mobile-web-app-status-bar-style" content="black">
      <meta name="apple-mobile-web-app-capable" content="yes">
      <meta name="format-detection" content="telephone=no">
      <link rel="stylesheet" href="/static/css/layui.css">
      <style>
        body {
          background-color: #000;
        }
    
        .login {
          width: 450px;
          border: 1px solid #000;
          margin: 200px auto;
          padding: 40px 50px;
          box-sizing: border-box;
          background-color: #fff;
        }
    
        .login_p {
          text-align: center;
          margin: 0 0 35px 0;
        }
    
        .login_content {
          /*width: 250px;*/
          margin: 0 auto;
        }
    
        .login_input {
          margin: 10px 0 25px 0;
        }
    
        .login_content>div:nth-child(1) {
          margin: 0 0 10px 0;
        }
    
        .login_content>div:nth-child(3) {
          position: relative;
        }
    
        .login_content>div:nth-child(3)>input {
          width: 270px;
          position: absolute;
        }
    
        .login_content>div:nth-child(3)>span {
          position: absolute;
          width: 50px;
          left: 277px;
          display: inline-block;
          border: 1px solid #e6e6e6;
          text-align: center;
          padding: 9.5px;
          top: 28px;
        }
    
      </style>
    </head>
    
    <body>
    <div class="login">
      <form class="layui-form" id="myForm" method="post" action="../login/">
        <!--  <form class="layui-form" method="post" action="">-->
        <form class="layui-form" method="post" action="" omsubmit='return checkForm()'>
          <p class="login_p">后台管理系统</p>
          <div class="login_content">
            <div>
              <lable class="left_title">用户名:</lable>
              <input type="text" class="layui-input login_input" id="user_name" name="user_name">
            </div>
    
            <div>
              <lable>&nbsp;&nbsp;&nbsp;&nbsp;码:</lable>
              <input type="password" class="layui-input login_input" id="passwod" name="password">
            </div>
            <div>
              <lable>验证码:</lable>
              <input type="text" class="layui-input login_input" name="Verification_Code" id="Verification_Code">
    
              <span id="verification_btn" onclick="verification_btn()" data-value="{{verification_code}}">
                  {{verification_code}}</span>
    
            </div>
    
            <div style="margin-top:80px;">
              <button type="reset" class="layui-btn layui-btn-primary">重置</button>
              <button class="layui-btn" id="login_do" lay-submit lay-filter="formDemo">登录</button>
            </div>
    
          </div>
    
        </form>
        </form>
    </div>
    
    </body>
    <script src="/static/js/layui.js"></script>
    <!--调用分页的js方法-->
    <script src="/static/js/laypage.js"></script>
    <script src="/static/js/jquery.min.js"></script>
    
    <script>
      // 进入登录页就执行的方法
      $(document).ready(function () {
        if (window.name == "") {
          console.log("首次被加载");
          window.name = "isReload";  // 在首次进入页面时我们可以给window.name设置一个固定值
        } else if (window.name == "isReload") {
          console.log("页面被刷新");
          document.getElementById("myForm").reset() // 返回登录页时,清空表单中的数据
        }
    
      });
    
    
    
      // 获取验证码的元素
      var verification_btn = document.getElementById("verification_btn");
    
    
      document.getElementById("verification_btn").style.fontFamily = "Fixedsys"; //设置字体
      document.getElementById("verification_btn").style.letterSpacing = "5px"; //字体间距
      document.getElementById("verification_btn").style.color = "#0ab000"; //字体颜色
    
      // 点击验证码按钮,更新验证码
      verification_btn.onclick = function () {
        verification_value = $(this).attr("custom")
        $.ajax({
          url: '../verification_code_do/',
          dataType: 'json',
          type: 'POST',
          contentType: "application/json; charset=UTF-8",
          success: function (data) {
            // 更新新的验证码
            verification_code_ = data.verification_code_
            verification_btn.innerHTML = verification_code_;
          },
          error: function () {
            console.log(222)
          }
        })
      }
    
    
      // < !--form 表单提交 判断用户名,密码,验证码是否正确-- >
      $("form").submit(function () {
        // 用户名
        var user_name = $("input[name='user_name']").val();
        // 密码
        var password = $("input[name='password']").val();
        // 验证码
        var Verification_Code = $("input[name='Verification_Code']").val();
        // 图片中的验证码
        var verification_btn = document.getElementById("verification_btn");
        // 获取图片中验证码的值
        verification_btn = verification_btn.innerText
        console.log(verification_btn + '---------')
        if (user_name == "" || user_name == null || user_name == undefined) {
          alert("用户名错误");
          return false;/*阻止表单提交*/
        } else if (password == "" || password == null || password == undefined) {
          alert("密码错误");
          return false;/*阻止表单提交*/
        } else if (Verification_Code == "" || Verification_Code == null || Verification_Code == undefined || Verification_Code
          != verification_btn) {
          // alert("验证码错误");
          console.log('验证码错误')
          // 更新验证码
          $.ajax({
            url: '../verification_code_do/',
            dataType: 'json',
            type: 'POST',
            contentType: "application/json; charset=UTF-8",
            success: function (data) {
              // console.log(data)
              // 定义新的验证码
              verification_code_ = data.verification_code_;
    
              // 重新获取图片验证码 span 元素,验证码错误,更新验证码的值。
              var verification_btn = document.getElementById("verification_btn");
              verification_btn.innerText = verification_code_;
    
            },
            error: function () {
              console.log(222)
            }
          })
          return false;/*阻止表单提交*/
        } else {
          // < !--alert("登录成功"); -->
          return true;
        }
      })
    
    
    
    </script>
    
    </html>
    
    
    展开全文
  • Session 介绍: Session:在计算机的网络应用中,称为“会话控制”。Session对象储存特定用户会话所需的属性及配置信息,这样当用户应用程序的web页之间跳转时,储存在session对象中的变量将不会丢失,而是在整个用户...

    Session 介绍:
    Session:在计算机的网络应用中,称为“会话控制”。Session对象储存特定用户会话所需的属性及配置信息,这样当用户应用程序的web页之间跳转时,储存在session对象中的变量将不会丢失,而是在整个用户会话的过程中一直存在下去,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。
    Session的特点:
    不是线程安全的,应该避免多个线程共享同一个Session实例
    Session实例是轻量级的,所谓轻量级:是指他的创建和删除不需要消耗太多资源
    Session对象内部有一个缓存,被称为Hibernate第一缓存,他存放被当前工作单元中加载的对象,每个Session实例都有自己的缓存。 (摘抄于百度)

    然而在实际的项目,对Session的使用也是相当频繁的,稍微大型一点的模块,是必用的,往往很容易就会想起这个功能肯定会用到Session,这可能是Session的本意不是很难理解的原因,但在运用到项目时候就会有点转不过来的时候,从而导致了很多不必要的错误,我就遇到了一个很幼稚又典型的问题。(清空Session)

    为了方便理解,举一个来自自己项目的一个小实例:
    简单描述下功能:
    在这里插入图片描述
    主页的数据表格数据:(从商品浏览内提取过来的)
    在这里插入图片描述
    我主页的数据表格内的数据是从商品浏览模态框内提取出来的,然后再对提取出来的数据进行操作。点击时间框上红色圈的查找按钮,弹出商品浏览的模态窗体,然后再随意点击一行,再点击提取选定商品按钮,就会把这条提取的数据储存在Session中,然后传送到主页(商品浏览模态窗体背后这个表格)的那个表格中 (随意提取、可重复提取模态窗体内的数据),如果突然不想添加某条刚刚选取的商品或者添加多了,就可以通过清空Session来刷新当前操作,再提取自己想要的数据。
    由于对Session的理解不是很清晰,我在做这一功能的时候遇到了很多问题:
    举出几个对新入手Session容易搞混的误区吧:

    1. 就比如说我对Session会有哪些理解错误,我以为刷新当前页就可以把Session给清空,于是就给清空按钮的点击事件写了window.history.go(0);go(0)就相当于刷新此页的意思,go(-1)回到上一页, 那条数据从提取后的一条,变成了无数据,我就以为Session被清空了。
    2. 还是清空Session的问题,因为刚刚写的window.history.go(0);于是又想到了浏览器的一个自带的功能按钮 在这	里插入图片描述(重新加载此页) ,这个不也是刷新的意思,并且也有对应的操作,发现它的效果等同于写的那个方法,于是就正式入坑了。

    接着就是说明一下这个想法之后会遇到的错误:
    当你提取了想要的数据之后,点击所谓的清空,然后显示无数据,当你第二次再提取的时候,之前的数据和你刚刚提取的数据就会都显示在主页的数据表格中,这时候你就会觉得这Session怎么有”cookie”的效果?保存记忆了?
    后来理清了Session的思路才发现,犯了这么低级的错误。

    解决方法&详解:
    JS部分:
    function Empty(getData) { //清空按钮的点击方法
    layer.confirm(‘您确定要清空当前页面,重新开始吗?’, { icon: 3, title: ‘提示’, skin: “layui-layer-molv” }, function (index) { //相关提示
    layer.close(index); });
    $.post(“clearSession”, {}, function (data) {}); //.post提交
    }
    控制器部分:
    public ActionResult clearSession(){
    ReturnJsonVo returnJson = new ReturnJsonVo();//自己弄的一个实体,用来返回数据。
    Session.Remove(“getData”);//定义的Session名称,
    return Json(returnJson, JsonRequestBehavior.AllowGet); //接受返回值}
    清空按钮的清空Session效果解决之后,再来解决下浏览器自带的那个功能按钮的清空效果:
    //页面
    public ActionResult ForegroundSales(){
    Session.Remove(“getData”); //重新加载此页清空Session
    return View();}
    还是找到控制器这边,然后找到这个页面的试图部分,再加上给按钮写的清空方法的那句代码。
    清空Session是有专用的代码的,而不是利用那些刷新当前页的方法去实现清空的。

    展开全文
  • 1.对于jsp页面,需要在首页jsp页面添加如下: <% response.setHeader(“Pragma”,“no-cache”); response.setHeader(“Cache-Control”,“no-cache”); response.setDateHeader(“Expires”, 0); response.set...

    1.对于jsp页面,需要在首页jsp页面添加如下:

    <%
    response.setHeader(“Pragma”,“no-cache”);
    response.setHeader(“Cache-Control”,“no-cache”);
    response.setDateHeader(“Expires”, 0);
    response.setHeader(“Cache-Control”, “no-store”);
    %>
    这样,退出登录在按返回时,就会正常的被拦截器拦截!
    2.对于html页面,需要在登录页面login.html下加上

    	<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
    	<meta http-equiv="Pragma" content="no-cache" />
    	<meta http-equiv="Expires" content="0" />
    

    位置如图

    展开全文
  • 概览: 网站中点击退出,如果仅仅是重定向到登录/出页面,此时在浏览器地址栏中输入登录后的某个页面地址如主页,你...清空Session的代码: Session.Clear(); Session.Abandon(); 清除Cookie的正确代码(假...

    概览:

    网站中点击退出,如果仅仅是重定向到登录/出页面,此时在浏览器地址栏中输入登录后的某个页面地址如主页,你会发现不用登录就能访问。这种所谓的退出并不是安全的。

    那么怎样做到安全退出呢?

    那就是点击退出后清空相应的Session或Cookie。

    清空Session的代码:

    Session.Clear();
    Session.Abandon();

    清除Cookie的正确代码(假设Cookie名称为UserInfo):

    1 if (Request.Cookies["UserInfo"] != null)
    2 {
    3     Response.Cookies["UserInfo"].Expires = DateTime.Now.AddDays(-1);
    4 }

    如果需要清除所有Cookie,则遍历:

    1 for (int i = 0; i <Response.Cookies.Count; i++)
    2 {
    3      Response.Cookies[i].Expires = DateTime.Now.AddDays(-1);
    4 }

    清除Cookie的错误代码(假设Cookie名称为UserInfo):

    1 if (Request.Cookies["UserInfo"] != null)
    2 {
    3     Response.Cookies.Remove("UserInfo");
    4 }

    你会发现,这样处理后,Cookie依然存在,为什么就是删不掉呢?我们去看看.NET的HttpCookieCollection实现源码:

     1 public void Remove(string name)
     2 {
     3     if (this._response != null)
     4     {
     5         this._response.BeforeCookieCollectionChange();
     6     }
     7     this.RemoveCookie(name);
     8     if (this._response != null)
     9     {
    10         this._response.OnCookieCollectionChange();
    11     }
    12 }
    HttpCookieCollection实现源码

    这个操作在HttpCookieCollection这个集合里面删除了cookie,当服务器将数据传输到客户端的时候,不会包含这个已经在服务端删除了的Cookie的任何信息,浏览器也就不会对它做任何改变(remove方法只是不让服务器向客户机发送那个被删除的cookie,与此cookie留不留在客户机里无关)。所以cookie删除不掉的情况就出现。

    既然Response.Cookies.Remove没有办法实现我们需要的效果,为什么微软还有留着呢,因为CookieCollection实现ICollection接口,romove是必须实现的方法,尽管它没多大的实际价值。而集合的romove也应该是这样的实现方式,只不过微软在写MSDN的时候,描述得太不清楚了,给我们造成了不小的麻烦。

    下面就总结下实现安全退出的几种方式

    1).用Linkbutton,Button等服务器控件实现退出

    这种方式最好处理:直接在服务器控件对应的事件里编写清空Session或Cookie的代码即可。

    2).用<a>注销</a>等HTML标记实现退出

    对于<a></a>这个特殊标记,可以这样实现: <a href="logout.aspx">注销</a> ,在logout.aspx的Page_Load事件中编写清空Session或Cookie的代码即可。

    对于<a></a>等HTML标记,可以在HTML标记的相应client事件中用Js-Ajax,或者jQuery-Ajax,在一般处理程序(.ashx)中编写清空Session或Cookie的代码即可。

    对于<a></a>等HTML标记,还可以这样:在当前页面添加一个服务器控件如Button,用div包含,并让其隐藏(注意:隐藏不可见,不能通过服务器属性Visible=False,只能通过设置div的display:none;来实现),在Button的服务器事件Cilck里编写清空Session或Cookie的代码;然后在HTML标记的相应client事件中用Js或者jQuery调用Button控件的Click事件即可(通过服务器属性Visible=False设置Button隐藏,Js或者jQuery调用Button控件的Click事件将失效)。

    转载于:https://www.cnblogs.com/Scl891004X/p/6114034.html

    展开全文
  • html点击链接调用php文件 &lt;a onclick="window.open('php/loginOut.php','_self')"&gt;退出登录&...session_start(); session_destroy(); header('location:index.html...
  • 清空Session

    千次阅读 2012-12-28 12:11:16
    清空一个Session Session["name"]=""; 不再使用一个Session Session["name"]=null; session.abandon 销毁Session对象,释放内存  Session.Contents.Remove("mysession") 清除Session对象的内容,但...
  • # 清空cookie @blue.route('/clear/') def clearCookies():  resp = Response('清除cookie成功')  # request.cookies.clear() # cookie只读  for key in request.cookies.keys():  resp.delete_cookie(key)  ...
  • ssm登出清掉session

    2021-07-19 02:28:03
    登出时候使用invalidate()销毁session,然后跳转到登录页面,然后点击浏览器回退按钮回到主页手动刷新页面,然后看到之前保存在session中的用户名又出来了,为何?很不理解,登出时候不是已经清除了吗,我试了remove...
  • (先判断是不是 logout 再去判断是不是从首页 submit 进来的,不是就给我去登录) session_start (); // 注销登录 if ($_GET ['action'] == "logout") { $_SESSION = array (); if (isset ( $_COOKIE ...
  • jsp 清除session的方法

    千次阅读 2015-12-03 11:51:38
    就是关于如何清除当前页面的session 退出到首页,使用户再次登陆必须提供正确的用户名和密码我的三个页面是 index.jsp logon.jsp logout.jspindex.jsp中输入正确的用户名和密码会跳转到logon.jsp中在logon.jsp中我加...
  • 1、first.php(首页) <div class="menu">...个人主页</a></div> //点击退出跳转到logout.php界面 <div class="item"><a href='../logout.php' >退出</a></div> </di
  • 一、 session简介 1. 服务器可以为每个用户浏览器创建一个会话对象(session对象),一个浏览器只能产生一个session,当新建一个窗口访问服务器时,还是原来的那个sessionsession中默认保存的是当前用户的信息。...
  • 页面的一些内容根据...但是点击浏览器的后退按钮,又会回到之前的页面(但是目前Session值已经清空了),需要再刷新该页面一次,才会弹出 未登录的提示跳转。不知道如何实现即使点后退按钮,直接出现未登录提示?
  • 方法一:在web.xm中使用l<session-config>的子标签 <session.timeout>,单位为分钟,主要是针对整个应用的所有session。 方法二:   HttpSession session = request.getSession();  session....
  • 网页版支付宝沙箱开发支付成功同步回调session丢失问题与解决办法 唉,本人小白大学生,自己独自一人做了个网上商城项目 昨天刚刚用了半天时间解决支付宝异步回调session丢失问题,今天就继续为沙箱支付成功后同步回...
  • 本次在之前的文章实现登录注册的基础上又进行了新的升级,主要是采用了session和拦截器来对功能进行完善 新的Controller层 package lyb.com.controller; import java.util.ArrayList; import java.util.List; ...
  • phalcon-入门篇4(log日志和session缓存)

    千次阅读 2016-06-09 09:29:07
    phalcon-入门篇4(log日志和session缓存)本教程基于phalcon2.0.9版本前言先在这里感谢各位phalcon技术爱好者,我们提供这样一个优秀的交流平台在新年来临之际!在这里祝关注和喜欢phalcon和phalapi的童鞋们,有你们的...
  • session存储Users对象实现记住密码

    千次阅读 2021-01-13 17:32:51
    1.controller逻辑:存入session用户对象: 当rem为选中状态时, 判断账号密码为正确时, 把账号从数据库查询出来的对象存入session中。 2.jsp中逻辑:输入手机号后 从session中取值当存在这个手机号时 从session中取...
  • session的有效期和清除

    2014-09-27 15:31:00
    session的清除有4种方式: 在客户端2种: 在服务器端2中:
  • Cookie和Session的详细介绍和使用规范

    千次阅读 2018-09-06 13:43:43
    Cookie和Session的详细介绍和使用规范   Cookie的由来(浏览器端的会话技术——保存数据技术) Cookie的需求分析 场景: 现象:进入淘宝的登陆页面,显示了我上次登录的用户名 显示上次登录用户名这个...
  • django session

    2018-04-25 15:44:58
    flush()方法是比较安全的一种做法,而且一次性将session中的所有内容全部清空,确保不留后患。但也有不好的地方,那就是如果你在session中夹带了一点‘私货’,会被一并删除,这一点一定要注意。 二、完善页面 有了...
  • 登陆注销(session

    2016-09-02 18:00:55
    login.jsp--表单并验证 ;"> <!... ... charset=UTF-8"> <title>Insert title here ...这种情况会有安全方面的隐患,所以一般使用session保存,客户端是否禁用Cookie,不属于开发人员关心的问题。
  • asp.net中通过代码来重置sessionid

    千次阅读 2018-05-27 11:16:25
    可能很多人认为,在不重启浏览器的情况下sessionid是不会改变的,其实可以通过代码来重置sessionid,分享一下~~吼吼:ASP.NET 会话状态是一种允许您存储服务器端、特定于用户的数据的技术。Web 应用程序可以使用这些...
  • http 之session和cookie

    2016-08-10 13:03:05
    摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术。本文将详细讨论session的工作机制并且对在Java web application中应用...
  • Session

    2015-03-03 22:08:57
    客户端每一次访问都会在服务器端产生一个session,那么一个session会占用服务器多大内存? 首先我们先来了解一下什么是session,其实 session就是一块在服务器端开辟的内存空间。session的作用是来跟踪用户的操作...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,063
精华内容 2,825
关键字:

首页清空session