Выход на Tomcat с Apache для Spring MVC Ошибка ERR_TOO_MANY_REDIRECTS - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть веб-приложение Spring MVC (v4.3.1), работающее на сервере Tomcat (v8.5), на котором работает сервер приложений Apache (v2.4), используемый в качестве обратного прокси-сервера.

У меня установлен сертификат SSL на Apache, чтобы он обрабатывал все защищенные (: 443) и незащищенные (: 80) входящие запросы и перенаправлял их на экземпляр Tomcat.

Я хочуобрабатывать все коммуникации как защищенные (SSL) с внешним миром.Но внутри Apache и Tomcat нет необходимости общаться через безопасный порт.Вот почему Apache перенаправляет все HTTP запросы на HTTPS

Я также использую Spring Security (v4) для обработки всех действий по авторизации / аутентификации пользователей, поэтому я даже зарегистрировался/ Логин / Выход из системы и т. Д.

Моя текущая архитектура сервера показана ниже:

enter image description here

После предоставления сводки проблема заключается в,
Всякий раз, когда я пытаюсь получить доступ к своей странице входа , я получаю ERR_TOO_MANY_REDIRECTS ошибку от Chrome.

Кроме того , когда я получаю доступTomcat Manager (http://myapp.net:8080/manager/html) и нажмите на URL моего приложения (/MyApp-1.0.0), затем ** я могу успешно просмотреть ** мою страницу входа без https. (После нажатия на ссылку приложения, развернутого на tomcat, он открываетсястраница: http://myapp.net:8080/MyApp-1.0.0/login) Я считаю, что это показывает, что нет проблем, когда мое веб-приложение работает на экземпляре tomcat. Они хорошо работают вместе. Он подозревает, что моя проблема начинается с Apache с SSL.

Конфигурация Apache для виртуальных компьютеровsts:

Listen 80
Listen 443

<VirtualHost *:80>

   ServerAdmin emrecaglar@gmail.com
   ServerName myapp.net
   ServerAlias www.myapp.net
   Redirect  / https://www.myapp.net/

</VirtualHost>
<VirtualHost *:443>

        ServerName  myapp.net
        ServerAlias www.myapp.net
        ProxyPreserveHost On
        ProxyPass /  http://127.0.0.1:8080/MyApp-1.0.0/
        ProxyPassReverse /  http://127.0.0.1:8080/MyApp-1.0.0/

        SSLEngine on
        SSLCertificateFile /root/WWW.myapp.NET.crt
        SSLCertificateKeyFile /root/www.myapp.net.key
        SSLCertificateChainFile /root/dv_chain.txt

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Я не хочу использовать правила перезаписи, если это не критично.Я хочу работать с Redirect.

Tomcat server.xml конфигурация:

<Connector   port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" />

Не определен соединитель для : 8443 , как яне хочу, чтобы Tomcat работал на безопасном порту.Tomcat будет связываться только с сервером Apache.

Конфигурация Spring Security:

@Override
protected void configure(HttpSecurity http) throws Exception {
       http
           .authorizeRequests()
           .antMatchers("/static/**").permitAll()
           .antMatchers("/register*").permitAll()
           .anyRequest().authenticated()
        .and()
           .formLogin()
                  .loginPage("/login")
                  .failureUrl("/login?error=true")
                  .defaultSuccessUrl("/view/home")
                  .permitAll()
        .and()
            .logout().logoutUrl("/logout").logoutSuccessUrl("/login? 
             logout").invalidateHttpSession(true).deleteCookies("auth_code", 
              "JSESSIONID").permitAll();
    }

}  

Я также прочитал некоторые сообщения о allowAll (), и anonymous () отличается, так что allowAll () может даже инициировать цикл перенаправления, поэтому для страницы входа она должна быть анонимной (), однако я не смог ее проверить.Я считаю, что это также нуждается в дополнительной роли с точки зрения безопасности весны.

