Java 尝试注销时sessionMap.invalidate()不起作用
我正在申请Struts2 我正在尝试注销,但我得到Java 尝试注销时sessionMap.invalidate()不起作用,java,authentication,struts2,httprequest,httpsession,Java,Authentication,Struts2,Httprequest,Httpsession,我正在申请Struts2 我正在尝试注销,但我得到java.lang.NullPointerException 我的方法是: 公共字符串注销(){ 映射会话=ActionContext.getContext().getSession(); SessionMap SessionMap=(SessionMap)会话; log.info(“会话:+会话”); log.info(“sessionmap:+sessionmap”); log.info(“sessionMap.get()”+sessionM
java.lang.NullPointerException
我的方法是:
公共字符串注销(){
映射会话=ActionContext.getContext().getSession();
SessionMap SessionMap=(SessionMap)会话;
log.info(“会话:+会话”);
log.info(“sessionmap:+sessionmap”);
log.info(“sessionMap.get()”+sessionMap.get(“USROBJECT”);
试一试{
if(sessionMap!=null){
sessionMap.remove(“USROBJECT”);
sessionMap.invalidate();
}
}
捕获(例外e){
log.info(“异常为:+e.toString());
}
返回“注销”;
}
当我试图打印session、sessionMap
和“USROBJECT”
对象时,我得到了该对象,但当我调用remove()
时,我得到了一个异常
登录方式:
publicmap session=ActionContext.getContext().getSession();
公共SessionMap SessionMap;
公共无效设置会话(映射会话){
sessionMap=(sessionMap)会话;
}
公共字符串登录(){
us=新用户会话();
us=getUserDetails();
log.info(“用户名是:+us.getUserName());
log.info(“密码为:+us.getPassword());
美国setLastLoginTime(loginTime);
sessionMap.put(“USROBJECT”,美国);
返回“登记簿”;
}
struts.xml
:
/jsp/register.jsp
/jsp/error.jsp
/jsp/login.jsp
17:09:31038信息登录操作:171-将删除USROBJECT
17:09:31038信息登录:183-异常为:java.lang.NullPointerException
您不需要使会话无效(会话通常是在登录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";
}
private final静态字符串USER\u KEY=“USROBJECT”;
公共字符串注销(){
映射会话=ActionContext.getContext().getSession();
if(session.containsKey(USER_KEY)){
会话。删除(用户密钥);
}
返回“注销”;
}
也考虑
- ,这是首选方式李>
- 使用自定义拦截器,应用于除登录操作之外的所有操作
- 您不需要使会话无效(会话通常是在您登录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";
}
private final静态字符串USER\u KEY=“USROBJECT”;
公共字符串注销(){
映射会话=ActionContext.getContext().getSession();
if(session.containsKey(USER_KEY)){
会话。删除(用户密钥);
}
返回“注销”;
}
也考虑
- ,这是首选方式李>
- 使用自定义拦截器,应用于除登录操作之外的所有操作
s:if
标记检查对象
....
会话无效后,您应返回类型为
重定向
或重定向操作
的结果
/jsp/login.jsp
login.jsp
不应是web.xml
中列出的欢迎文件
在login()
操作中,您没有初始化sessionMap
public String login(){
Map session = ActionContext.getContext().getSession();
SessionMap sessionMap=(SessionMap)session;
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";
}
我认为会话失效的问题在于,在会话失效后,您试图重用会话对象。我已经解释过了
如果要在servlet会话无效后访问struts会话,则应更新或续订struts会话
在JSP页面上,您可以使用s:if
标记检查对象
....
会话无效后,您应返回类型为重定向
或重定向操作
的结果
/jsp/login.jsp
login.jsp
不应是web.xml
中列出的欢迎文件
在login()
操作中,您没有初始化sessionMap
public String login(){
Map session = ActionContext.getContext().getSession();
SessionMap sessionMap=(SessionMap)session;
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";
}
我已经在sessionMap中添加了“USROBJECT”,但是当我试图删除它时,我得到了空指针exceptionRetry和上面的代码。不要使用SessionMap,使用常量来确保您没有在键名中生成拼写错误。另外,请尝试按照答案链接中描述的方式检索会话。请记住,你现在也可以投票了,因为你有15个声望点。我在sessionMap中添加了“USROBJECT”,但当我试图删除它时,我得到了空指针异常,使用上面的代码重试。不要使用SessionMap,使用常量来确保您没有在键名中生成拼写错误。另外,请尝试按照答案链接中描述的方式检索会话。注:记住你现在也可以投票了,因为你有15个声望点。嗨,即使在添加了你的代码之后,我也得到了同样的例外。我无法理解何时可以打印用户对象,那么当我试图删除它时为什么会出现空指针异常异常异常需要异常堆栈跟踪来诊断代码。另外,如果您将struts.xml
添加到问题中也会很好。我正在添加我的登录方法、注销方法、struts.xml和jsp..请参阅。尝试重定向结果。我已将sessionMap初始化为public Map session=ActionContext.getContext().getSession(); 公共SessionMap SessionMap;