访问默认servlet,过滤器会生效两次

访问默认servlet,过滤器会生效两次

问题描述:

在访问默认servlet的时候,会创建两次请求对象,并且过滤器生效的日志会打印两次,这是为什么呢

相关截图:

图片描述
图片描述

相关代码:

public class firstFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
//        在tomcat启动时就已经完成了对过滤器的初始化,对象肯定也已经被实例化过了
//        servlet是在请求第一次被访问的时候初始化

//        过滤器对象在web应用启动时被创建且全局唯一
//        处理机制与servlet相同,采用单例多线程的处理机制
        System.out.println("FirstFilter已被初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器已生效");
        //将请求相应向后传递,被后续的Filter或者servlet进行处理
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
//        在web应用重启或者关闭的时候被销毁
        System.out.println("FirstFilter已被销毁");
    }
}

相关代码:

@WebFilter(filterName = "annotationFilter",urlPatterns = "/*")
public class AnnotationFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("注解形式过滤器已经初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("注解形式过滤器已经生效");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("注解形式过滤器已经销毁");
    }
}

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小蓝 2023-03-17 11:22:43

同学你好,从输出信息可以看出,是发送了两次请求导致的,并不是代码的问题。

可能是在浏览器输入完地址后,按了两次回车导致发送了两次请求。

祝学习愉快~

  • 提问者 qq_慕运维0194244 #1

    确认过了,一次

    2023-03-20 13:20:44
  • 同学你好,1、可能是因同学在启动时勾选了下图红框的选项,在服务器启动时默认访问根目录,就是在浏览器自动输入的这个路径,从而导致浏览器发出了两次请求,并且路径都是一样的,所以出现过滤器生效两次的效果。

    https://img1.sycdn.imooc.com//climg/641803d609a5f78e10730685.jpg

    2、如果是上方的原因,则同学可以去除该选项试一下。或者刷新页面查看有几遍过滤器的输出语句,如果只有一遍则代表过滤器代码是正确的。

    3、如果不是上方原因,也有可能是浏览器默认访问favicon.ico。因favicon.ico是网页的标志图片,有些浏览器会默认在根目录下找这个图片。

    祝学习愉快!

    2023-03-20 15:03:41
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师