使用命名约定插件拒绝直接访问 Struts2 中的 JSP 文件
Deny direct access to JSP files in Struts2 with Naming Convention plugin
我一直在努力解决这个问题,因为我是 Struts2 开发的新手,最近才开始使用这个命名约定插件。
我正在尝试创建一个简单的网络应用程序,它最初只包含两个页面:
- 登录页面(
login.jsp
)
- 首页(
home.jsp
)
首先向用户显示一个登录页面,如果提供了正确的用户名和密码,他们将登录并重定向到主页。
我已经成功地创建了我的小型网络应用程序,写下了一个自定义登录拦截器,一切正常并按预期工作。如果 he/she 尝试像 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
.
时会失败(如预期的那样)
编辑: Whosebug 中还有一个关于此问题的问题,但我无法理解答案:
Struts 2 Convention Plugin and JSP files under WEB-INF
信息更新: 我发现 Struts2 约定插件使用了一种称为“无操作结果”的东西,因此您可以在 JSPs
中访问 WEB-INF/content
目录通过调用 JSP
而没有它的扩展名,它将把它作为一个虚拟操作来处理, returns 即 JSP
成功。这是一个例子来说明我要解释的内容:
如果我的 WEB-INF/content
目录中有 home.jsp
并调用 http://myserver/home
,Struts2 将“触发”一个结果为 home.jsp
.问题的解决方案就是禁用此“无动作”结果。
如果没有人提供答案,我会在寻找解决方案时不断更新问题。
在这里你想如何禁用这个功能。
创建一个虚拟 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:
The convention plugin along with configuration it creates mentioned above also put an unknown handler which should handle URLs for which a configuration is not exist (i.e. not created by the convention). This is the source of the problem.
现在放置您自己的处理程序将禁用约定的处理程序。因此,它将 no 按照惯例不再处理结果。
我一直在努力解决这个问题,因为我是 Struts2 开发的新手,最近才开始使用这个命名约定插件。
我正在尝试创建一个简单的网络应用程序,它最初只包含两个页面:
- 登录页面(
login.jsp
) - 首页(
home.jsp
)
首先向用户显示一个登录页面,如果提供了正确的用户名和密码,他们将登录并重定向到主页。
我已经成功地创建了我的小型网络应用程序,写下了一个自定义登录拦截器,一切正常并按预期工作。如果 he/she 尝试像 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
.
编辑: Whosebug 中还有一个关于此问题的问题,但我无法理解答案: Struts 2 Convention Plugin and JSP files under WEB-INF
信息更新: 我发现 Struts2 约定插件使用了一种称为“无操作结果”的东西,因此您可以在 JSPs
中访问 WEB-INF/content
目录通过调用 JSP
而没有它的扩展名,它将把它作为一个虚拟操作来处理, returns 即 JSP
成功。这是一个例子来说明我要解释的内容:
如果我的 WEB-INF/content
目录中有 home.jsp
并调用 http://myserver/home
,Struts2 将“触发”一个结果为 home.jsp
.问题的解决方案就是禁用此“无动作”结果。
如果没有人提供答案,我会在寻找解决方案时不断更新问题。
在这里你想如何禁用这个功能。
创建一个虚拟 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:
The convention plugin along with configuration it creates mentioned above also put an unknown handler which should handle URLs for which a configuration is not exist (i.e. not created by the convention). This is the source of the problem.
现在放置您自己的处理程序将禁用约定的处理程序。因此,它将 no 按照惯例不再处理结果。