invalid domain [10.230.90.11:2025] was specified for this cookie异常原因分析
概略:这个原因是因为,服务端在Cookie里设置了domain,然后tomcat本身校验cookieValue时,domain里出现了非法参数,导致抛出异常
问题描述:
前端发送请求时,服务在接口里手动设置Cookie的domain参数,然后把cookie设置HttpServletResponse。报“invalid domain [10.230.90.11:2025] was specified for this cookie”异常。
问题分析:
本地调试访问localhost:8080或者gateway经过nacos负载均衡转发请求到某一台实例时,请求地址变成ip:port。tomcat本身Rfc6265CookieProcessor方法会对cookie校验,合法的参数仅允许:[0,9]&&[a,z]&&[A,Z]&&[.,-],冒号属于非法字符,所以校验不通过。
Rfc6265CookieProcessor源码:
private void validateDomain(String domain) {int i = 0;int prev = true;int cur = -1;for(char[] chars = domain.toCharArray(); i < chars.length; ++i) {int prev = cur;cur = chars[i];if (!domainValid.get(cur)) {throw new IllegalArgumentException(sm.getString("rfc6265CookieProcessor.invalidDomain", new Object[]{domain}));}if ((prev == 46 || prev == -1) && (cur == 46 || cur == 45)) {throw new IllegalArgumentException(sm.getString("rfc6265CookieProcessor.invalidDomain", new Object[]{domain}));}if (prev == 45 && cur == 46) {throw new IllegalArgumentException(sm.getString("rfc6265CookieProcessor.invalidDomain", new Object[]{domain}));}}if (cur == 46 || cur == 45) {throw new IllegalArgumentException(sm.getString("rfc6265CookieProcessor.invalidDomain", new Object[]{domain}));}}static {char c;for(c = '0'; c <= '9'; ++c) {domainValid.set(c);}for(c = 'a'; c <= 'z'; ++c) {domainValid.set(c);}for(c = 'A'; c <= 'Z'; ++c) {domainValid.set(c);}domainValid.set(46);domainValid.set(45);}
解决方法:
如果使用gateway网关,则可以配置:PreserveHostHeader过滤器,作用是保持原有请求信息,这样服务端就能拿到原始域名。