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

标签 jsf tomcat cookies jboss jsessionid

我有一个应用程序,它使用带有 <iframe></iframe> 的欢迎页面 index.jsp iframe 的内容是一个jsf 页面。如果我访问 index.jsp,我会在第一次进入 firebug 时看到一个 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> 

最佳答案

从 Servlet 3.0 开始,您可以使用 <tracking-mode>COOKIE</tracking-mode>为了这。但是由于 JBoss 4.2.2 不是 Servlet 3.0 兼容的,所以这不是一个选项。

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

关于jsf - 如何在第一次调用页面时避免 ;jsessionid=XXX?如果第一页是 jsp,它就可以工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11349064/

相关文章:

ajax - JSF 语言切换器和 ajax 更新

jsf - 如何呈现从选择 p :panel, 触发的 p :selectonemenu?

java - Web 应用程序项目中的内部服务器错误

tomcat - jetty 部署 war 文件

tomcat - 网站维护着陆页

jsf - 如何将字符串值从 <h :inputHidden> to a bean property?

jsf - 如何将常用内容包含到多级模板页面中

session - 创建登录流程的最佳实践?

ruby-on-rails - 检测 Rails 4 session cookie 篡改

python - Django:使用基于 Cookie 的 session 存储时 session 缓存未更新