使用命名约定插件拒绝直接访问Struts2中的JSP文件



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

我正在尝试创建一个简单的网络应用程序,它最初只包含两个页面:

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

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

我已经成功地创建了我的小型网络应用程序,写下了一个自定义登录拦截器,一切都很好,工作正常。如果用户尝试像http://myserver/homeAction一样直接调用HomeAction(如果您以前登录过,则会导致home.jsp),我可以将用户重定向到登录页面。

当我尝试像这样直接访问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中还有一个关于这个问题的问题,但我无法理解答案:Struts2约定插件和WEB-INF 下的JSP文件

信息更新:我发现Struts2约定插件使用了一种名为";无行动结果";因此,您可以通过调用JSP来访问WEB-INF/content目录中的JSPs,而不需要它的扩展,并且它将把它作为一个伪操作来处理,该操作在成功时返回JSP。这是一个例子来说明我试图解释的内容:

如果我的WEB-INF/content目录中有home.jsp并调用http://myserver/home;触发器";其结果将是CCD_ 24的动作。那么问题的解决方案将是禁用这个";"无行动";后果

如果没有人提供答案,我会在寻找解决方案的过程中不断更新这个问题。

以下是您想要禁用此功能的方式。

创建一个虚拟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(即,不由约定创建)。这就是问题的根源。


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

最新更新