如何避免;第一次调用页面时jsessionid = XXX?如果第一页是jsp,它可以工作

Tos*_*kan 15 cookies jsf jboss tomcat jsessionid

我有一个使用welcome-page index.jsp的应用程序,<iframe></iframe>iframe的内容是一个jsf页面.如果我访问index.jsp,我会在第一次获取firebug时看到一个cookie:

Set-Cookie  JSESSIONID=C615DA89B6EF73F801973EA3DCD3B226; Path=/
Run Code Online (Sandbox Code Playgroud)

<iframe>继承这个jsessionid 的页面.但是:当我直接访问我的页面时,<iframe/>我在第一次请求时将jsessionId重写为所有没有cookie的URL.之后使用cookie.这一切都很好 - 如果:安全系统允许我执行URL重写.

我运行jboss 4.2.2

我希望实现与index.jsp相同的行为 - 例如,总是使用cookie并始终避免http重写.

[编辑] 感谢balusc的回答我写道:

public class JsessionIdAvoiderFilter implements Filter {

            public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
                    ServletException {
                boolean allowFilterChain = redirectToAvoidJsessionId((HttpServletRequest) req, (HttpServletResponse)res);

                         //I'm doing this because if I execute the request completely, it will perform a pretty heavy lookup operation. No need to do it twice.
                if(allowFilterChain)
                    chain.doFilter(req, res);
            }


            public static boolean redirectToAvoidJsessionId(HttpServletRequest req, HttpServletResponse res) {
                HttpSession s = req.getSession();
                if(s.isNew()) {

 //after the redirect we don't want to redirect again.
if(!(req.isRequestedSessionIdFromCookie()&&req.isRequestedSessionIdFromURL()))
                    {
                                //yeah we have request parameters actually on that request.         
                        String qs = req.getQueryString();

                        String requestURI = req.getRequestURI();
                        try {
                            res.sendRedirect(requestURI+"?"+qs);
                            return false;
                        } catch (IOException e) {
                            logger.error("Error sending redirect. " + e.getMessage());
                        }
                    }
                }
                return true;
            }
}
Run Code Online (Sandbox Code Playgroud)

别忘了把它添加到你的 web.xml

    <filter> 
    <display-name>JsessionId Filter</display-name> 
    <filter-name>jsessionIdAvoiderFilter</filter-name> 
    <filter-class>my.namespace.JsessionIdAvoiderFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>jsessionIdAvoiderFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter> 
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 13

从Servlet 3.0开始,您可以使用<tracking-mode>COOKIE</tracking-mode>它.但由于JBoss 4.2.2不是Servlet 3.0的编译,因此这不是一个选择.

最简单的方法是创建一个servlet过滤器,该过滤器HttpServletRequest#getRequestURI()HttpSession#isNew()返回时发送重定向true.HttpServletRequest#isRequestedSessionIdFromCookie()当客户端根本不支持cookie时,不要忘记检查以防止无限重定向循环.

  • 谢谢。您的网站上是否有“为慈善捐款幸运猪”的信息?我可以给你订一份披萨吗? (2认同)
  • 编写一个覆盖`HttpServletRequest.encodeURL`和`HttpServletRequest.encodeRedirectURL`的过滤器来简单地返回传递给它的`String`参数会更简单:不需要重定向,最终禁止使用URL编码的会话ID (并要求cookie). (2认同)