使用idea启动tomcat自动打开游览器访问默认的index.jsp时,会过滤两次,并且一个使用ipv4,一个使用ipv6,之后使用游览器访问时就只剩下ipv6一种了,这是为什么

使用idea启动tomcat自动打开游览器访问默认的index.jsp时,会过滤两次,并且一个使用ipv4,一个使用ipv6,之后使用游览器访问时就只剩下ipv6一种了,这是为什么

晚上好🌙🌙🌙
本答案参考通义千问
这是一个常见的问题,涉及到Tomcat的配置和IDEA的运行机制。以下是问题的原因以及解决方案:
IDEA 自动启动浏览器的行为
localhost 和 127.0.0.1 同时访问应用,默认情况下会尝试两种协议(IPv4 和 IPv6),以确保兼容性。localhost),另一次是通过 IPv6 (::1)。过滤器的 /* 配置
/* 时,它会拦截所有请求路径,包括静态资源和动态页面。IPv6 的优先级
::1),而 IPv4 (127.0.0.1) 请求可能被忽略或仅保留最后一次。如果不需要对静态资源(如 index.jsp)进行过滤,可以在过滤器中添加条件判断,避免对静态资源的处理。
代码示例:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String servletPath = httpRequest.getServletPath();
// 排除静态资源路径
if (servletPath.startsWith("/static") || servletPath.equals("/index.jsp")) {
chain.doFilter(request, response); // 不过滤静态资源
return;
}
// 其他逻辑
System.out.println("Filtering request: " + servletPath);
chain.doFilter(request, response);
}
可以通过修改 Tomcat 的 server.xml 文件,限制绑定的地址,只允许使用 IPv4 或 IPv6。
步骤:
conf/server.xml 文件。<Connector> 部分,设置 address 属性为 127.0.0.1 或 ::1。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
address="127.0.0.1" />
Browser URL 字段,只使用 IPv4 或 IPv6 的地址。
http://127.0.0.1:8080/http://[::1]:8080/web.xml 中,可以通过 <filter-mapping> 的 dispatcher-types 来控制过滤器的触发范围。示例:
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
tcpdump 或 Wireshark)抓包,确认请求的来源和协议。通过以上方法,可以有效解决过滤器被触发两次的问题,并优化 Tomcat 的运行环境。