srpingboot 内置tomcat7.0.71及以上 版本 默认Cookie的数量是200个
背景
苹果ios手机钉钉默认浏览器直接打开我们域名会直接跳error页面,safari 浏览器可以直接打开网址,但是正常访问的时候也会突然跳error页面,系统info和error日志什么都没有,就能看到异常的时候打印了访问路径/error,但是,但是,ip端口访问是正常的。开启debug日志后访问异常输出如下:
org.springframework.web.servlet.view.ContentNegotiatingViewResolver - Selected 'text/html' given [text/html, text/html;q=0.8]
2021-12-07 20:27:07.767 DEBUG [http-nio-8085-exec-6] org.springframework.web.servlet.DispatcherServlet - Exiting from "ERROR" dispatch, status 400
2021-12-07 20:27:07.866 DEBUG [http-nio-8085-exec-1] org.springframework.web.servlet.DispatcherServlet - GET "/favicon.ico", parameters={}
2021-12-07 20:27:07.866 DEBUG [http-nio-8085-exec-1] org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped to ResourceHttpRequestHandler ["classpath:/static/"]
2021-12-07 20:27:07.867 DEBUG [http-nio-8085-exec-1] org.springframework.web.servlet.resource.ResourceHttpRequestHandler - Resource not found
2021-12-07 20:27:07.867 DEBUG [http-nio-8085-exec-1] org.springframework.web.servlet.DispatcherServlet - Completed 404 NOT_FOUND
2021-12-07 20:27:07.867 DEBUG [http-nio-8085-exec-1] org.springframework.web.servlet.DispatcherServlet - "ERROR" dispatch for GET "/error", parameters={}
2021-12-07 20:27:07.868 DEBUG [http-nio-8085-exec-1] org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest)
重点在这儿:
org.springframework.web.servlet.DispatcherServlet - Exiting from "ERROR" dispatch, status 400
大概可以猜测到是请求路径映射DispatcherServlet的时候发生了异常。但是我们用的是内置的tomcat所以我没有去看内置tomcat的日志。
用抓包工具分别抓ip端口访问的时候的请求信息和域名访问的时候的请求信息:
发现请求头都携带了Cookie但是Cookie的长度不一样:
域名访问:
mh_0.8818383342788993=12345;
_aihecong_chat_conversation=true;
mh_0.06655431626293196=12345;
mh_0.3121930759831817=12345;
mh_0.5266883784497376=12345;
_aihecong_chat_visitorCookie=%7B%22visitorId%22%3A%2261a5d496ed891e3bb1f62979%22%2C%22last%22%3Afalse%2C%22lastTime%22%3A1638856631043%7D;
mh_0.4942674314720472=12345;
mh_0.8068779572292604=12345;
mh_0.5370449572398744=12345;
mh_0.5912791595499319=12345;
mh_0.6652344235161937=12345;
mh_0.04655730532916169=12345;
mh_0.08272178922972295=12345;
mh_0.402898400103715=12345;
mh_0.8520086931399917=12345;
mh_0.23525024840840525=12345;
mh_0.3702568415281421=12345;
mh_0.4910288774065693=12345;
mh_0.5021439749351646=12345; mh_0.28207864663575055=12345; mh_0.3664229097737821=12345; mh_0.22227474030119332=12345; mh_0.42489867420404304=12345; mh_0.8136681418221814=12345; mh_0.8836069402631829=12345; mh_0.6532952359632697=12345; mh_0.5478232816736274=12345; mh_0.5715001462972175=12345; mh_0.3765700107244452=12345; mh_0.6048743274710808=12345; mh_0.49758645682174296=12345; mh_0.05820159179778539=12345; mh_0.05839316734766964=12345; mh_0.87120729551117=12345; mh_0.7668928976832695=12345; mh_0.1794994146662532=12345; mh_0.023292054868106926=12345; mh_0.6266713356011994=12345; mh_0.832736568248902=12345; mh_0.931108852004962=12345; mh_0.9290139549797762=12345; mh_0.9680003576260802=12345; mh_0.04574323643649192=12345; mh_0.0010829903109413896=12345; mh_0.7003417702005582=12345; mh_0.8226995733059559=12345; mh_0.06478582345536288=12345; _aihecong_chat_address=%7B%22city%22%3A%22%E4%B8%8A%E6%B5%B7%22%2C%22region%22%3A%22%E4%B8%8A%E6%B5%B7%22%2C%22country%22%3A%22%E4%B8%AD%E5%9B%BD%22%7D; mh_0.5251486022491784=12345; mh_0.9975306461856492=12345; mh_0.025674865927995838=12345; mh_0.23814277235573067=12345; mh_0.6225761348552022=12345; mh_0.7690589365008481=12345; mh_0.7891711132351685=12345; mh_0.9464932815989453=12345; mh_0.22804617093896817=12345; mh_0.5808406310206365=12345; mh_0.9396504144916135=12345; mh_0.620317500575006=12345; mh_0.016668093208794366=12345; mh_0.6227207216354217=12345; mh_0.9705951055259456=12345; mh_0.6432485649528862=12345; mh_0.9639550472678586=12345; mh_0.1264864022090647=12345; mh_0.8485349896051959=12345; mh_0.47771081498952594=12345; mh_0.5440163095731488=12345; mh_0.7523022324155416=12345; mh_0.9304535222785286=12345; mh_0.3136879759137724=12345; mh_0.4368193784268237=12345; mh_0.8433293080870621=12345; mh_0.4312657259870678=12345; mh_0.6021044526490308=12345; mh_0.804323049897561=12345; mh_0.008030645217106058=12345; mh_0.3032307680701183=12345; mh_0.5628119024711526=12345; mh_0.02702155722903421=12345; mh_0.7424188992927315=12345; mh_0.13486630882599404=12345; mh_0.24442065825697012=12345; mh_0.3214872140642415=12345; mh_0.9542036052840362=12345; mh_0.1399279120112985=12345; mh_0.5606729640231981=12345; mh_0.8911021396609169=12345; mh_0.9518169600720812=12345; mh_0.32156324315816187=12345; mh_0.3325271641461932=12345; mh_0.6572934026272114=12345; mh_0.6459630448357968=12345; mh_0.69948586506062=12345; mh_0.060213073826973385=12345; mh_0.7839481293439979=12345; mh_0.9520257602170045=12345; mh_0.28360726301995187=12345; mh_0.46693677678332357=12345; mh_0.9088611674132936=12345; mh_0.02173519937144719=12345; mh_0.06274723728943699=12345; mh_0.257771392164324=12345; mh_0.6777076901744478=12345; mh_0.06948188996085991=12345; mh_0.6909907215904806=12345; mh_0.011969713552175354=12345; mh_0.4459923250547563=12345; mh_0.6204684967133944=12345; mh_0.1092651104970308=12345; mh_0.9985923593010151=12345; mh_0.07390146676392884=12345; mh_0.6195356464648264=12345; mh_0.23707135943373436=12345; mh_0.14698504799139755=12345; mh_0.9536614148839331=12345; mh_0.9651154880205673=12345; mh_0.30406495446967674=12345; mh_0.969964805976722=12345; mh_0.2360864419961617=12345; mh_0.6472536076210155=12345; mh_0.4047697887164168=12345; mh_0.5352950929344255=12345; mh_0.17848996974365805=12345; mh_0.2254447148943236=12345; mh_0.3744224432395362=12345; mh_0.402268318606526=12345; mh_0.6784612016411621=12345; mh_0.3224742495979278=12345; mh_0.20700008217546173=12345; mh_0.5684313280205135=12345; mh_0.7660629786454927=12345; mh_0.30844057242909706=12345; mh_0.03068194216117326=12345; mh_0.23768632466130934=12345; mh_0.6042131105325684=12345; mh_0.6491505007094267=12345; mh_0.5684167910366359=12345; mh_0.8592976874211564=12345; mh_0.8637866061288945=12345; mh_0.1620558617123805=12345; mh_0.1938278084156767=12345; mh_0.31152858371840164=12345; mh_0.7458908623211015=12345; mh_0.18790489544817024=12345; mh_0.3238797197811293=12345; mh_0.821095779203877=12345; mh_0.48307790468279943=12345; mh_0.1269351205675685=12345; mh_0.8396942958601941=12345; mh_0.9365045824566972=12345; mh_0.8536652189812907=12345; mh_0.16656615084354154=12345; mh_0.18375560917351053=12345; mh_0.5257783104466449=12345; mh_0.3434851681709008=12345; mh_0.14347014416284887=12345; mh_0.7053125026268506=12345; mh_0.9895859926266649=12345; mh_0.6256788995369796=12345; mh_0.41927881151378077=12345; mh_0.5307097730785667=12345; mh_0.8364783538330687=12345; mh_0.14161763294137708=12345; mh_0.05231810549564109=12345; mh_0.2088229552849139=12345; mh_0.6973174878201882=12345; mh_0.8718495342039471=12345; mh_0.5681418044751719=12345; mh_0.7280592336745206=12345; mh_0.48131660398142684=12345; mh_0.925142026325765=12345; mh_0.2537783484607292=12345; mh_0.8412040887255947=12345; mh_0.011089458102345295=12345; mh_0.43819841820985117=12345; mh_0.4559123657636348=12345; mh_0.5629211052061318=12345; mh_0.6456116292301467=12345; mh_0.20181589507765585=12345; mh_0.4521575664345251=12345; mh_0.4568706877058263=12345; mh_0.6951000207817823=12345; mh_0.4716756228633394=12345; mh_0.6601087985865335=12345; mh_0.13241078544900464=12345; mh_0.5181850907718553=12345; mh_0.2829213137799438=12345; mh_0.4297804515048119=12345; mh_0.7672706022739301=12345; mh_0.32953783678781956=12345; mh_0.7712552475801735=12345; mh_0.9823227740495202=12345; mh_0.12979893771034767=12345; mh_0.3211053260280601=12345; mh_0.423623078222365=12345; mh_0.5456667553850367=12345; mh_0.6738449845116905=12345; mh_0.8103039258319902=12345; _aihecong_chat_channelIds=%5B%7B%22customerId%22%3A%2261a5d4c5c1ed760abe9af8f3%22%2C%22channelId%22%3A%22caHA11%22%7D%5D
ip访问携带的Cookie:
aihecong_chat_conversation=true;
_aihecong_chat_visibility=true;
_aihecong_chat_visitorCookie=%7B%22visitormark%22%3A%7B%22addtime%22%3A%222021-12-08T02%3A01%3A17.237Z%22%2C%22address%22%3A%7B%22city%22%3A%22%E4%B8%8A%E6%B5%B7%22%2C%22region%22%3A%22%E4%B8%8A%E6%B5%B7%22%2C%22country%22%3A%22%E4%B8%AD%E5%9B%BD%22%7D%2C%22device%22%3A%7B%22ip%22%3A%22114.93.241.21%22%2C%22height%22%3A%22896%22%2C%22width%22%3A%22414%22%2C%22system%22%3A%22other%22%2C%22browser%22%3A%22Unkonwn%22%2C%22type%22%3A%22IOS%22%7D%2C%22utm%22%3A%7B%7D%2C%22mark%22%3A%7B%22sourceType%22%3A%22DirectEntry%22%2C%22entranceTitle%22%3A%22%E5%BD%B1%E8%A7%86%E5%9F%BA%E5%9C%B0%22%2C%22entranceUrl%22%3A%22http%3A%2F%2F106.75.33.144%3A8085%2F%22%2C%22source%22%3A%22DirectEntry%22%7D%2C%22stays%22%3A%7B%7D%2C%22curFrequency%22%3A3%2C%22pageDepth%22%3A0%2C%22stayDuration%22%3A0%2C%22_id%22%3A%2261b011ed363ff973898a22d2%22%2C%22lasttime%22%3A%222021-12-08T01%3A44%3A34.757Z%22%2C%22channelId%22%3A%22caHA11%22%2C%22numberId%22%3A925%2C%22visitorId%22%3A%2261af1933363ff9738979e6b3%22%2C%22__v%22%3A0%7D%2C%22last%22%3A%7B%22time%22%3A1638928877258%2C%22source%22%3A%22DirectEntry%22%2C%22entranceUrl%22%3A%22http%3A%2F%2F106.75.33.144%3A8085%2F%22%2C%22entranceTitle%22%3A%22%E5%BD%B1%E8%A7%86%E5%9F%BA%E5%9C%B0%22%2C%22keyWord%22%3Anull%7D%2C%22visitormarkId%22%3A%2261b011ed363ff973898a22d2%22%2C%22visitorId%22%3A%2261af1933363ff9738979e6b3%22%2C%22lastTime%22%3A1638928931682%7D
对比上面的发现多了这种类型的Cookie mh_0.8103039258319902=12345;
中途想寻求钉钉那边的帮助但是没有联系到人。。。。遂作罢。
用postman本地模仿请求本地,确定就是Cookie的问题,以开始以为是长度的问题,因为去掉一个mh_0.8103039258319902=12345; 就可以访问了,但是后来水哥测试发现不删除Cookie个数的情况下:mh_0.8103039258319902=12345; 替换成mh_0=12;个数不变的情况下你改变长度是访问异常的;所以最终确定是Cookie长度的问题。我做了如下尝试:
Nginx 直接过滤掉Cookie发现域名访问正常
一时间代码里面不知道怎么改。兄弟们,这个时候他妈的只会是Tomcat容器的问题,不会是别的问题的,直接去看tomcat关于Cookie个数相关的参数,我发现了这个参数:maxCookieCount

引用博客
这个时候去找springboot的相关的配置,发现tomcat没有配置这个参数的入口
server:
tomcat:
max-http-header-size: 16000
uri-encoding: UTF-8
max-http-header-size: 16000
那就只能去重写tomcat了:
package com.leshu.common.config;
import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;
@Component
public class MyTomcatWebServerCustomizer implements WebServerFactoryCustomizer {
@Value("${server.maxCookieCount}")
private Integer maxCookieCount;
@Value("${server.maxHttpHeaderSize}")
private Integer maxHttpHeaderSize;
@Override
public void customize(TomcatServletWebServerFactory factory) {
factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
// connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}");
// connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}");
// connector.setScheme("http");
connector.setMaxCookieCount(maxCookieCount);
Http11NioProtocol protocol = (Http11NioProtocol)
connector.getProtocolHandler();
// 设置最大缓冲区
protocol.setMaxHttpHeaderSize(maxHttpHeaderSize);
}
});
}
}
本地postman加上超长cookie模仿,发现测试通过,部署到测试服务器,发现正常。就这样,最终还是没找到这个cookie产生的原因,fuck!