Почему мое приложение Spring Boot перенаправляется после истечения сеанса? - PullRequest
0 голосов
/ 04 ноября 2019

Я использую Spring Boot версии 2.1.5.RELEASE с Security. Я выставляю общедоступную конечную точку на /file/{id}, которая возвращает байтовый массив изображения.

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("file")
public class FileFetchController extends BaseFileController {

    @ResponseBody
    @GetMapping("{id}")
    public byte[] getFileData(@PathVariable Long id, @RequestParam("size") String size) throws Exception {
        return // The image byte array...
    }
}

Я могу использовать эту конечную точку в теге изображения HTML, подобном этому <img src="https://example.com/file/123"/>, который правильно выбирает изображение и отображает егов веб-браузере.

Проблема возникает после определенного периода бездействия. При перезагрузке веб-страницы изображение не отображается. Когда я проверяю сеть, я вижу, что сервер Spring Boot ответил перенаправлением 302.

Я подозреваю, что он перенаправляет на страницу входа после истечения сеанса. Но я могу ошибаться!?

Следующее, если конфигурация Spring Security:

protected void configure(HttpSecurity http) throws Exception
{
    http    .csrf().disable()
            .authorizeRequests()
            .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
            .antMatchers("/file/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .successHandler(customAuthenticationSuccessHandler)
            .loginPage("/login").permitAll()
            .failureUrl("/login?error")
            .and()
            .logout()
            .invalidateHttpSession(true)
            .logoutUrl("/logout")
            .deleteCookies("JSESSIONID", "remember-me")
            .permitAll()
            .and()
            .rememberMe().key("salt").tokenValiditySeconds(31536000).authenticationSuccessHandler(customAuthenticationSuccessHandler);
}

Вы заметите, что я разрешаю неаутентифицированные запросы на /file/**. Так почему я получаю перенаправление 302 после периода отсутствия запросов? Или что-то еще может вызывать ответ перенаправления?

Вот подробности ответа:

Request URL: https://diff.uk/file/1756?size=l
Request Method: GET
Status Code: 302 
Remote Address: xxx.xxx.xxx.xxx:443
Referrer Policy: no-referrer-when-downgrade
cache-control: no-cache, no-store, max-age=0, must-revalidate
content-length: 0
date: Mon, 04 Nov 2019 16:52:29 GMT
expires: 0
location: https://diff.uk/home
pragma: no-cache
set-cookie: JSESSIONID=66AA54E923A9E7C3F95C5C8C092C6E6D; Path=/; Secure; HttpOnly
status: 302
strict-transport-security: max-age=31536000 ; includeSubDomains
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
:authority: diff.uk
:method: GET
:path: /file/1756?size=l
:scheme: https
accept: image/webp,image/apng,image/*,*/*;q=0.8
accept-encoding: gzip, deflate, br
accept-language: en-GB,en-US;q=0.9,en;q=0.8
cache-control: no-cache
cookie: remember-me=Y3JtOjE2MDQxNzA1NTM3MDc6ZWMyM2ZkZTlmOWIzMDZkZDAyNGI4OTBkYzM1ZDViYjE; JSESSIONID=349EF51482FA88879BBF4BE02505279A
dnt: 1
pragma: no-cache
referer: https://example.co.uk/
sec-fetch-mode: no-cors
sec-fetch-site: cross-site
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
size: l

Вот ответ об успехе, полученный, когда тот же запрос отправляется сразу после полученияОтвет 302:

Request URL: https://diff.uk/file/1756?size=l
Request Method: GET
Status Code: 200 
Remote Address: xxx.xxx.xxx.xxx:443
Referrer Policy: no-referrer-when-downgrade
cache-control: no-cache, no-store, max-age=0, must-revalidate
content-length: 15087
content-type: image/webp
date: Mon, 04 Nov 2019 16:57:35 GMT
expires: 0
pragma: no-cache
status: 200
strict-transport-security: max-age=31536000 ; includeSubDomains
x-content-type-options: nosniff
x-frame-options: DENY
x-xss-protection: 1; mode=block
:authority: diff.uk
:method: GET
:path: /file/1756?size=l
:scheme: https
accept: image/webp,image/apng,image/*,*/*;q=0.8
accept-encoding: gzip, deflate, br
accept-language: en-GB,en-US;q=0.9,en;q=0.8
cache-control: no-cache
cookie: remember-me=Y3JtOjE2MDQxNzA1NTM3MDc6ZWMyM2ZkZTlmOWIzMDZkZDAyNGI4OTBkYzM1ZDViYjE; JSESSIONID=5A70AE46A5ACA081947A728C20F92502
dnt: 1
pragma: no-cache
referer: https://example.co.uk/
sec-fetch-mode: no-cors
sec-fetch-site: cross-site
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36
size: l

Разница между двумя ответами выглядит следующим образом:

set-cookie: JSESSIONID=66AA54E923A9E7C3F95C5C8C092C6E6D; Path=/; Secure; HttpOnly

Это ошибка, которую отображает Chrome:

Cookieсвязанный с межсайтовым ресурсом в https://diff.uk/ был установлен без атрибута SameSite. В следующем выпуске Chrome файлы cookie будут отправляться только с межсайтовыми запросами, если для них установлены значения SameSite=None и Secure. Вы можете просмотреть файлы cookie в инструментах разработчика в разделе «Приложение> Хранение> Файлы cookie» и получить более подробную информацию по https://diff.uk/home и https://www.chromestatus.com/feature/5633521622188032. 2. Блокировка перекрестного чтения (CORB). с MIME типа текст / HTML. Подробнее см. https://www.chromestatus.com/feature/5629709824032768.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...