这是我的
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;
}
}
如果您的所有应用程序页面都必须由经过身份验证的用户访问,那么您必须在用户会话中没有
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
语句仅在请求的操作是注销的情况下检查此条件。
我认为你的配置有错误
<action name="logout" class="com.uttara.reg.LogoutAction">
<result name="success">Login.jsp</result>
<result name="failure">Error.jsp</result>
</action>