我正在制作一个Struts2应用程序。
我正在尝试退出,但我收到了java.lang.nullpointerexception
我的方法是:
public String logout(){
Map session = ActionContext.getContext().getSession();
SessionMap sessionMap=(SessionMap)session;
log.info("session:"+session);
log.info("sessionmap:"+sessionMap);
log.info("sessionMap.get()"+sessionMap.get("USROBJECT"));
try{
if(sessionMap!=null){
sessionMap.remove("USROBJECT");
sessionMap.invalidate();
}
}
catch(Exception e){
log.info("Exception is:"+e.toString());
}
return "LOGOUT";
}
当我尝试打印session,sessionMap和"USROBJECT"
对象时,我得到了对象,但是当我调用remove时,我得到了一个异常。请帮忙。
登录方式:
public Map session = ActionContext.getContext().getSession();
public SessionMap sessionMap;
public void setSession(Map session) {
sessionMap=(SessionMap) session;
}
public String login(){
us = new UserSession();
us= getUserDetails();
log.info("userName is:"+us.getUserName());
log.info("password is:"+us.getPassword());
us.setLastLoginTime(loginTime);
sessionMap.put("USROBJECT", us);
return "register";
}
struts.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<package name="Hello" extends="struts-default">
<action name="*LoginAction" method="{1}"
class="com.pgnext.apps.action.LoginAction">
<result name="register">/jsp/register.jsp</result>
<result name="error">/jsp/error.jsp</result>
<result name="logout">/jsp/login.jsp</result>
</action>
</package>
</struts>
17:09:31,038 INFO LoginAction:171 - going to remove USROBJECT
17:09:31,038 INFO LoginAction:183 - Exception is : java.lang.NullPointerException
答案 0 :(得分:0)
您不需要使会话无效(通常在您登陆JSP时创建会话),只需从中删除您的对象:
private final static String USER_KEY = "USROBJECT";
public String logout(){
Map<String,Object> session = ActionContext.getContext().getSession();
if (session.containsKey(USER_KEY)) {
session.remove(USER_KEY);
}
return "LOGOUT";
}
还要考虑
答案 1 :(得分:0)
我认为在会话失效后,您尝试重用会话对象的会话失效问题。我已解释过它here。
如果要在使servlet会话无效后访问struts会话,则应更新或更新struts会话。
在JSP页面上,您可以使用s:if
标记
<s:if test="#session.USROBJECT != null">
....
</s:if>
会话失效后,您应该返回redirect
或redirectAction
类型的结果。
<result type="redirect" name="logout">/jsp/login.jsp</result>
login.jsp
不应该是welcome-file
中列出的web.xml
。
在login()
行动中,您未初始化sessionMap
。
public String login(){
Map session = ActionContext.getContext().getSession();
SessionMap sessionMap=(SessionMap)session;
us = new UserSession(); //don't need it
UserSession us = getUserDetails();
if (us != null) {
log.info("userName is:"+us.getUserName());
log.info("password is:"+us.getPassword());
us.setLastLoginTime(loginTime);
sessionMap.put("USROBJECT", us);
}
return "register";
}