3

我一直在努力解决这个问题,因为我是 Struts2 开发的新手,最近才开始使用这个命名约定插件。

我正在尝试创建一个简单的 webapp,它最初只包含两个页面:

  1. 登录页面 ( login.jsp)
  2. 主页 ( home.jsp)

首先向用户显示一个登录页面,如果提供了正确的用户名和密码,他们就会登录并重定向到主页。

我已经成功地创建了我的小型 web 应用程序,写下了一个自定义登录拦截器,一切正常并按预期工作。HomeAction如果他/她尝试直接调用(home.jsp如果您以前登录过),我可以将用户重定向到登录页面http://myserver/homeAction

当我尝试像这样直接访问 JSP 时出现问题:

http://myserver/home

当我使用这个Convention plugin时,Struts 会获取我的home.jsp插件并显示它。这不是我所期望的行为,home.jsp应该只显示为loginAction成功的结果。

我试图解决这个问题的事情

好吧,据我谷歌搜索,将我的 JSP 放在/WEB-INF/目录中应该可以防止它们被访问,但事实并非如此,因为我所有的 JSP 都在/WEB-INF/content/.

我尝试的另一件事是阻止对任何JSP资源的访问(阻止*.JSP请求)。只要您尝试访问myserver/home.jsp,这就会奏效,但在访问时会失败(如预期的那样)myserver/home

编辑: stackoverflow 中有另一个关于这个问题的问题,但我无法理解答案: WEB-INF 下的 Struts 2 Convention Plugin and JSP files

信息更新:我发现 Struts2 约定插件使用称为“无操作结果”的东西,因此您可以通过调用没有它的扩展名来访问您的目录JSPs内部,它将作为一个虚拟操作处理它,并在成功时返回该操作。这是一个示例来说明我要解释的内容:WEB-INF/contentJSPJSP

如果我home.jsp在我的WEB-INF/content目录中调用http://myserver/home,Struts2 将“触发”一个动作,其结果将是home.jsp. 那么问题的解决方案就是禁用这个“无动作”的结果。

如果没有人提供答案,我将继续更新问题,因为我会寻求解决方案。

4

1 回答 1

1

在这里,您要如何禁用此功能。

创建一个虚拟 bean:

package com.struts.handler;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.UnknownHandler;
import com.opensymphony.xwork2.XWorkException;
import com.opensymphony.xwork2.config.entities.ActionConfig;

/**
 * Created by Roman C on 22.03.2015.
 */
public class MyUnknownHandler implements UnknownHandler {
  @Override
  public ActionConfig handleUnknownAction(String namespace, String actionName) throws XWorkException {
    return null;
  }

  @Override
  public Result handleUnknownResult(ActionContext actionContext, String actionName, ActionConfig actionConfig, String resultCode) throws XWorkException {
    return null;
  }

  @Override
  public Object handleUnknownActionMethod(Object action, String methodName) throws NoSuchMethodException {
    return null;
  }
}

然后在里面配置struts.xml

  <bean type="com.opensymphony.xwork2.UnknownHandler" name="handler" class="com.struts.handler.MyUnknownHandler"/>
  <unknown-handler-stack>
    <unknown-handler-ref name="handler"/>
  </unknown-handler-stack>

在这里解释:

上面提到的约定插件连同它创建的配置还放置了一个未知的处理程序,该处理程序应该处理不存在配置的 URL(即不是由约定创建的)。这就是问题的根源。


现在放置您自己的处理程序将禁用约定的处理程序。因此,它将不再按惯例处理结果。

于 2015-03-22T16:59:01.380 回答