会话或cookie混淆

会话或cookie混淆,第1张

概述我在一些网站上看到用户登录他们的帐户,然后关闭了浏览器。 关闭并重新打开后,浏览器和帐户仍然登录。 但有些网站,不能这样做。 我很困惑,认为它是会话或cookie? 如果我想要我的网站登录,我必须设置session.setMaxInactiveInterval()或cookie.setMaxAge()? 你的问题是关于会话跟踪。 [PART 1]:SESSION OBJECT HTTP请求被单独处 我在一些网站上看到用户登录他们的帐户,然后关闭了浏览器。

关闭并重新打开后,浏览器和帐户仍然登录。

但有些网站,不能这样做。

我很困惑,认为它是会话或cookie?

如果我想要我的网站登录,我必须设置session.setMaxInactiveInterval()或cookie.setMaxAge()?

解决方法 你的问题是关于会话跟踪。

[PART 1]:SESSION OBJECT

http请求被单独处理,所以为了保持每个请求之间的信息(例如,关于用户的信息),必须在服务器端创建会话对象。

一些网站根本不需要一个会话。用户不能修改任何内容的网站将不必管理会话(例如,在线简历)。您不会在这样的网站上需要任何cookie或会话。

创建会话:

在servlet中,使用httpServletRequest对象中的request.getSession(true)方法创建一个新的httpSession对象。请注意,如果您使用request.getSession(false),如果会话尚未创建,则返回null。 Look at this answer for more details。

设置/获取属性:

会话的目的是在每个请求之间保留服务器端的信息。例如,保留用户名:

session.setAttribute("name","MAGLEFF");// CastString name = (String) session.getAttribute("name");

破坏会话:

如果保持不活动的时间太长,会话将自动销毁。 Look at this answer for more details.但您可以手动强制会话被破坏,例如在注销动作的情况下:

httpSession session = request.getSession(true); session.invalIDate();

[第二部分]:那么加入黑暗的一面,我们有cookieS?

这里是饼干。

JsESSIONID:

每次使用request.getSession()创建会话时,都会在用户计算机上创建一个JsESSIONID cookie。为什么?因为在服务器端创建的每个会话都有一个ID。您无法访问其他用户的会话,除非您没有正确的ID。此ID保存在JsESSIONID cookie中,并允许用户查找他的信息。 Look at this answer for more details !

什么时候删除JsESSIONID?

JsESSIONID没有到期日期:它是一个会话cookie。作为所有会话cookie,当浏览器关闭时,它将被删除。如果您使用基本的JsESSIONID机制,则在关闭并重新打开浏览器后,会话将无法访问,因为JsESSIONID cookie已被删除。

请注意,会话无法由客户端访问,但仍在服务器端运行。设置MaxInactiveInterval允许服务器在不活动时间长时间内自动使会话无效。

JsESSIONID的恶意破坏

只是为了好玩,有一天我发现这个代码在一个项目上。用于通过使用JavaScript删除JsESSIONID cookie来使会话无效:

