注销并终止会话

Posted

技术标签:

【中文标题】注销并终止会话【英文标题】:Log out and kill the session 【发布时间】:2014-08-24 02:18:38 【问题描述】:

我有一个运行良好的登录页面。现在我想退出。

以下是我的 header.cfm 文件中的链接。如果会话变量是true,它会显示“注销”。如果没有,它会显示“登录”。所以我只想注销。

<a id="login-link" href="login.cfm">
     <cfif session.userLoggedIn>logout <cfelse>LogIn</cfif>
</a>

Application.cfc

public boolean function onRequestStart(string targetPage)


    if(findNocase("login.cfm", arguments.targetPage))
    
        return true;
    
    else if(session.userLoggedIn)
        return true;
    else
    
        include "login.cfm";
        return false;
    


public void function onSessionStart(struct sessionObj)


    session.userLoggedIn = false;

logIn.cfm

<cfif isDefined("form.btn_login") >
    <cfset userResultResponse =  communtiyServic.getUsers(form.user,form.pwd)>
    <cfset userQry = userResultResponse.getQryData() >

        <cfif userQRY.recordCount gt 0 >
            <cfset session.userLoggedIn = true />
            <cflocation url="index.cfm" >
        <cfelse>
            <cfoutput>invaled userName or password </cfoutput>
    </cfif>



</cfif>

【问题讨论】:

难道您不只需要一个将 session.userLoggedIn 设置为 false 的注销页面即可将用户注销吗? 【参考方案1】:

如果您将CFIDCFTOKEN 用于会话标识cookie(您可能不应该这样做,但这是默认设置),那么您应该可以在logout() 中调用SessionInvalidate()方法。这将使服务器和客户端之间的会话连接无效。我不确定它是否使服务器上的会话数据过期,但如果没有,它会在超时期限后自行超时。与此同时,它在客户端将无法访问,而无论出于何种目的和目的,它都可以满足您的需求。

【讨论】:

Sessioninvalidate...这是多人功能。非常好。 啊!我得到了自动完成忍者。我的意思是多用途! @FrankTudor,你为什么不简单地编辑你的评论? @DanBracuk:他可能认为我已经读过它,所以事后编辑它不会有任何帮助,但新评论会引发新通知。 @DanBracuk 在我起床洗澡开始新的一天之前,我在我的安卓手机上回复了答案。我在开车上班时注意到了这一点……在我的代表级别上,我没有能力评论编辑能力(大约一分钟后)……(向天空举起拳头……'诅咒你的 android 众神和你的自动更正诡计!')。 :D【参考方案2】:

编辑 500 次编辑稍后修复措辞这里是示例代码的答案...我做了一些更改以简化流程并使用 url 查询字符串从任何页面注销。还有其他方法,但这可以与 OPs 示例一起使用。

在您的 onRequestStart() 中添加一些代码以查找注销/重定向以使用 location() 到登录页面。

OP 使用其现有代码实现注销/重定向的一种简单方法是在 onRequestStart() 中添加类似这样的内容:

param name="url.logout" default=0; 
if (isDefined('url.logout') and url.logout) 
    if (isDefined('session'))
        /* 
        You can use structDelete(session,'whatever') 
        if you know the session.whatever you are clipping
        and you will have to loop and kill all SO 
        try the structClear() function below.

        */
        structClear(session); 
        /*
        The OP can redirect to login.cfm
        which will auto take them to the login.cfm page
        provided you tack on the ?logout=1 to the URL like this
        http://yoursite.com/somepage.cfm?logout=1
        */
        location(url="login.cfm"); 
    

【讨论】:

你能举一个比较有趣的例子吗? @JamesAMohler 我更新了我的答案并有一个例子

以上是关于注销并终止会话的主要内容,如果未能解决你的问题,请参考以下文章

SAML 2.0 单次注销问题 - IdP 应如何终止在不同用户代理中运行的 SP 会话?

注销后,会话未结束

注销思杰会话

如何终止会话或会话 ID (ASP.NET/C#)

在期望中终止生成会话

终止会话