如何在JBoss中从“根(/)”上下文自动定向到“我的Web应用程序”?

njthzxwz  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(194)

我使用的是JBoss 6.0。
我已部署Web应用程序:myApp.ear在网络环境下:“/test"。因此,如果我在浏览器URL中输入“*http://localhost:8080/test/*",我会得到我的登录页面(myLogin.jsp)。
因为我的WAR存在于EAR文件中,所以我使用Web模块中的
context-root
元素在application.xml文件中指定了上下文根-即

<module>
    <web>
        <web-uri>myWeb.war</web-uri>
        <context-root>/test</context-root>
    </web>
</module>

我的问题是如何将用户从“根上下文”自动定向到我的Web应用程序?
我的意思是,如果用户键入“http://localhost:8080/",我将期望加载Web应用程序的登录页面(而不是JBoss的默认ROOT.war的index.html页面)。
我从**{JBOSS}\server\default\deploy\ROOT.war中删除了现有的index.html**,并在那里创建了一个login.jsp。现在我可以看到,当我键入http://localhost:8080/时,“login.jsp”被调用了。但是我无法将用户请求重定向到我的Web应用的登录页面。
在该login.jsp中,我尝试了:<jsp:forward page="/test" />,但出现错误:“HTTP状态404 - /测试”。
如果我像<jsp:forward page="/test/myLogin.jsp" />那样调用,我仍然会得到同样的404错误。
有人能建议如何实现从根上下文自动定向到我的Web应用程序吗?

kmbjn2e3

kmbjn2e31#

您需要将index.html保存在默认部署文件夹中,并将请求转发到Web模块。
例如,仅在index.html中保留以下行

<META HTTP-EQUIV="Refresh" CONTENT="0; URL=/test/"/>
14ifxucb

14ifxucb2#

Senthil的答案很好用,但是用户可以看到浏览器实际完成的重定向(页面闪烁)。重定向也可以通过JBoss服务器的rewrite [12]功能来完成,该服务器支持30 x代码的HTTP重定向(没有闪烁)。
您可以直接将重写添加到您的应用(web.xmljboss-web.xml),并在rewrite.properties中指定重定向规则-此处未显示。
或者,您可以在不接触原始应用程序的情况下自行修改服务器配置。我发现这种解决方案很方便,因为应用程序保持不变。
使用案例:我们将其用于EJBCA部署(不是我们的应用),它会将上下文根设置为/ejbca。我们希望保留打包的ant脚本提供的默认部署流程,同时,我们希望添加从//ejbca的重定向作为某种默认设置,以便于用户使用。如果用户希望更改它,只需修改standalone.xml即可完成,而无需重新部署整个应用程序。
编辑standalone.xml

<subsystem xmlns="urn:jboss:domain:web:2.2" default-virtual-server="default-host" native="false">
    <virtual-server name="default-host" enable-welcome-root="true">
        <alias name="localhost"/>
        <rewrite pattern="^/$" substitution="/test" flags="L,QSA,R" />
    </virtual-server>
</subsystem>
ct2axkht

ct2axkht3#

这对我在Wildfly 26.1.1和JBoss EAP 7.4上起作用。

<subsystem xmlns="urn:jboss:domain:undertow:12.0" default-server="default-server" default-virtual-host="default-host" default-servlet-container="default" default-security-domain="other" statistics-enabled="${wildfly.undertow.statistics-enabled:${wildfly.statistics-enabled:false}}">
        <buffer-cache name="default"/>
        <filters>
            <rewrite name="myfilter" redirect="true" target="/myapp/"/>
        </filters>
        <server name="default-server">
            <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>
            <https-listener name="https" socket-binding="https" ssl-context="applicationSSC" enable-http2="true"/>
            <host name="default-host" alias="localhost">
                <location name="/" handler="welcome-content"/>
                <http-invoker http-authentication-factory="application-http-authentication"/>
                <filter-ref name="myfilter" predicate="path('/')"/> 
            </host>
        </server>
        <servlet-container name="default">
            <jsp-config/>
            <websockets/>
        </servlet-container>
        <handlers>
            <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
        </handlers>
        <application-security-domains>
            <application-security-domain name="other" security-domain="ApplicationDomain"/>
        </application-security-domains>
    </subsystem>

它看起来很多,但实际上不是。我的解决方案显示了默认配置,我只需要添加<filters>部分和<filter-ref>
请注意<filters>部分必须在<server>之上,否则JBoss将在启动时抱怨。这在https://access.redhat.com/solutions/2996371中没有记录,但毕竟我找到了https://docs.wildfly.org/19/wildscribe/subsystem/undertow/index.html
jboss-cli中,这意味着:

/subsystem=undertow/configuration=filter/rewrite=myfilter/:add(redirect=true, target=/myapp)
/subsystem=undertow/server=default-server/host=default-host/filter-ref=myfilter/:add(predicate="path('/')")

自动生成的standalone.xml的结构与上面的不完全相同,但也能正常工作。

相关问题