Java 使用命名约定插件拒绝直接访问Struts2中的JSP文件
由于我是Struts2开发的新手,最近才开始使用这个命名约定插件,所以我一直在努力解决这个问题 我正在尝试创建一个简单的webapp,它最初只包含两个页面:Java 使用命名约定插件拒绝直接访问Struts2中的JSP文件,java,jsp,servlets,struts2,struts2-convention-plugin,Java,Jsp,Servlets,Struts2,Struts2 Convention Plugin,由于我是Struts2开发的新手,最近才开始使用这个命名约定插件,所以我一直在努力解决这个问题 我正在尝试创建一个简单的webapp,它最初只包含两个页面: 登录页面(Login.jsp) 主页(Home.jsp) 首先,向用户显示一个登录页面,如果提供了正确的用户名和密码,用户将登录并重定向到主页 我已经成功地创建了我的小webapp,写下了一个自定义的登录拦截器,一切都正常并按预期工作。如果用户试图直接调用HomeAction(如果您以前登录,会导致home.jsp),我可以将用户重定向到登
Login.jsp
)Home.jsp
)HomeAction
(如果您以前登录,会导致home.jsp
),我可以将用户重定向到登录页面,如http://myserver/homeAction
当我尝试像这样直接访问JSP时会出现问题:
http://myserver/home
当我使用这个约定插件时,Struts获取我的home.jsp
插件并显示它。这不是我期望的行为,因为home.jsp
应该只显示为loginAction
成功的结果
我试图解决这个问题的事情
好吧,就我谷歌搜索的结果而言,把我的JSP放在/WEB-INF/
目录中应该会阻止它们被访问,但事实并非如此,因为我所有的JSP都在/WEB-INF/content/
目录中
我尝试的另一件事是阻止对任何JSP
资源的访问(阻止*.JSP
请求)。只要您尝试访问myserver/home.jsp
,但在访问myserver/home
时失败(如预期的那样),这就可以实现
编辑:stackoverflow中还有一个关于这个问题的问题,但我无法理解答案:
信息更新:我发现Struts2约定插件使用了一种叫做“无操作结果”的东西因此,您可以通过调用JSP
来访问WEB-INF/content
目录中的JSP
,而无需扩展名,它将把它作为一个伪操作处理,成功后返回JSP
。这是一个例子来说明我试图解释的内容:
如果我的WEB-INF/content
目录中有home.jsp
,请调用http://myserver/home
,Struts2将“触发”一个操作,其结果将是home.jsp
。然后,问题的解决方案将是禁用这种“无操作”结果
如果没有人提供答案,我会在走向解决方案的过程中不断更新问题。这里您想如何禁用此功能
创建一个虚拟bean:
package com.struts.handler;
导入com.opensymphony.xwork2.ActionContext;
导入com.opensymphony.xwork2.Result;
导入com.opensymphony.xwork2.UnknownHandler;
导入com.opensymphony.xwork2.XWorkException;
导入com.opensymphony.xwork2.config.entities.ActionConfig;
/**
*由Roman C于2015年3月22日创建。
*/
公共类MyUnknownHandler实现UnknownHandler{
@凌驾
public ActionConfig handleUnknownAction(字符串名称空间,字符串actionName)引发XWorkException{
返回null;
}
@凌驾
公共结果handleUnknownResult(ActionContext ActionContext、String actionName、ActionConfig ActionConfig、String resultCode)引发XWorkException{
返回null;
}
@凌驾
公共对象handleUnknownActionMethod(对象操作,字符串方法名)抛出NoSuchMethodException{
返回null;
}
}
然后在struts.xml
中配置它:
解释:
上面提到的约定插件及其创建的配置也放置了一个未知的处理程序,该处理程序应该处理不存在配置的URL(即,不由约定创建)。这就是问题的根源
现在,放置自己的处理程序将禁用约定的处理程序。因此,它将不再按照惯例处理结果。非常感谢您,罗曼,您的回答一如既往地很有帮助。我可以通过struts2
使用UnknownHandler
声明:)禁用自动无操作结果