jsession是在由jstl <c:url ..>标记生成的所有URL中发生的

Rom*_*man 31 jsp jstl jsessionid

我有一些奇怪的错误:当我第一次在某个浏览器中打开页面时,所有引用都有jsessionid参数(如<a href="/articles?name=art&jsessionid=5as45df4as5df"..>).

当我按F5或以任何其他方式刷新页面时,所有这些东西都消失了,一切正常,直到我关闭浏览器(并且所有选项卡也应该关闭).当我再次打开它时,我看到了这个奇怪的jsessionid参数.

我使用jstl <c:url..>标签来创建所有URL.

我已经读过一段时间了,如果禁用cookie,jsessionid是cookie的替代品,但cookie已经启用,我实际上不使用cookie.

ska*_*man 39

这不是一个错误,它是设计的.创建新会话时,服务器不确定客户端是否支持cookie,因此它会生成cookie以及URL上的jsessionid.当客户端第二次回来并呈现cookie时,服务器知道jsessionid不是必需的,并在会话的剩余时间内丢弃它.如果客户端没有cookie,则服务器需要继续使用jsessionid重写.

您可能没有明确使用cookie,但是您隐式地拥有会话,并且容器需要跟踪该会话.

  • 这将取决于您正在运行的容器 (3认同)

des*_*pot 26

正如斯卡弗曼的回答所解释的那样,它不是一个错误.这是一种预期的行为.

在你的问题中,jsessionid作为参数附加,但事实并非如此.
使用
<c:url value="/"/>
将生成如下内容:/some/;jsessionid=E85FAC04E331FFCA55549B10B7C7A4FA.
因此使用
<link href="<c:url value="/"/>stylesheets/style.css" rel="stylesheet" type="text/css"/>
会生成
/some/;jsessionid=E85FAC04E331FFCA55549B10B7C7A4FAstylesheets/style.css
,因此您的服务器无法找到可用的资源.

我找到的最好的解决方法是使用${pageContext.request.contextPath}而不是<c:url value="/"/>.因此,在前面的示例中,您
<link href="${pageContext.request.contextPath}/stylesheets/style.css" rel="stylesheet" type="text/css"/>
将生成它
/some/stylesheets/style.css.

此解决方案与容器无关(而servlet规范v3兼容容器 - 如Tomcat - 解决方案则不是).过滤响应URL感觉就像一个黑客,因为您需要更改默认行为.但一切都取决于你需要和想要实现的目标.


man*_*esh 15

在Tomcat 7或任何servlet规范v3兼容服务器上,您可以通过向应用程序的web.xml添加以下内容来禁用URL中的jsessionid

<session-config>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>
Run Code Online (Sandbox Code Playgroud)

  • 即使使用此设置,`c:url`仍然可以导致`jsessionid`被追加.tomcat7/servlet3 (5认同)

Bal*_*usC 5

这是一个令人讨厌的解决方法,Filter因为当客户端支持cookie时,你永远不会在URL中看到jsessionid.

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;
    HttpSession session = req.getSession();

    if (session.isNew()) {
        // New session? OK, redirect to encoded URL with jsessionid in it (and implicitly also set cookie).
        res.sendRedirect(res.encodeRedirectURL(req.getRequestURI()));
        return;
    } else if (session.getAttribute("verified") == null) {
        // Session has not been verified yet? OK, mark it verified so that we don't need to repeat this.
        session.setAttribute("verified", true);
        if (req.isRequestedSessionIdFromCookie()) {
            // Supports cookies? OK, redirect to unencoded URL to get rid of jsessionid in URL.
            res.sendRedirect(req.getRequestURI().split(";")[0]);
            return;
        }
    }

    chain.doFilter(request, response);
}
Run Code Online (Sandbox Code Playgroud)

映射它/*或任何需要会话管理的URL模式.