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

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

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

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

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

我已成功设法创建我的小型webapp,写下自定义登录拦截器,一切正常并按预期工作。 我可以将用户重定向到登录页面,如果他/她试图直接调用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中有关于此问题的另一个问题,但我无法理解答案: Struts 2 Convention Plugin和WEB-INF下的JSP文件

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

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

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

在这里你想如何禁用此function。 创建一个虚拟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配置它:

      

这里解释一下 :

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

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