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,但是您隐式地拥有会话,并且容器需要跟踪该会话.
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)
这是一个令人讨厌的解决方法,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模式.
| 归档时间: |
|
| 查看次数: |
41122 次 |
| 最近记录: |