Контроллеры My Spring:

 @RequestMapping(value = "/", method = RequestMethod.GET)
    public String homePage(Principal principal) {

        /**
         * Initialize session user if not initialized
         */

          return "redirect:/view/home";
    }

другое:

@Controller
@RequestMapping(value = "/view")
public class ViewController
{
 @RequestMapping(value = "/home")
    public String getHomePage(Model model, Principal principal)
    {

        //some logic

        return "home";
    }
}

Web MVC config для входа в систему:

@Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/login").setViewName("login");

    }

У меня есть связанные преобразователи представлений и представлений (home.jsp, login.jsp)

Выводы отладки консоли разработчика Chrome для перенаправлений

 General
    Request URL: http://www.myapp.net/MyApp-1.0.0/login
    Request Method: GET
    Status Code: 302 Found
    Remote Address: 207.154.208.158:80
    Referrer Policy: no-referrer-when-downgrade
 Response Header
    HTTP/1.1 302 Found
    Date: Sat, 17 Nov 2018 08:40:04 GMT
    Server: Apache/2.4.18 (Ubuntu)
    Location: https://www.myapp.net/MyApp-1.0.0/login
    Content-Length: 314
    Keep-Alive: timeout=5, max=92
    Connection: Keep-Alive

 Request Header
    Content-Type: text/html; charset=iso-8859-1
    GET /MyApp-1.0.0/login HTTP/1.1
    Host: www.myapp.net
    Connection: keep-alive
    Pragma: no-cache
    Cache-Control: no-cache
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    Accept-Encoding: gzip, deflate
    Accept-Language: en-US,en;q=0.9
    Cookie: JSESSIONID=8A4E001A841DBC4D55509605FF3E7E23




General
    Request URL: https://www.myapp.net/MyApp-1.0.0/login
    Request Method: GET
    Status Code: 302 
    Remote Address: 207.154.208.158:443
    Referrer Policy: no-referrer-when-downgrade
Response Header
    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
    Connection: Keep-Alive
    Content-Length: 0
    Date: Sat, 17 Nov 2018 08:40:04 GMT
    Expires: 0
    Keep-Alive: timeout=5, max=92
    Location: http://www.myapp.net/MyApp-1.0.0/login
    Pragma: no-cache
    Server: Apache/2.4.18 (Ubuntu)
    X-Content-Type-Options: nosniff
    X-Frame-Options: DENY
    X-XSS-Protection: 1; mode=block
 Request Header
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    Accept-Encoding: gzip, deflate, br
    Accept-Language: en-US,en;q=0.9
    Cache-Control: no-cache
    Connection: keep-alive
    Cookie: JSESSIONID=8A4E001A841DBC4D55509605FF3E7E23
    Host: www.myapp.net
    Pragma: no-cache
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36

Повторный цикл запросов между этими двумя запросами от HTTPS к HTTP и HTPPS снова

Apache access.log

67.171.8.29 - - [17/Nov/2018:08:41:59 +0000] "GET /MyApp-1.0.0/login HTTP/1.1" 302 429 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36"

Apache error.log

[Sat Nov 17 08:37:59.376633 2018] [mpm_event:notice] [pid 20673:tid 140534533293952] AH00489: Apache/2.4.18 (Ubuntu) mod_jk/1.2.41 OpenSSL/1.0.2g configured -- resuming normal operations
[Sat Nov 17 08:37:59.376707 2018] [core:notice] [pid 20673:tid 140534533293952] AH00094: Command line: '/usr/sbin/apache2'

Как видите, у меня нет никакого кода / конфигурации, связанного с SSL, для моего приложения Spring mvs и Tomcat.Им не нужно знать об этом, так как я хочу, чтобы apache отвечал только за SSL и обработку запросов https и перенаправления в Tomcat.

Что мне здесь не хватает, так что я вызываю петлю перенаправления?

Спасибо

...