<SCRIPT language="JavaScript" type="text/JavaScript">    function delete_cookie( check_name ) {        // first we'll split this cookie up into name/value pairs        // note: document.cookie only returns name=value,not the other components        var a_all_cookies = document.cookie.split( ';' );        var a_temp_cookie = '';        var cookie_name = '';        var cookie_value = '';        var b_cookie_found = false; // set boolean t/f default f        // var check_name = 'JsESSIONID';        var path = null;        for ( i = 0; i < a_all_cookies.length; i++ )        {            // Now we'll split apart each name=value pair            a_temp_cookie = a_all_cookies[i].split( '=' );            // and trim left/right whitespace while we're at it            cookie_name = a_temp_cookie[0].replace(/^\s+|\s+$/g,'');            // alert (cookie_name);            // if the extracted name matches passed check_name            if ( cookie_name.indexOf(check_name) > -1 )            {                b_cookie_found = true;                // we need to handle case where cookie has no value but exists (no = sign,that is):                if ( a_temp_cookie.length > 1 )                {                    cookie_value = unescape( a_temp_cookie[1].replace(/^\s+|\s+$/g,'') );                    document.cookie = cookie_name + "=" + cookie_value +                    ";path=/" +                    ";expires=Thu,01-Jan-1970 00:00:01 GMT";                    // alert("cookie deleted " + cookie_name);                }            }            a_temp_cookie = null;            cookie_name = '';        }        return true;    }    // DESTROY    delete_cookie("JsESSIONID");</SCRIPT>

使用JavaScript,JsESSIONID可以被读取,修改,丢失或被劫持。

[第3部分]:在关闭您的浏览器后,请保留会议

After closed and re-opened the browser and their accounts are still
signed in.
But some websites,cannot do like that.
I’m confused that it’s consIDered session or cookie??

这是cookie。

我们看到当JsESSIONID会话cookie已被Web浏览器删除时,服务器端的会话对象将丢失。没有正确的ID没有办法再次访问它。

If I want my website to be signed in like that,do I have to set
session.setMaxInactiveInterval() or cookie.setMaxAge()?

我们还看到session.setMaxInactiveInterval()是为了防止无限期地运行丢失的会话。 JsESSIONID cookie cookie.setMaxAge()也不会让我们在任何地方。

使用持久性cookie与会话ID:

阅读以下主题后,我来到了这个解决方案:

> How to implement “Stay Logged In” when user login in to the web application由BalusC
> http://simple.souther.us/not-so-simple.html by Ben Souther; ben@souther.us

主要思想是在Map中注册用户的会话,放入servlet上下文中。每次创建会话时,都将其添加到Map的JsESSIONID值为key;还创建一个持久性cookie来记住JsESSIONID值,以便在JsESSIONID cookie被破坏后找到会话。

关闭Web浏览器时,JsESSIONID将被销毁。但是所有httpSession对象的地址都保存在服务器端的Map中,您可以使用保存在持久性cookie中的值访问正确的会话。

首先,在web.xml部署描述符中添加两个监听器。

<Listener>    <Listener-class>        fr.hbonjour.strutsapp.Listeners.Customservletcontextlistener    </Listener-class></Listener><Listener>    <Listener-class>        fr.hbonjour.strutsapp.Listeners.CustomhttpSessionListener    </Listener-class></Listener>

Customservletcontextlistener在上下文初始化时创建一个映射。该地图将注册用户在此应用程序中创建的所有会话。

/** * Instanciates a HashMap for holding references to session objects,and * binds it to context scope. * Also instanciates the mock database (UserDB) and binds it to  * context scope. * @author Ben Souther; ben@souther.us * @since Sun May  8 18:57:10 EDT 2005 */public class Customservletcontextlistener implements servletcontextlistener{    public voID contextinitialized(ServletContextEvent event){        ServletContext context = event.getServletContext();        //        // instanciate a map to store references to all the active        // sessions and bind it to context scope.        //        HashMap activeUsers = new HashMap();        context.setAttribute("activeUsers",activeUsers);    }    /**     * Needed for the servletcontextlistener interface.     */    public voID contextDestroyed(ServletContextEvent event){        // To overcome the problem with losing the session references        // during server restarts,put code here to serialize the        // activeUsers HashMap.  Then put code in the contextinitialized        // method that reads and reloads it if it exists...    }}

CustomhttpSessionListener在会话创建时将会将其置于activeUsers映射中。

/** * Listens for session events and adds or removes references to  * to the context scoped HashMap accordingly. * @author Ben Souther; ben@souther.us * @since Sun May  8 18:57:10 EDT 2005 */public class CustomhttpSessionListener implements httpSessionListener{    public voID init(ServletConfig config){    }    /**     * Adds sessions to the context scoped HashMap when they begin.     */    public voID sessionCreated(httpSessionEvent event){        httpSession    session = event.getSession();        ServletContext context = session.getServletContext();        HashMap<String,httpSession> activeUsers =  (HashMap<String,httpSession>) context.getAttribute("activeUsers");        activeUsers.put(session.getID(),session);        context.setAttribute("activeUsers",activeUsers);    }    /**     * Removes sessions from the context scoped HashMap when they expire     * or are invalIDated.     */    public voID sessionDestroyed(httpSessionEvent event){        httpSession    session = event.getSession();        ServletContext context = session.getServletContext();        HashMap<String,httpSession> activeUsers = (HashMap<String,httpSession>)context.getAttribute("activeUsers");        activeUsers.remove(session.getID());    }}

使用基本形式通过名称/密码测试用户身份验证。这个login.Jsp表单仅用于测试。

<!DOCTYPE HTML PUBliC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/HTML4/loose.dtd"><HTML>    <head>        <Meta http-equiv="Content-Type" content="text/HTML; charset=ISO-8859-1">        <Title><bean:message key="formulaire1Title" /></Title>    </head>    <body>        <form action="login.go" method="get">            <input type="text" name="username" />            <input type="password" name="password" />            <input type="submit" />        </form>    </body></HTML>

我们走了当用户不在会话中时,这个java servlet正在转发到登录页面,而在他的时候转到另一个页面。它只是用于测试持续会话!

public class Servlet2 extends AbstractServlet {    @OverrIDe    protected voID doGet(httpServletRequest pRequest,httpServletResponse pResponse) throws IOException,servletexception {        String username = (String) pRequest.getParameter("username");        String password = (String) pRequest.getParameter("password");        // Session Object        httpSession l_session = null;        String l_sessioncookieID = getcookieValue(pRequest,"JsESSIONID");        String l_persistentcookieID = getcookieValue(pRequest,"MY_SESSION_cookie");        // If a session cookie has been created        if (l_sessioncookieID != null)        {            // If there isn't already a persistent session cookie            if (l_persistentcookieID == null)            {                addcookie(pResponse,"MY_SESSION_cookie",l_sessioncookieID,1800);            }        }        // If a persistent session cookie has been created        if (l_persistentcookieID != null)        {            HashMap<String,httpSession> l_activeUsers = (HashMap<String,httpSession>) pRequest.getServletContext().getAttribute("activeUsers");            // Get the existing session            l_session = l_activeUsers.get(l_persistentcookieID);        }        // Otherwise a session has not been created        if (l_session == null)        {                    // Create a new session            l_session = pRequest.getSession();        }            //If the user info is in session,move forward to another page        String forward = "/pages/displayUserInfo.Jsp";        //Get the user        User user = (User) l_session.getAttribute("user");        //If there's no user        if (user == null)        {                    // Put the user in session            if (username != null && password != null)            {                l_session.setAttribute("user",new User(username,password));            }                    // Ask again for proper login            else            {                forward = "/pages/login.Jsp";            }        }        //Forward        this.getServletContext().getRequestdispatcher(forward).forward( pRequest,pResponse );    }

MY_SESSION_cookie cookie将保存JsESSIONID cookie的值。当JsESSIONID cookie被破坏时,MY_SESSION_cookie仍然存在会话ID。

JsESSIONID与Web浏览器会话不一致,但是我们选择使用持久和简单的cookie,以及放入应用程序上下文中的所有活动会话的映射。持久性cookie允许我们在地图中找到正确的会话。

不要忘记BalusC提供的这些有用的方法来添加/获取/删除cookie:

/** *  * @author BalusC */public static String getcookieValue(httpServletRequest request,String name) {    cookie[] cookies = request.getcookies();    if (cookies != null) {        for (cookie cookie : cookies) {            if (name.equals(cookie.getname())) {                return cookie.getValue();            }        }    }    return null;}/** *  * @author BalusC */public static voID addcookie(httpServletResponse response,String name,String value,int maxAge) {    cookie cookie = new cookie(name,value);    cookie.setPath("/");    cookie.setMaxAge(maxAge);    response.addcookie(cookie);}/** *  * @author BalusC */public static voID removecookie(httpServletResponse response,String name) {    addcookie(response,name,null,0);}}

最后一个解决方案是在本地主机上使用glassfish进行测试,在windows上使用Chrome浏览器。它只取决于单个cookie,而不需要数据库。但实际上,我不知道这种机制的局限性是甚么。我只是晚上来到这个解决方案,而不知道这将是一个好还是坏的。

谢谢

我还在学习,请告诉我我的答案是否有错误。谢谢, @

总结

以上是内存溢出为你收集整理的会话或cookie混淆全部内容,希望文章能够帮你解决会话或cookie混淆所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1110897.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存