如何在Tomcat中添加自定义头?

如何在Tomcat中添加自定义头?,tomcat,servlet-filters,Tomcat,Servlet Filters,我们有一个在Tomcat上运行的应用程序。在任何请求到达我们的服务器之前,它都要经过一个网关。这个网关添加了一个名为request-id的自定义http头。这就是我们在整个子系统中跟踪请求的方式 有时,网关可能无法添加此标头。在这种情况下,我想知道是否可以编写一个过滤器或其他东西来添加这个头(如果缺少),并将值设置为UUID。这样,我的业务逻辑就不必担心请求id是否丢失 我在网上搜索过,但还没有找到任何东西。你很久没有问过这个问题了,但最近我遇到了同样的情况,我必须检测请求是否有Coookie头

我们有一个在Tomcat上运行的应用程序。在任何请求到达我们的服务器之前,它都要经过一个网关。这个网关添加了一个名为request-id的自定义http头。这就是我们在整个子系统中跟踪请求的方式

有时,网关可能无法添加此标头。在这种情况下,我想知道是否可以编写一个过滤器或其他东西来添加这个头(如果缺少),并将值设置为UUID。这样,我的业务逻辑就不必担心请求id是否丢失


我在网上搜索过,但还没有找到任何东西。

你很久没有问过这个问题了,但最近我遇到了同样的情况,我必须检测请求是否有
Coookie
头,否则,添加
Set Cookie
头,并使用
SameSite=None
。我已经用过滤器实现了这一点。在我的例子中,每个请求或响应都必须分别有一个Cookie或Set Cookie头

public class SameSiteCookieHeaderFilter implements Filter {

private static final String LOCALE_ID_COOKIE = "locale";

private static final String SET_COOKIE_HEADER = "Set-Cookie";

@Override
public void destroy() {
}

@Override
public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse,
                     final FilterChain filterChain) throws IOException, ServletException {
    final HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
    final HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
    final Collection<String> setCookieHeaders = httpServletResponse.getHeaders(SET_COOKIE_HEADER);

    for (final String setCookieHeader : setCookieHeaders) {
        httpServletResponse.addHeader(SET_COOKIE_HEADER, setCookieHeader + "; Secure; SameSite=None");
    }

    if (setCookieHeaders.size() == 0) {
        final Cookie[] cookies = httpServletRequest.getCookies();

        for (final Cookie cookie : cookies) {
            if (cookie.getName().equals(LOCALE_ID_COOKIE)) {
                httpServletResponse.addHeader(SET_COOKIE_HEADER, buildSessionIdCookie(cookie.getValue()));
            }
        }
    }

    filterChain.doFilter(servletRequest, servletResponse);
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
}

private String buildSessionIdCookie(final String value) {
    return LOCALE_ID_COOKIE + "=" + value + "; " + "Path=/; " + "SameSite=None; " + "Secure; HttpOnly;";
}
公共类SameSiteCookieHeaderFilter实现过滤器{
私有静态最终字符串LOCALE\u ID\u COOKIE=“LOCALE”;
私有静态最终字符串SET\u COOKIE\u HEADER=“SET COOKIE”;
@凌驾
公共空间销毁(){
}
@凌驾
public void doFilter(final ServletRequest ServletRequest,final ServletResponse ServletResponse,
最终筛选链(FilterChain)抛出IOException、ServletException{
最终HttpServletRequest HttpServletRequest=(HttpServletRequest)servletRequest;
最终HttpServletResponse HttpServletResponse=(HttpServletResponse)servletResponse;
最终集合setCookieHeaders=httpServletResponse.getHeaders(SET\u COOKIE\u HEADER);
for(最终字符串setCookieHeader:setCookieHeaders){
addHeader(SET_COOKIE_HEADER,setCookieHeader+“Secure;SameSite=None”);
}
if(setCookieHeaders.size()==0){
最终Cookie[]cookies=httpServletRequest.getCookies();
用于(最终Cookie:cookies){
if(cookie.getName().equals(LOCALE\u ID\u cookie)){
httpServletResponse.addHeader(SET_COOKIE_HEADER,buildSessionIdCookie(COOKIE.getValue());
}
}
}
doFilter(servletRequest,servletResponse);
}
@凌驾
public void init(FilterConfig FilterConfig)抛出ServletException{
}
私有字符串buildSessionIdCookie(最终字符串值){
返回LOCALE_ID_COOKIE+“=”+value+“;“+”Path=/;“+”SameSite=None;“+”Secure;HttpOnly;”;
}
web.xml(应用程序端)


SameSiteCookieHeaderFilter
de.chemmedia.kw.core.filter.SameSiteCookieHeaderFilter
SameSiteCookieHeaderFilter
/*
要求
仅供参考:Tomcat 7.0.104、Servlet 3.1和Spring 4.2.x

我希望我的回答能帮助别人
<filter>
    <filter-name>SameSiteCookieHeaderFilter</filter-name>
    <filter-class>de.chemmedia.kw.core.filter.SameSiteCookieHeaderFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SameSiteCookieHeaderFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>