1

フレームを使用する Web サイトで、会社が以前使用していた非常に古いログイン システムを使用しています。以前は、誰かが間違ったユーザー/パスの組み合わせを試みた場合、フレームは、ログイン フォームとその上にエラー メッセージを含む単純な cfinclude ファイルをロードしていました。現在、application.cfc を呼び出すポップアップ ウィンドウでフォームを使用していますが、ポップアップ ウィンドウにエラー メッセージが返される代わりに、アプリケーション コンポーネントから新しいページに cfinclude ファイルが読み込まれます。

そのため、このアプリケーションではいくつかの処理が必要です。最初に、最初のポップアップ ウィンドウを維持する必要があり、ユーザー/パスの組み合わせが間違っている場合はページが送信されないようにする必要があります。最後に、ポップアップのどこかにエラー メッセージを表示する必要があります。

以前に誰かがこのようなことをした場合は、フィードバックをいただければ幸いです。

これは私のコードの一部です:

ログインフォーム:

<!--- loginErrMsg display - to tell why login is denied --->
<cfif isdefined("loginErrMsg")><span style="color:red">#loginErrMsg#</span><br /></cfif>

<form name="LoginForm" id="LoginForm" action="<cfif test is false>https://secure.example.com</cfif>#loginFormAction#" method="post" target="_top">
</cfoutput>
<input type="hidden" name="loginPost" value="true">
    <p>
      Login below to take advantage of the great services we offer:
    </p>

    E-mail:<input name="j_username" class="loginform" type="text" size="30" maxlength="50" id="j_username"> 
    Password: <input name="j_password" type="password" size="30" maxlength="16" class="loginform">
    <br />

    <input type="submit" name="btn" value="Submit" class="bluebuttonnormal">
    </form>

Application.cfc コード:

<cflogin applicationtoken="swmadmin">
        <cfif NOT IsDefined("cflogin")>
            <cfinclude template="login.cfm">
            <cfabort>
        <cfelse>
            <cfquery name="userlookup" datasource="#ds#">
            SELECT clientadminID, roles, isFaxOnly, acctEnabled FROM clientadmin
            WHERE
            username=<cfqueryparam value="#cflogin.name#" CFSQLTYPE="CF_SQL_VARCHAR" maxlength="50">
            and password=<cfqueryparam value="#cflogin.password#" CFSQLTYPE="CF_SQL_VARCHAR" maxlength="16">
            </cfquery>
            <cfif userlookup.recordcount eq 0>
                <cfset loginErrMsg = "Invalid login.">
                <cfinclude template="login.cfm">
                <cfabort>

    </cflogin>
4

1 に答える 1

5

私の会社が以前にフレームを使用したWebサイトで使用していた非常に古いログインシステムを使用しています。

これが新しいWebサイトである場合は、使用しないでください。ログインフォームは10セント硬貨であり、あなたの睡眠中に行うことができます。新しく始めて、それを正しく行います。

したがって、このアプリケーションで発生することがいくつか必要です。まず、最初のポップアップウィンドウを表示したままにし、ユーザーとパスの組み合わせが間違っている場合はページを送信しないようにする必要があります。最後に、ポップアップのどこかにエラーメッセージを表示する必要があります。

ここでAJAXソリューションを使用する場合は、独自のソリューションを作成するか、jQueryなどの優れたライブラリを使用します。ログイン値を確認したら、jQueryまたは単純なjavascriptを使用して、空の要素のinnerHTMLを再表示または更新して、エラーメッセージを表示できます。

<cflogin ...>
...
</cflogin>

CFLoginは私を悲しませます。ColdFusionのタグのもう1つは、一般的に行われていることを単純化することを目的としており、実際にはあまり役に立たず、柔軟性が犠牲になっています。これがなくても、アプリケーションをより細かく制御できます。CFLoginの代わりに、この擬似コードのようなものを試してください

<cfcomponent>
  <cffunction name = "onRequest" ...>
    <cfargument name="targetPage" type="String" required = "true" />
    <cfif !structKeyExists(session, "roles") and !findNoCase("loginHandler.cfm",cgi.script_name)>
      <!--- notice I prevent the redirect on the form handler, otherwise the ajax will get redirected to the login.cfm page --->
      <cfinclude template = "login.cfm">
    <cfelse>
      <cfinclude template = "#arguments.targetPage#">
    </cfif>
  </cffunction> 
</cfcomponent>

login.cfmにはフォームが含まれますが、ボタンは「loginHandler.cfm」に対してjQuery.post()のようなものを起動し、ログインの結果に応じて、コールバック関数はjQuery.html()を使用してログインが成功した場合は、errorまたはwindow.location.replace/window.location.href 。もちろん、ログインが成功した場合、ColdFusionページはセッション変数を作成し、結果をAJAX呼び出しに送り返す前に、他に必要なことをすべて実行する必要があります。

于 2013-01-19T04:03:51.480 に答える