Java中的会话劫持预防(Struts 2.0)|遇到错误

Java中的会话劫持预防(Struts 2.0)|遇到错误,java,struts2,sessionid,owasp,session-hijacking,Java,Struts2,Sessionid,Owasp,Session Hijacking,我正在用Java开发一个应用程序,它似乎有一个会话劫持漏洞 为了防止出现这种情况,建议在登录后更改用户的JSESSIONID 我的应用程序基于Struts 2.0和Tomcat 7,我实现了一个代码,在用户登录后更改JSESSIONID 但是,在运行代码时,我面临以下问题 java.lang.IllegalStateException: setAttribute: Session already invalidated at org.apache.catalina.session.Standar

我正在用Java开发一个应用程序,它似乎有一个会话劫持漏洞

为了防止出现这种情况,建议在登录后更改用户的
JSESSIONID

我的应用程序基于Struts 2.0和Tomcat 7,我实现了一个代码,在用户登录后更改
JSESSIONID

但是,在运行代码时,我面临以下问题

java.lang.IllegalStateException: setAttribute: Session already invalidated
at org.apache.catalina.session.StandardSession.setAttribute(StandardSession.java:1289)
at org.apache.catalina.session.StandardSession.setAttribute(StandardSession.java:1254)
at org.apache.catalina.session.StandardSessionFacade.setAttribute          (StandardSessionFacade.java:130)
at org.apache.struts2.dispatcher.SessionMap.put(SessionMap.java:181)
以下是我编写的代码:

HttpSession httpSession = ServletActionContext.getRequest().getSession();
HashMap<String, Object> attributes = new HashMap<String, Object>(); 
Enumeration<String> enames = httpSession.getAttributeNames();
while ( enames.hasMoreElements() )
{
String name = enames.nextElement();   
if ( !name.equals( "JSESSIONID" ) )
{ 
attributes.put( name, httpSession .getAttribute( name ) );
}      
}   
httpSession.invalidate();       
httpSession = request.getSession(true);                     
for ( Map.Entry<String, Object> et : attributes.entrySet() )
{
userInfoMap.put( et.getKey(), et.getValue() );
}   
getSession().put("userid",userId);//Setting value to session
HttpSession HttpSession=ServletActionContext.getRequest().getSession(); HashMap attributes=新的HashMap(); 枚举enames=httpSession.getAttributeName(); while(enames.hasMoreElements()) { 字符串名称=enames.nextElement(); 如果(!name.equals(“JSSessionId”)) { attributes.put(名称,httpSession.getAttribute(名称)); } } httpSession.invalidate(); httpSession=request.getSession(true); for(Map.Entry et:attributes.entrySet()) { userInfoMap.put(et.getKey(),et.getValue()); } getSession().put(“userid”,userid)//设置会话的值
通常,当您
使会话无效时,您应该重定向到某个操作,因此如果该操作实现了
SessionAware
,则新的会话映射将被注入该会话


但是在您发布的代码中,您试图在会话映射包含旧会话时重用它。

问题不清楚,userId和setAttribute没有定义,应该完全报告异常,最好说明您为什么要使用JSESSIONID;你的最终目标是什么?