这是我的Interceptor
代码。我的目标是维护所有URL的会话,一旦注销完成,用户就无法访问任何URL。
import java.util.Map;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class AuthenticationInterceptor implements Interceptor {
/**
*
*/
private static final long serialVersionUID = 1L;
public void destroy() {
// TODO Auto-generated method stub
System.out.println("inside the destroy() of interceptor");
}
public void init() {
// TODO Auto-generated method stub
System.out.println("inside the init() of interceptor of new");
}
public String intercept(ActionInvocation ai) throws Exception {
// TODO Auto-generated method stub
System.out.println("inside the interceptor()......new");
if(ai.getAction() instanceof LogoutAction){
Map session = ai.getInvocationContext().getSession();
if (session.get("user")!=null){
System.out.println("inside logout of the session");
return ai.invoke();
}
else{
return "login";
}
}
else
return ai.invoke();
}
这是我的退出操作代码:
package com.uttara.reg;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class LogoutAction extends ActionSupport implements SessionAware {
private Map session;
public void setSession(Map s) {
session = s;
}
@Override
public String execute() throws Exception {
System.out.println("inside execute() of LA");
if(session.get("user")!=null){
session.remove("user");
return "ridirect";
}
return "failure";
}
}
这是我的另一个动作文件,一旦登录完成,用户将会注册用户我的问题是如何检查会话
import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport implements SessionAware {
private static final long serialVersionUID = 1L;
public RegisterAction() {
System.out.println("inside the Register action const.");
}
private RegBean bean;
private Map session;
public RegBean getBean() {
return bean;
}
public void setBean(RegBean bean) {
this.bean = bean;
}
@Override
public String execute() throws Exception {
System.out.println("inside execute method");
System.out.println(bean);
Model m = new Model();
String result = m.register(bean);
if(result.equals(SUCCESS))
return SUCCESS;
else{
addActionError(getText(result));
return "failure";
}
}
@Override
public void validate(){
System.out.println("inside validate method");
}
public void setSession(Map session) {
// TODO Auto-generated method stub
System.out.println("inside setSession");
this.session = session;
}
}
答案 0 :(得分:0)
如果所有应用程序页面都必须由经过身份验证的用户访问,那么在他/她的会话中没有login
属性的情况下,您必须将用户重定向到user
页面。
问题出在if
条件下。我不知道你在LogoutAction
做了什么,但是如果通过从他/她的会话中删除user
属性来使用户会话失效,那么你的if
块应该如下:
public String intercept(ActionInvocation ai) throws Exception {
// TODO Auto-generated method stub
System.out.println("inside the interceptor()......new");
Map session = ai.getInvocationContext().getSession();
if ((session.get("user") != null) ||
((session.get("user") == null) && (ai.getAction() instanceof LoginAction)) {
return ai.invoke();
} else {
return "login";
}
}
这样,如果用户没有先通过登录操作,则别无选择。 LogoutAction
操作只是应用程序中的任何其他操作,可以在用户会话中存在user
属性的情况下调用。
您的原始if
语句仅在请求的操作已注销的情况下检查了此条件。
答案 1 :(得分:0)
我认为您在配置中遇到的错误
<action name="logout" class="com.uttara.reg.LogoutAction">
<result name="success">Login.jsp</result>
<result name="failure">Error.jsp</result>
</action>