我有一个处理一个多形式后的servlet。 后实际上是由于在页面中嵌入Flash文件上传组件制造。 在某些浏览器,Flash生成的POST不包括这使它不可能对我来说,在开机时加载从会话某些信息的JSESSIONID。
闪光灯组件上传不包括特殊形式场内cookie和session信息。 使用这个表单域,其实我可以检索JSESSIONID值。 问题是,我不知道如何使用这个JSESSIONID值手动加载特定的会话。
编辑-基于ChssPly76的解决方案,我创建了以下HttpSessionListener实现:
@Override
public void sessionCreated(final HttpSessionEvent se) {
final HttpSession session = se.getSession();
final ServletContext context = session.getServletContext();
context.setAttribute(session.getId(), session);
}
@Override
public void sessionDestroyed(final HttpSessionEvent se) {
final HttpSession session = se.getSession();
final ServletContext context = session.getServletContext();
context.removeAttribute(session.getId());
}
这增加了所有会话ServletContext中通过唯一的ID映射属性。 我可以把一个地图的背景下,会议代替,但它似乎是多余的。 请张贴在这个决定有什么想法。 接下来,我下面的方法添加到我的servlet来解决由ID会话:
private HttpSession getSession(final String sessionId) {
final ServletContext context = getServletContext();
final HttpSession session = (HttpSession) context.getAttribute(sessionId);
return session;
}
有没有API通过ID来检索会话。
你能做什么,但是,是实现会话监听器在Web应用程序和手动维护地图的ID键控会话(session id的是通过检索session.getId() )。 然后,您就可以检索到您想要的(而不是欺骗容器与它替换当前的会话等建议)任何会议
以安全的方式做到这一点是设置jsession ID在cookie中 - 这是不是在网址中设置它更安全。
一旦它被设置为一个cookie,那么你可以使用恢复正常方式的会议
request.getSession();
method.setRequestHeader("Cookie", "JSESSIONID=88640D6279B80F3E34B9A529D9494E09");
还有就是Servlet规范中没有办法,但你可以尝试:
这两种方法会配合你的应用程序上的行为如Tomcat servlet容器运行; 我认为,他们中的大多数。 双方还需要您的Flash小程序要求页的饼干,其可施加一个JavaScript依赖。
这是一个非常好的职位。 我使用会话监听器以增加会话的上下文中看到一个潜在的问题是,它可以得到相当的脂肪取决于你的并发会话数。 然后所有的听众Web服务器配置的额外工作。
那么这个怎么样一个更简单的解决方案。 我没有实现这个和它的作品相当不错的。 所以加载的Flash上传对象的页面上,存储会话和会话ID在应用程序对象中的键值对那么会话ID传递到上传页面作为之后的参数。 在上传页面上,看看是否会话ID已经在应用程序中,如此使用该会话,否则,您可以通过请求之一。 此外,然后继续前进,从应用程序中删除该键把一切都干净。
在SWF网页:
application.setAttribute(session.getId(), session);
然后上传页面上:
String sessid = request.getAttribute("JSESSIONID");
HttpSession sess = application.getAttribute(sessid) == null ?
request.getSession() :
(HttpSession)application.getAttribute(sessid);
application.removeAttribute(sessid);
很不错的解决方案家伙。 感谢这个。
如果您使用的是Tomcat,你问tomcat的直接(但它的丑陋)。 我敢打赌,还有其他的web服务器等哈克解决方案。
它采用“经理人”接口的实例来管理会话。 是什么使得它丑陋的是,我还没有找到一个很好的公共接口可以挂接到,所以我们必须使用反射来获取经理。
下面是争夺上下文初创公司经理上下文侦听器,然后可以用来获得Tomcat的会话。
public class SessionManagerShim implements ServletContextListener {
static Manager manager;
@Override
public void contextInitialized(ServletContextEvent sce) {
try {
manager = getManagerFromServletContextEvent(sce);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
manager = null;
}
private static Manager getManagerFromServletContextEvent(ServletContextEvent sce) throws NoSuchFieldException, IllegalAccessException {
// Step one - get the ApplicationContextFacade (Tomcat loves facades)
ApplicationContextFacade contextFacade = (ApplicationContextFacade)sce.getSource();
// Step two - get the ApplicationContext the facade wraps
Field appContextField = ApplicationContextFacade.class.getDeclaredField("context");
appContextField.setAccessible(true);
ApplicationContext applicationContext = (ApplicationContext)
appContextField.get(contextFacade);
// Step three - get the Context (a tomcat context class) from the facade
Field contextField = ApplicationContext.class.getDeclaredField("context");
contextField.setAccessible(true);
Context context = (Context) contextField.get(applicationContext);
// Step four - get the Manager. This is the class Tomcat uses to manage sessions
return context.getManager();
}
public static Session getSession(String sessionID) throws IOException {
return manager.findSession(sessionID);
}
}
您可以将其添加为在web.xml监听器,它应该工作。
然后,你可以这样做是为了获得一个会话。