我的应用程序使用 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 与显示的页面。
我需要使用 servlet_path 的值,因此当用户无权查看页面时,浏览器中显示的 URL 必须是
homepage.do
而不是 ProtectedPageAction.do
;这也是出于安全原因:如果用户注意到 URL 中的 ProtectedPageAction.do
可能会开始想知道它的用途以及如何访问它等。
重定向通常通过设置操作转发属性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;
}
}