当请求进入https时,如何使Spring重定向保留在HTTPS上?

时间:2015-03-10 19:03:57

标签: spring apache redirect jboss ajp

我正在使用Apache 2.2,JBoss 7.1.3.Final和Spring 3.2.11.RELEASE。当Spring在我们的一个控制器中发出重定向时会出现这样的情况

return new ModelAndView(new RedirectView(returnUrl+"?lti_errormsg="+msg));

即使原始页面请求包含“https”,新重定向也只包含“http”。我相信这可能与Apache如何连接到JBoss有关,我想知道如何调整我们的设置以便Spring正确地重定向(https用于https请求,http用于http请求)。我们通过AJP连接。这是我们的Apache配置

ProxyErrorOverride On
ProxyPass /myproject/ ajp://localhost:8009/myproject/

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule !/ebook/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

非常简单。以下是JBoss中与AJP有关的设置。

<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
    <socket-binding name="management-native" interface="management" port="${jboss.management.native.port:9999}"/>
    <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
    <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9443}"/>
    <socket-binding name="ajp" port="8009"/>
    <socket-binding name="http" port="8081"/>
    <socket-binding name="https" port="8443"/>
    <socket-binding name="osgi-http" interface="management" port="8090"/>
    <socket-binding name="remoting" port="4447"/>
    <socket-binding name="txn-recovery-environment" port="4712"/>
    <socket-binding name="txn-status-manager" port="4713"/>
    <outbound-socket-binding name="mail-smtp">
        <remote-destination host="localhost" port="25"/>
    </outbound-socket-binding>
</socket-binding-group>

让我知道我应该包含哪些其他信息或我们需要做什么配置,以便Spring重定向可以正常生效。

谢谢, - 戴夫

编辑:以下是我们如何在apache httpd.conf文件中加载ajp模块

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

3 个答案:

答案 0 :(得分:0)

将InternalResourceViewResolver的redirectHttp10Compatible属性设置为false:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
  <property name="prefix" value="/" />
  <property name="suffix" value=".jsp" />
  <property name="redirectHttp10Compatible" value="false" />
</bean>

答案 1 :(得分:0)

您使用的是弹簧安全吗?如果是这样,您可以使用ChannelProcessingFilter强制HTTPS(即,任何到达那里的URL,因为HTTP将被重定向回HTTPS)。

答案 2 :(得分:0)

这就是我们所拥有的(但我们只使用Tomcat)

@RequestMapping(value = "/some_url", method = RequestMethod.POST)
public String doSomething(...) {

    ...

    return "redirect:/login";
}