سؤال

ما هي أسهل طريقة لمنع تسجيلات تسجيل الدخول المتعددة في التليف الكيسي؟

<cfcomponent>
<cfset This.name = "Name">

<cfset This.Sessionmanagement="True">
<cfset This.loginstorage="session">
<cfset This.sessionTimeout = "#CreateTimeSpan(0, 0, 50, 0)#"> 
<cfset This.applicationtimeout="#createtimespan(0,0,50,0)#">
<cfset This.scriptProtect = "All">

<cffunction name="OnRequestStart">
    <cfargument name = "request" required="true"/>

    <cfif IsDefined("Form.logout")> 

        <cflogout>

        <cfset StructClear(Session)>

        <cflocation url="/" addtoken="no">

    </cfif>

    <cflogin>
        <cfif NOT IsDefined("cflogin")>
            <cfinclude template="loginform.cfm">
            <cfabort>


        <cfelse>
            <cfif cflogin.name IS "" OR cflogin.password IS "">
                <cfoutput>
                    You must enter text in both the User Name and Password fields.
                </cfoutput>
                <cfinclude template="loginform.cfm">
                <cfabort>
            <cfelse>
                <cfquery name="loginQuery" dataSource="datadsn">
                SELECT *
                FROM userlogin
                WHERE
                UserID = <cfqueryparam value="#cflogin.name#" cfsqltype="CF_SQL_VARCHAR"> 
                AND Password = <cfqueryparam value="#hash(cflogin.password)#" cfsqltype="CF_SQL_VARCHAR">
                AND trenabled = <cfqueryparam value="1" cfsqltype="CF_SQL_VARCHAR">
<!--- Project ID--->
                AND projectid = <cfqueryparam value="23" cfsqltype="CF_SQL_VARCHAR">
                </cfquery>

                <cfset loginpass = #hash(cflogin.password)#>

                <cfset comparison = Compare(loginQuery.Password, loginpass)>

                <cfif loginQuery.trRoles NEQ "" AND comparison EQ 0>

                <cfloginuser name="#cflogin.name#" Password = "#loginpass#" roles="#loginQuery.trRoles#">

                <cfelse>
                    <cfoutput>
                        Your login information is not valid.<br>
                        Please Try again.
                    </cfoutput>    
                    <cfinclude template="loginform.cfm">
                    <cfabort>
                </cfif>
            </cfif>    
        </cfif>
    </cflogin>

    <cfif GetAuthUser() NEQ "">
        <cfoutput>
             <form method="Post">
                <input type="submit" Name="Logout" value="Logout">
            </form>
        </cfoutput>

    </cfif>

</cffunction>

<cffunction name="onSessionEnd" returnType="void">


</cffunction>

</cfcomponent>
هل كانت مفيدة؟

المحلول

عندما أعمل ، لديهم متطلبات صارمة حول الحد من عدد تسجيلات التسجيلات من قبل مستخدم واحد لتطبيق واحد. لقد تعاملت مع هذه المشكلة مثل هذه:

1) لديك جدول تسجيل الدخول للمستخدم يحمل معلومات المستخدم وحقل يسمى "التحديث الأخير" و "تسجيل الدخول". عندما يسجل المستخدم في "التحديث الأخير" مع تاريخ الوقت الحالي و "تسجيل الدخول" مع 1. هذا يمنع هذا المستخدم من تسجيل الدخول مرة أخرى.

2) قم بإنشاء مكالمة jQuery Ajax لتحديث حقل قاعدة البيانات "التحديث الأخير" مع ختم تاريخ وقت جديد. يحدث هذا في جدول زمني (مثل كل دقيقة واحدة).

