关于如何对网站进行会话证明的任何建议?

时间:2009-03-27 14:29:17

标签: java session tomcat session-state

这可能是一个非常奇怪的问题,但一些提示或指导将非常有用。我们想要“会话证明”我们的网站,基本上确保两个不同的会话生成相同的链接结构(例如,用户-a和用户-b将在同一网页中获得相同的链接)。

此测试背后的原因是我们的网站是由内容管理解决方案生成的,该解决方案将为每个不同的会话生成不同的链接(URL)。修复了CMS(内部构建)以跨会话返回相同的链接。

另一个带会话校对的situation是我们的缓存机制(SQUID)一直在给我们的网站提供TCP_MISSes,这让我们认为整个网站都标记为动态,而缓存服务器必须一直重复所有物体。

6 个答案:

答案 0 :(得分:0)

您是否尝试验证两个不同的用户确实看到相同的结构?一种方法是使用像wget这样的东西从两个不同的IP地址抓取整个网站,然后比较生成的树。

答案 1 :(得分:0)

这就是我们在amplafi.com

所做的工作

(h / t见http://randomcoder.com/articles/jsessionid-considered-harmful) 在web.xml中:

<filter>
    <filter-name>DisableSessionIdsInUrlFilter</filter-name>
    <filter-class>
        com.amplafi.web.servlet.DisableSessionIdsInUrlFilter
    </filter-class>
</filter>


<filter-mapping>
    <filter-name>DisableSessionIdsInUrlFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

这个java代码:

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import javax.servlet.http.HttpSession;

/**
 * remove any session id from the Url.
 *
 *
 * Ideally we would like to only remove this container-provided functionality
 * only for public portions of the web site (that can be crawled by google)
 * or for links that are to be bookmarked.
 *
 * @author Patrick Moore
 */
public class DisableSessionIdsInUrlFilter implements Filter {
    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        if (!(request instanceof HttpServletRequest)) {
            chain.doFilter(request, response);
            return;
        }

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        /*
         * Next, let's invalidate any sessions that are backed by a URL-encoded
         * session id. This prevents an attacker from generating a valid link.
         * Just because we won't be generating session-encoded links doesn't
         * mean someone else won't try
         */
        if (httpRequest.isRequestedSessionIdFromURL()) {
            HttpSession session = httpRequest.getSession();
            if (session != null) {
                session.invalidate();
            }
        }
        HttpServletResponseWrapper wrappedResponse = new ResponseWrapper(httpResponse);
        chain.doFilter(request, wrappedResponse);
    }

    @Override
    @SuppressWarnings("unused")
    public void init(FilterConfig arg0) throws ServletException {
    }

    /**
     * wraps response and prevense jsessionid from being encoded on the output.
     */
    private static class ResponseWrapper extends HttpServletResponseWrapper {

        ResponseWrapper(HttpServletResponse httpResponse) {
            super(httpResponse);
        }
        @Override
        public String encodeRedirectUrl(String uri) {
            return uri;
        }

        @Override
        public String encodeRedirectURL(String uri) {
            return uri;
        }

        @Override
        public String encodeUrl(String uri) {
            return uri;
        }

        @Override
        public String encodeURL(String uri) {
            return uri;
        }
    }
}

答案 2 :(得分:0)

如果您网站中的每个网页都有不同的链接,那么该网站肯定会破解缓存。

您是否在询问如何验证每个会话的链接是否相同? 或者您是否在询问如何确保每个会话的链接相同?

对于前者,只需从两个不同的浏览器浏览,用户登录即可。

至于确保链接在每个会话中都相同...这取决于您指示的内部实施。

答案 3 :(得分:0)

您可以使用selenium在Java中编写测试。添加您期望的数据的断言。然后,您可以循环遍历多个登录列表,以查看每个登录的测试过程。

Selenium很容易上手,测试可以用多种语言编写。

详情请见此处:

http://seleniumhq.org/projects/remote-control/

示例测试将是这样的(伪代码):

public void setUp() throws Exception {
    setUp("http://mywebsite.com", "*chrome"); // to run the test in opera replace chrome with opera
}

public void testLoginWithMultipleUsers() {
    for(loop over users) {
        runLogin(user)
    }
}

public void runLogin(User user) throws Exception {
    selenium.open("/login.htm");
    assertTrue(selenium.isTextPresent("Link1"));
    assertTrue(selenium.isTextPresent("2003-2008"));
    selenium.open("/account");
    assertTrue(selenium.isTextPresent("2003-2008"));
    selenium.waitForPageToLoad("30000");
    etc...

Selenium提供了许多方法来检查是否存在链接和其他页面元素,甚至可以在浏览器中记录测试 - 试一试!

答案 4 :(得分:0)

为什么您的网址不同?你在其中存储会话ID吗?

如果你是,你应该把它移到一个cookie!

答案 5 :(得分:0)

您可以尝试使用像Pureload这样的负载测试套件来模拟多个用户访问您的网站。 Pureload可以让多个并发模拟用户各自发出相同的请求,并确认结果符合预期。根据结果​​的动态程度,这可以帮助您测试错误。