[英]Deny direct access to JSP files in Struts2 with Naming Convention plugin
我一直在努力解决这个问题,因为我是 Struts2 开发的新手,最近才开始使用这个命名约定插件。
我正在尝试创建一个简单的 webapp,它最初只包含两个页面:
login.jsp
)home.jsp
)首先向用户显示登录页面,如果提供了正确的用户名和密码,他们将登录并重定向到主页。
我已经成功地创建了我的小型 web 应用程序,写下了一个自定义登录拦截器,一切正常并按预期工作。 如果他/她尝试直接像http://myserver/homeAction
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.jsp
,但在访问myserver/home
时失败(如预期)。
编辑: stackoverflow 中有另一个关于这个问题的问题,但我无法理解答案: WEB-INF 下的 Struts 2 约定插件和 JSP 文件
信息更新:我发现,Struts2的约定插件使用一种叫做“无为而结果”这样你就可以访问你JSPs
的内部WEB-INF/content
通过调用该目录JSP
没有它的扩展,它会处理它作为一个虚拟的作用,这成功时返回该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>
在这里解释:
上面提到的约定插件及其创建的配置还放置了一个未知的处理程序,该处理程序应该处理不存在配置(即不是由约定创建的)的 URL。 这是问题的根源。
现在放置您自己的处理程序将禁用约定的处理程序。 因此,将不再处理按照约定的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.