一尘不染

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

tomcat

我有一个使用welcome-page
index.jsp的应用程序,其中<iframe></iframe>iframe的内容是一个jsf页面。如果我访问index.jsp,我会在萤火虫的第一个入口处看到一个cookie:

Set-Cookie  JSESSIONID=C615DA89B6EF73F801973EA3DCD3B226; Path=/

的页面<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;
            }
}

不要忘记将其添加到您的 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>

阅读 223

收藏
2020-06-16

共1个答案

一尘不染

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

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

2020-06-16