1

我的应用程序正在使用 struts 1,并且页面使用 struts-config.xml 中操作路径的属性“roles”受角色保护(即:如果用户的角色不允许他访问页面,则用户无法访问页面):

<action path="/ProtectedPageAction" type="org.apache.struts.actions.ForwardAction"
    parameter="ProtectedPage" roles="admin" />

这样,如果用户没有登录或没有“管理员”角色,他会看到主页而不是受保护的页面。

现在,所有这些都完美运行,唯一的问题是浏览器中的 URL(因此 servlet_path 的值)不是“homepage.do”而是“ProtectedPageAction.do”,或者换句话说,servlet_path 不是“in同步”与显示的页面。

我需要使用 servlet_path 的值,因此当用户无权查看页面时,浏览器中显示的 url 必须是“homepage.do”而不是“ProtectedPageAction.do”;这也是出于安全原因:如果用户注意到 URL 中的“ProtectedPageAction.do”可能会开始想知道它的用途以及如何访问它等。

4

1 回答 1

1

重定向通常通过设置动作转发属性redirect="true" 来完成。在您的情况下,您需要创建操作

public class RedirectAction extends ForwardAction {
  @Override
  public ActionForward execute(
    ActionMapping mapping,
    ActionForm form,
    HttpServletRequest request,
    HttpServletResponse response)
    throws Exception {

    // Create a RequestDispatcher the corresponding resource
    String path = mapping.getParameter();

    if (path == null) {
        throw new ServletException(messages.getMessage("forward.path"));
    }

    // Let the controller handle the request
    ActionForward retVal = new ActionForward(path, true);
    retVal.setContextRelative(true);

    return retVal;
  }
}

或者自然使用配置

<action path="/ProtectedPageAction" type="org.yourname.struts.actions.ProtectedPageAction"
    parameter="ProtectedPage" roles="admin">
  <forward name="success" path="/Homepage.do" redirect="true"/>
</action>

public class ProtectedPageAction extends Action {
  @Override
  public ActionForward execute(
    ActionMapping mapping,
    ActionForm form,
    HttpServletRequest request,
    HttpServletResponse response)
    throws Exception {

    // Let the controller handle the request
    ActionForward retVal = mapping.findForward("success");
    retVal.setContextRelative(true);

    return retVal;
  }
}
于 2013-02-07T15:59:23.557 回答