Как удалить переменную URL - PullRequest
3 голосов
/ 15 января 2011

У меня есть url.LoginID, и я хотел бы удалить его из адресной строки, когда пользователь нажимает на ссылку для входа в систему. Это должна быть закладка, это не может быть отправка формы.

В: Как мне удалить? LoginID из Index.cfm? LoginID = XYZ & AssignmentID = 123

Это, вероятно, что-то вроде:

<cflocation url="#cgi.SCRIPT_NAME#?#cgi.QUERY_STRING#" addtoken="no">

Ответы [ 5 ]

19 голосов
/ 15 января 2011

Похоже, что вы на правильном пути.

Если loginID является единственной вещью в строке запроса, вы можете просто перейти на целевую страницу без строки запроса.другие данные в строке запроса, то вы можете сделать что-то вроде этого:

<cfset q = reReplaceNoCase(cgi.query_string, "LOGINID=[^&]+&?", "")>
<cflocation url="#cgi.SCRIPT_NAME#?#q#">

Это по существу удаляет loginid и все, вплоть до en строки или следующей переменной URL.

4 голосов
/ 16 января 2011

Как обычно, уже есть UDF, который кто-то написал доступным на CFLIB: queryStringDeleteVar

Затем вы можете сделать это такна самом деле значение по умолчанию для второго аргумента, так что это будет работать так же хорошо

<cflocation 
    url="#cgi.SCRIPT_NAME#?#queryStringDeleteVar("LoginID")#" 
    addtoken="no"
>

Вот код для queryStringDeleteVar:

<cfscript>
/**
 * Deletes a var from a query string.
 * Idea for multiple args from Michael Stephenson (michael.stephenson@adtran.com)
 * 
 * @param variable      A variable, or a list of variables, to delete from the query string. 
 * @param qs      Query string to modify. Defaults to CGI.QUERY_STRING. 
 * @return Returns a string. 
 * @author Nathan Dintenfass (michael.stephenson@adtran.comnathan@changemedia.com) 
 * @version 1.1, February 24, 2002 
 */
function queryStringDeleteVar(variable){
    //var to hold the final string
    var string = "";
    //vars for use in the loop, so we don't have to evaluate lists and arrays more than once
    var ii = 1;
    var thisVar = "";
    var thisIndex = "";
    var array = "";
    //if there is a second argument, use that as the query string, otherwise default to cgi.query_string
    var qs = cgi.query_string;
    if(arrayLen(arguments) GT 1)
        qs = arguments[2];
    //put the query string into an array for easier looping
    array = listToArray(qs,"&");        
    //now, loop over the array and rebuild the string
    for(ii = 1; ii lte arrayLen(array); ii = ii + 1){
        thisIndex = array[ii];
        thisVar = listFirst(thisIndex,"=");
        //if this is the var, edit it to the value, otherwise, just append
        if(not listFind(variable,thisVar))
            string = listAppend(string,thisIndex,"&");
    }
    //return the string
    return string;
}
</cfscript>
3 голосов
/ 15 января 2011

Есть несколько способов сделать это, вот один из способов, используя цикл списка, чтобы прочитать существующие параметры и проверить тот, который вы хотите игнорировать:

<cfset newParams = "" />

<cfloop list="#cgi.query_string#" delimiters="&" index="i">
    <cfif listFirst(i, "=") neq "loginID">
        <cfset newParams = listAppend(newParams, i, "&") />
    </cfif>
</cfloop>


<cflocation url="#cgi.script_name#?#newParams#" addtoken="no">

Надеюсь, это поможет!

2 голосов
/ 15 января 2011

Предположим, что вы на самом деле не хотите удалять ?, чтобы сохранить действительность URL, поэтому должно работать простое регулярное выражение:

QUERY_STRING = ReReplaceNoCase(cgi.QUERY_STRING, "LoginID=.+\&", "");

Кстати, я не уверен, почему вы сохраняете LoginID в URL вообще, это может быть небезопасный подход.Использование сессий звучит как лучшая идея.

Редактировать: регулярное выражение Бена лучше, потому что моя версия настолько проста, что "съест" все пары key=value до последней.

1 голос
/ 15 января 2011

Вставьте знаменитое Zawinski две задачи регулярное выражение и решите по-разному:

<cfset copy = duplicate(url)>
<cfset structDelete(copy, "loginid")>
<cfset entries = []>
<cfloop collection="#copy#" item="key">
    <cfset arrayAppend(entries, "#key#=#copy[key]#")>
</cfloop>
<cfoutput>#arrayToList(entries, "&")#</cfoutput>
...