3) آخر شيء كان علي فعله هو جدولة المهمة التي تم التحقق منها لمعرفة ما إذا كان التحديث الأخير للتسجيلات النشطة (في قاعدة البيانات) أكبر من فترة زمنية محددة ، إذا كان المستخدمون قد تم تسجيل الدخول "من 1 إلى 0 (السماح لهم بتسجيل الدخول مرة أخرى). السبب في أن هذا مهم هو أنه لا يمكنك افتراض أن المستخدم سوف ينقر دائمًا على "تسجيل الخروج" عند مغادرته. في بعض الأحيان يغلقون متصفحهم أو يتنقلون بعيدًا. عندما يحدث هذا إذا حاولوا العودة إلى التطبيق ، فلن يتمكنوا من تسجيل الدخول مرة أخرى (لأن قاعدة البيانات تعتقد أنها تم تسجيل الدخول إليها بالفعل).

آمل أن يجعلك هذا في الاتجاه الصحيح.

نصائح أخرى

أسهل طريقة وجدت للقيام بذلك هي ربط نطاق جلسة Java الأساسي في Coldfusion والبحث عن تسجيل دخول موجود لتلك التي لديك.

إذا كان هناك ، فقم بالخروج/تنتهي من الجلسة الأخرى واتركها الحالية.

إليك مثال من الكود الخاص بي. لاحظ أن هناك طرقًا مختلفة لقتل/إنهاء جلسة مع إيجابيات/سلبيات خاصة بها. كان هذا المثال لقاعدة الكود الموروثة.

getLogin.fld_userid هو ما هو معرف تسجيل الدخول المحاول من نموذج HTML.

لدي هذا الرمز يعمل أثناء "ON Login" قبل تهيئة متغيرات الجلسة.

<!---code for 1user per login  --->  
<cfset liveSessions = createObject("java","coldfusion.runtime.SessionTracker")>
<cfset activesessions = liveSessions.getSessionCollection(YOUR_DATA_SOURCE_NAME)>

<cfloop item="loopSession" collection="#activesessions#">
  <cfscript>
    thisSession = activesessions[loopSession];

    if(StructIsEmpty(thisSession)) {
      // do nothing
    } else {
      if(isDefined("thisSession.loginUserid")) {
        thisUser = thisSession.loginuserid;
        if(thisSession.loginuserid EQ getlogin.fldUser_ID) {
          thisSession.XXAutoToken="";
          //structClear(thisSession);
          //cflocation(theUrl:"index.cfm?home.welcome");
          thisSession.setMaxInactiveInterval(1);
          break;
        }
      }
    }
  </cfscript>
</cfloop>

مرتكز على إجابة جاس:

أود أن أفترض من إجابتهم أن التقنيات التي تم تعليقها لم تحقق ما يرغبون في ذلك الوقت (2010).

لكل غوغلينغ ، طريقة الجلسة (من جافا الأساسية) setMaxInactiveInterval لم يعد يعمل (كما يظهر باستخدام قاعدة بيانات Lucee 5 و MySQL لتخزين الجلسة)

جربت أشياء كثيرة لتطهير الجلسة ، مثل structClear, ، تعيين الجلسة على {}, ، وضع الجلسة على الخصائص العارية {cfid, cftoken...}, ، ولم يعمل أي من هذه.

الشيء الوحيد الذي نجح هو تعيين أو تغيير الخصائص الفردية للجلسة ، مثل thisSession.loggedIn.

قد يشمل استخدامات ذلك السماح للمستخدمين برؤية والتحكم في أي مكان آخر يتم تسجيل الدخول إليه.

<cfscript>
  liveSessions = createObject("java","coldfusion.runtime.SessionTracker");
  activeSessions = liveSessions.getSessionCollection(application.applicationName);

  for (s in activeSessions) {
    thisSession = activeSessions[s];

    if (!StructIsEmpty(thisSession)) {
      // Change loggedIn to whatever property identifies a login.
      if (isDefined("thisSession.loggedIn") && thisSession.loggedIn &&
        thisSession.UserID == form.UserID) {
        // Change the UserID line above to whatever match you're looking for
        if(thisSession.UserID == form.UserID) {
          // Change loggedIn to whatever property identifies a login.
          lock scope="session" timeout="5" {
            thisSession.loggedIn = 0;
          }
          break;
        }
      }
    }
  }
</cfscript>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top