Jak usunąć nagłówek odpowiedzi HTTP?

Mam sytuację, w której jeden z nagłówków odpowiedzi Content-Disposition musi zostać usunięty. Więc pomyślałem o napisaniu filtra serwleta, aby to zrobić. Ale zdałem sobie sprawę, że HttpServletResponse ma tylko metodę setHeader(), ale nie ma metody, aby ją usunąć. Jak mogę to zrobić?

Author: BalusC, 2011-10-25

4 answers

Nie można później usuwać nagłówków za pomocą standardowego API serwletów. Najlepszym rozwiązaniem jest po prostu zapobiec nagłówek jest ustawiony. Możesz to zrobić, tworząc Filter który zastępuje ServletResponse z niestandardowym HttpServletResponseWrapper wdrożenie, które pomija setHeader()'s job whether the header name is Content-Disposition.

W zasadzie:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    chain.doFilter(request, new HttpServletResponseWrapper((HttpServletResponse) response) {
        public void setHeader(String name, String value) {
            if (!name.equalsIgnoreCase("Content-Disposition")) {
                super.setHeader(name, value);
            }
        }
    });
}

Po prostu zmapuj ten filtr na wzór adresu URL, aby go uruchomić.

 53
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:32:24

Może to nie być zgodne z API Servleta, ale ustawienie wartości na null działa na GlassFish 4 i prawdopodobnie również na Tomcat, ponieważ to jest to, co znajduje się pod GlassFish.

Naprawdę musimy zaktualizować specyfikację API Servleta, aby dodać metodę pozwalającą na usuwanie nagłówków lub oficjalnie wspierać użycie setHeader z wartością null.

Przykład, w którym jest to ważne, to użycie ograniczenia bezpieczeństwa (SSL / TLS) w aplikacji internetowej, a następnie statyczne buforowanie zasobów jest komplikuje to fakt, że kontener automatycznie doda nagłówki, aby zapobiec buforowaniu (możesz spróbować wyłączyć za pomocą disableProxyCaching i securePagesWithPragma na Tomcat / GlassFish). Mam już filtr servlet dla Cache control, który działa świetnie dla niezabezpieczonych treści, więc chciałbym zachować cache control wszystko w jednym miejscu i po prostu ustawić Prama I Cache-Control na null, aby wyczyścić każdy kontener dodane nagłówki.

 3
Author: Ryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-16 17:59:56

To nie działa dla mnie przy użyciu Spring 4. Próbuję usunąć nagłówek odpowiedzi Expires. Na każdą stronę. TAK:

public class CachingFilter implements Filter {
    private final Log logger = LogFactory.getLog(getClass());

    public CachingFilter() {}
    public void destroy() {}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        logger.debug("doFilter()");
        chain.doFilter(request, new HttpServletResponseWrapper((HttpServletResponse) response) {
            public void setHeader(String name, String value) {
                logger.debug("setHeader(" + name + ","+value+")");

                if (!name.equalsIgnoreCase("Expires")) {
                    super.setHeader(name, value);
                }
            }
        });
    }

    public void init(FilterConfig fConfig) throws ServletException {}
}

A oto jak dodaję filtr:

public class AppConfig implements WebApplicationInitializer {
    private static final String DISPATCHER_SERVLET_NAME = "dispatcher";
    private static final String DISPATCHER_SERVLET_MAPPING = "/";

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(AppContext.class);

        ServletRegistration.Dynamic dispatcher = servletContext.addServlet(DISPATCHER_SERVLET_NAME, new DispatcherServlet(rootContext));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping(DISPATCHER_SERVLET_MAPPING);

        EnumSet<DispatcherType> dispatcherTypes = EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD);

        FilterRegistration.Dynamic noCache = servletContext.addFilter("noCacheFilter", new CachingFilter());
        noCache.addMappingForUrlPatterns(dispatcherTypes, true, "/*");

        servletContext.addListener(new ContextLoaderListener(rootContext));
    }
}

SetHeader() jest wywoływana dla Expires i Cache-Control, ale nie mogę nadpisać wartości filtra Expires ani wartości Cache-Control. Mogę dodać do wartości Cache-Control. Zamienia się w tablicę wartości, jeśli wywołam setHeader na Cache-Control. Ale muszę usunąć nagłówek.

 1
Author: yetimoner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-25 11:26:08

Jak Inne odpowiedzi. Nie ma sposobu na usunięcie nagłówka po ustawieniu, przynajmniej nie standardowego(glassfish pozwala wyczyścić nagłówek ustawiając jego wartość na null). Więc na koniec dnia miałbyś dwa wyjścia:

  1. Zresetuj odpowiedź za pomocą response.reset() - skutecznie usuwa wszystkie nagłówki, a także wszelkie buforowane dane, w zależności od przypadku może być dobrą alternatywą(w moim przypadku po błędach uwierzytelniania). Jeśli odpowiedź jest już zatwierdzona otrzymasz / Align = "left" /

  2. Ustaw nagłówek na pusty łańcuch, oczywiście to nie usuwa nagłówka. Ale specyfikacja http zawiera tylko niektóre definicje i pustą wartość w nagłówkach Accept-Encoding, TE (transfer encoding) I host, więc w zależności od potrzeb możesz kontrolować to w warstwie aplikacji.

 1
Author: le0diaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-29 17:17:48