Pytanie Jak włączyć buforowanie HTTP dla procedury obsługi zasobów za pomocą Spring MVC i Spring Security


Chcę włączyć buforowanie HTTP dla niektórych zasobów statycznych, takich jak obrazy, dla których dostęp jest ograniczony przez Spring Security. (Zasoby te nie mają krytycznego znaczenia dla bezpieczeństwa, ale nie powinny być również publicznie dostępne). Jak uniknąć dodawania przez usługę Spring Security nagłówków odpowiedzi HTTP, które wyłączają buforowanie?

Jeśli dodam setCachePeriod() do mojej rejestracji handlarza zasobami w WebMvcConfigurerAdapter.addResourceHandlers() jak następuje:

registry.addResourceHandler("/static/**")
  .addResourceLocations("classpath:/static/").setCachePeriod(3600);

Zasoby są nadal zwracane z następującymi nagłówkami, które wyłączają buforowanie:

Cache-Control: max-age=3600, must-revalidate
Expires: Mon, 04 Aug 2014 07:45:36 GMT
Pragma: no-cache

Chcę uniknąć wprowadzania jakiejkolwiek konfiguracji XML do projektu, który obecnie wykorzystuje tylko konfigurację adnotacji Java.

Czy istnieją lepsze rozwiązania niż rozszerzenie wiosennego handlarza zasobami?


11
2017-08-04 06:53


pochodzenie


Nawet nadpisanie / implementacja obsługi zasobów nie pomoże. Spring Security domyślnie wyłącza buforowanie dla zabezpieczonych zasobów. Jeśli nie chcesz, to wyłącz buforowanie dla tych zasobów. Można to zrobić za pomocą HttpSecurity coś jak http.antMatcher("/static/**").headers().disable() wyłącza wszystkie nagłówki ustawione przez Spring Security. To jest również wyjaśnione tutaj w Spring Security Reference Guide. - M. Deinum
Dzięki, panie Deinum. Kolejnym problemem jest to, że konfiguracja ma już antMatchers() wywołanie w następujący sposób: http.authorizeRequests().antMatchers("/login", "/static/public/**").permitAll().anyRequest().authenticated(). Jak zastosować headers().disable() reguła do "/ static / **" bez przesłonięcia powyższego antMatchers() reguła? - Samuli Kärkkäinen
Nie ma znaczenia, dodaj kolejnego lub połącz wiele konfiguracji z and(). Coś jak authenticated().and().headers().disabled(). - M. Deinum
Chcę wyłączyć nagłówki Spring Security dla "/ static / **". Rozumiem, że Twoja sugestia spowodowałaby ich wyłączenie dla wszystkich żądań lub dla pasujących do istniejących antMatchers() reguła. - Samuli Kärkkäinen
Nie ... Twoje zrozumienie nie jest poprawne ... Zawsze możesz też dodać dodatkowe antMatcher element. Wszystkie są ze sobą połączone. - M. Deinum


Odpowiedzi:


Możesz użyć zasobu webContentInterceptor, aby umożliwić buforowanie zasobów statycznych.

<mvc:interceptors>
    <mvc:interceptor>
    <mvc:mapping path="/static/*"/>
        <bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor">
            <property name="cacheSeconds" value="31556926"/>
            <property name="useExpiresHeader" value="true"/>
            <property name="useCacheControlHeader" value="true"/>
            <property name="useCacheControlNoStore" value="true"/>
        </bean>
   </mvc:interceptor>
</mvc:interceptors>

Korzystanie z adnotacji do konfigurowania przechwytujących pamięć podręczną odbywa się w następujący sposób. W twojej klasie konfiguracji internetowej możesz dodać komponent bean WebContentInterceptor klasy i dodaj go do listy przechwytujących.

@Bean
public WebContentInterceptor webContentInterceptor() {
    WebContentInterceptor interceptor = new WebContentInterceptor();
    interceptor.setCacheSeconds(31556926);
    interceptor.setUseExpiresHeader(true);;
    interceptor.setUseCacheControlHeader(true);
    interceptor.setUseCacheControlNoStore(true);
    return interceptor;
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(webContentInterceptor());
}

Odnosić się ta strona aby zobaczyć, jak to się robi.


8
2017-10-31 06:26



Wygląda na to, że Spring Security ustawia nagłówki zapobiegania buforowaniu po uruchomieniu tych przechwytujących, więc kod w twoim przykładzie nie ma wpływu na Spring Security. - Samuli Kärkkäinen
Potrzeba addPathPatterns("/static/*") także - sura2k
To wszystko jest teraz przestarzałe. Jakie jest nowe podejście? - Benny Bottema
To jest nowe podejście: WebContentInterceptor interceptor = new WebContentInterceptor (); interceptor.setCacheControl (CacheControl.youNeeds ()); registry.addInterceptor (przechwytujący); - Benny Bottema


Dokumentacja w Spring 4 ma takie rozwiązanie: "Jeśli rzeczywiście chcesz buforować określone odpowiedzi, aplikacja może selektywnie wywoływać HttpServletResponse.setHeader(String,String) aby zastąpić zestaw nagłówków Spring Security. "Jest to przydatne, aby zapewnić prawidłowe buforowanie CSS, JavaScript i obrazów.

Poniższy opis może być użyty do konfiguracji springmvc,

@EnableWebMvc
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry
        .addResourceHandler("/resources/**")
        .addResourceLocations("/resources/")
        .setCachePeriod(31556926);
  }

// ...
}

Na przykład: http://docs.spring.io/spring-security/site/docs/4.0.0.CI-SNAPSHOT/reference/htmlsingle/#headers-cache-control


1
2017-11-04 10:41



To powoduje przesłonięcie max-age część Cache-Control nagłówek. Jednak nie usuwa ona must-revalidate część tego nagłówka, ani Pragma: no-cache nagłówek. - Samuli Kärkkäinen
Inną opcją wymienioną w dokumencie jest bezpośrednie ustawianie nagłówka, HttpServletResponse.setHeader (String, String) - SunilGiri
Gdzie proponujesz wywołanie setHeader ()? Próbowałem różnych miejsc i za każdym razem, gdy Spring Security nadpisuje nagłówki. Czy zainstalowanie mojego własnego filtra serwletów jest jedyną metodą? - Samuli Kärkkäinen
Po prostu wypróbowałem to i nie wydaje się działać, Mój zły. Wydaje się, że jest to problem otwarty jira.spring.io/browse/SEC-2728 - SunilGiri
Właśnie wypróbowałem rozwiązanie wspomniane tutaj. Pięknie pracował. stackoverflow.com/questions/29530575/... - dipan66


Jesteś już skonfigurowany do buforowania. musisz ponownie zweryfikować oznacza, że ​​po wygaśnięciu pamięci podręcznej (3600 sekund) nie należy jej już używać, więc nagłówki odpowiedzi, jak sądzę, są poprawne dla tego, co chcesz.


0
2017-11-04 16:54



Dobry punkt, że must-revalidate nie zapobiega buforowaniu. Jednakże must-revalidate semantyka nie jest tym, czego zwykle się chce, i Pragma: no-cache często i tak zapobiega buforowaniu. - Samuli Kärkkäinen