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时,不要忘记检查以防止无限重定向循环.
| 归档时间: |
|
| 查看次数: |
18984 次 |
| 最近记录: |