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