对struts2中的每个操作进行身份验证

时间:2012-04-05 06:58:10

标签: authentication struts2

您好我开发了小型网络应用程序,因为所有功能都运行正常但当我按下浏览器后退按钮它显示上一页时如果你执行或点击任何操作按钮它将调用并执行该操作如何防止用户下面是我的动作类和struts配置文件

 public class LoginAction extends ActionSupport implements ModelDriven, SessionAware,    ServletRequestAware {

private static final long serialVersionUID = -3197657749784237381L;
@SuppressWarnings("unchecked")
private Map session;
private HttpServletRequest request;
private LoginBean logBean = new LoginBean();

public LoginAction() {
}

public Object getModel() {
    return logBean;
}

public LoginBean getLogBean() {
    return logBean;
}

public void setLogBean(LoginBean logBean) {
    this.logBean = logBean;
}

public Map getSession() {
    return session;
}

public void setSession(Map session) {
    this.session = session;
}

/*  public static Log getLOG() {
    return LOG;
}

public static void setLOG(Log LOG) {
    ActionSupport.LOG = LOG;
}
*/

public void setServletRequest(HttpServletRequest request) {
    this.request = request;
}


public String execute() {
    return SUCCESS;
}

public String verifyLogin() {
    String target = "";
    LoginDB logDB = new LoginDB();
    UserBean ub = new UserBean();
    String ipAddress = request.getRemoteAddr();
    ub = logDB.verifyLogin(logBean.getLoginID(), logBean.getPassword());
    if (ub.getInvalid().equals("1")) {
        if (ub.getActive() != 0) {
            session = ActionContext.getContext().getSession();
            session.put("userBean", ub);
            target = SUCCESS;
        }
        else {
            addActionError("Your status is inactive!!!Please Contact Admin Or Activate Link");
            target = INPUT;
        }
    } 
    else {
        addActionError("Invalid LoginID or Password!");
        target = INPUT;
    }

    return target;
}

@SuppressWarnings("unchecked")
@SkipValidation
public String logOut() {
    //LoginDB loginDB = new LoginDB();
    String status = "";
   // String id = request.getParameter("userID");
    String ipAddress = request.getRemoteAddr();
    //int a = loginDB.logOut(id, ipAddress);
    if (true) {
        session.clear();
        session = null;
        if (session instanceof org.apache.struts2.dispatcher.SessionMap) {
            try {
                ((org.apache.struts2.dispatcher.SessionMap) session).invalidate();
            } catch (IllegalStateException e) {
            }
        }
        status = "success";
    } else {
        addActionError(getText("system.ERROR"));
        status = "error";
    }

    return status;
}

}

我的注册类

     public String execute() throws SQLException, ClassNotFoundException {
     Register rt = new Register();
     String status = rt.trailUser(user);
     if (status.equalsIgnoreCase("1")) 
    {
        if(Mail()==1)
        {
            addActionMessage("Congratulation you have success fully singed In check your  mail  to Activate Your Acount!");
            return SUCCESS;
        } 
        else
        {
            addActionError("Sign In Again!");
            return INPUT;
        }

    } 
    else {
        return ERROR;
    }
}

struts.xml中

// <struts>
<!-- Configuration for the default package. -->
<constant name="struts.Devmode" value="false"></constant>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.custom.i18n.resources" value="ApplicationResources" />
<package name="default" extends="struts-default">
        <action name="users">
        <result>home.jsp </result>
    </action>
    <action name="UserAction" class="com.java.action.RegisterAction">
        <result name="input">/signup.jsp</result>
        <result name="success">/home.jsp</result>
        <result name="error">/error.jsp</result>
    </action>
    <action name="trialregister">
        <result>signup.jsp</result>
    </action>
    <action name="Activate" class="com.java.action.ActivationAction">
        <result name="input">/error.jsp</result>
        <result name="success">/home.jsp</result>
        <result name="error">/test1.jsp</result>
    </action>
    <action name="verifyLogin" class="com.java.action.LoginAction" method="verifyLogin">
        <result name="input">/home.jsp</result>
        <result name="success">/test1.jsp</result>
    </action>

    <action name="logOut" class="com.java.action.LoginAction" method="logOut">
        <interceptor-ref name="clear-cache"></interceptor-ref>
        <result name="error">/error.jsp</result>
        <result name="success">/home.jsp</result>
    </action>

    <action name="Back">
    <result>/home.jsp</result>    
    </action>
</package>
</struts>

注意 我可以看到我退出后我正在清除会话变量,但如果用户点击它显示注册页面,如果他点击注册按钮它将执行注册操作所以任何人都可以告诉我如何防止注销后执行操作甚至如果他点击任何动作事件按钮,它应该将其重定向到登录页面。

1 个答案:

答案 0 :(得分:2)

你想做的事情似乎对我而言。关于浏览器后退按钮,这不是与S2相关的东西,因为浏览器正在通过浏览器缓存向后移动按钮。

虽然您可以请求浏览器清除缓存并设置一些标题,如

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.

上面的代码可以移动到Interceptor,可以使用您的注销操作进行配置,以便可以请求浏览器关注您的标题。 上面的代码将在服务器上重新发送真实的HTTP请求,而不是从浏览器的缓存中加载页面,您希望通过在响应中添加上述标题来指示浏览器不缓存页面:

关于在按下后退按钮时执行的Action类代码,我建议您创建一个拦截器并配置该拦截器,以便只有登录用户才能执行这些操作,并且应该要求非登录用户首先登录。 / p>

样本拦截器

public class LoginInterceptor implements Interceptor {

public LoginInterceptor() {
}

public void destroy() {

}

public void init() {

}

public String intercept(ActionInvocation actionInvocation) throws Exception {

    final ActionContext context = actionInvocation.getInvocationContext();
    HttpServletRequest request = (HttpServletRequest) context.get(ServletActionContext.HTTP_REQUEST);
    HttpSession session = request.getSession(true);

    //Code

    try {

        Users user= (Users) session.getAttribute("user");

        if (user== null) {

            return "login";
        }

    } catch (Exception e) {
        Logger.getLogger(LoginInterceptor.class.getName()).log(Level.INFO, "message", e);
    }

    //Invoke action
    String result = actionInvocation.invoke();

    return result;
}
}

此拦截器将检查用户是否在会话中,如果用户不在那里,他将被重定向到登录页面,而其他情况请求将转到层次结构中的下一个拦截器。

现在在struts.xml文件中配置这个拦截器

struts.xml中

<interceptors>  
       <interceptor class="myclass.LoginInterceptor" name="loginInterceptor">  
                      </interceptor>  
       <interceptor-stack name="loginStack">  
        <interceptor-ref name="loginInterceptor">  
        <interceptor-ref name="defaultStack">  
       </interceptor-ref>  
      </interceptor-ref>  
 </interceptors>
 <default-interceptor-ref name="loginStack">  

一旦配置它,您就可以使用拦截器来访问您希望该用户应该登录的所有动作调用。

有关如何执行此操作的更多详细信息,请参阅本教程。

这种拦截器技术仅用于学习目的,如果你想在现实生活中实现这样的用例,我建议使用一些安全框架,如Spring-Security,它提供了强大而灵活的方法来处理这些用例