拒绝使用Naming Convention插件直接访问Struts2中的JSP文件

时间:2015-03-21 16:24:34

标签: java jsp servlets struts2

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

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

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

    我已成功设法创建我的小型webapp,写下自定义登录拦截器,一切正常并按预期工作。我可以将用户重定向到登录页面,如果他/她试图直接调用HomeAction(如果您之前已登录则会导致home.jsphttp://myserver/homeAction

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

    http://myserver/home

    当我使用此convention plugin时,struts会抓取我的home.jsp插件并显示它。这不是我期望的行为,因为home.jsp应仅显示为loginAction成功结果。

    我试图解决此问题的事情

    好吧,就我用Google搜索而言,将我的JSP放在/WEB-INF/目录中会阻止它们被访问,但事实并非如此,因为我的所有JSP都在/WEB-INF/content/中。

    我尝试的另一件事是阻止访问任何JSP资源(阻止*.JSP请求)。只要您尝试访问myserver/home.jsp,但在访问myserver/home时失败(按预期),这就可以解决问题。

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

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

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

    如果没有人提供答案,我会继续更新问题。

1 个答案:

答案 0 :(得分: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>

解释here

  

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

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