Java 使用命名约定插件拒绝直接访问Struts2中的JSP文件

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),我可以将用户重定向到登

由于我是Struts2开发的新手,最近才开始使用这个命名约定插件,所以我一直在努力解决这个问题

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

  • 登录页面(
    Login.jsp
  • 主页(
    Home.jsp
  • 首先,向用户显示一个登录页面,如果提供了正确的用户名和密码,用户将登录并重定向到主页

    我已经成功地创建了我的小webapp,写下了一个自定义的登录拦截器,一切都正常并按预期工作。如果用户试图直接调用
    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
    声明:)禁用自动
    无操作结果