【问题标题】:Servlet gets request twiceServlet 两次获取请求
【发布时间】:2017-09-23 17:17:35
【问题描述】:

我无法具体说明问题,但有时,当我启动码头服务器时,我的登录 servlet 会收到两次 GET 请求。

发生这种情况时,登录页面也因此无法获取 css

"资源被解释为样式表,但以 MIME 类型传输 文本/html”。

我知道的是,当我禁用过滤器 servlet 时,一切正常。

这是我向服务器添加东西的方法:

    UserService userService = new UserService();
    CharactersService charactersService = new CharactersService();
    SessionsService sessionsService = new SessionsService();

    Server server = new Server(8080);

    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
    context.addServlet(new ServletHolder(new LoginServlet(userService, charactersService, sessionsService)), "/login");
    context.addServlet(new ServletHolder(new MainMenuServlet(sessionsService)), "/main");
    context.addServlet(new ServletHolder(new DuelServlet(userService)), "/duel");
    context.addServlet(new ServletHolder(new FightServlet(charactersService, sessionsService, userService)),"/duel/fight");

    context.setContextPath("/");
    context.setBaseResource(Resource.newResource("src/main/resources"));

    server.setHandler(context);

    ServletHolder defaultHolder = new ServletHolder("default", new DefaultServlet());
    defaultHolder.setInitParameter("dirAllowed", "true");
    context.addServlet(defaultHolder, "/");

    context.addFilter(new FilterHolder(new AuthenticationFilter()), "/*", EnumSet.of(DispatcherType.REQUEST));

    server.start();
    server.join();

如果我启动我的服务器并看到登录页面被调用了两次并且没有加载 css,我使用 addFilter() 方法注释行,启动服务器,关闭它,取消注释,再次启动它并且登录页面加载就好了,这很奇怪。

我将所有内容添加到服务器的方式是否有问题,或者什至可能导致这种行为?

过滤servlet代码:

public class AuthenticationFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse resp = (HttpServletResponse) response;

    String uri = req.getRequestURI();

    HttpSession session = req.getSession(false);

    if (session == null && !uri.equals("/login")) {
        resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        resp.sendRedirect("/login");
    } else if (session != null && uri.equals("/login")) {
        resp.setStatus(HttpServletResponse.SC_OK);
        resp.sendRedirect("/main");
    } else {
        chain.doFilter(request, response);
    }
}

@Override
public void destroy() {}
}

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    我认为您不是在静态上下文(静态方法/块)中编写服务器创建逻辑。

    因此,对于每个请求,都会创建一个新服务器。这会产生 2 个请求。

    这里是example 以静态方法创建服务器。

    【讨论】:

    • 服务器创建在 main() 方法中,所以它是静态的。并且只登录 servlet 获取两次请求,其他 servlet 工作正常。问题似乎出在过滤器中,因为当我不添加过滤器登录 servlet 时,它总是可以正常工作。
    • 好的,添加你的 web.xml 映射文件。此外,对于每个页面请求,您都会遇到此问题。还是第一次重新加载页面会出现这个问题?
    • 我真的没有web.xml,我认为它是可选的,不是吗?
    • 从过滤器中删除 chain.doFilter(request, response); 并检查输出。看起来该代码正在调用相同的过滤器。
    • 如果我完全删除它,那么没有 servlet 响应任何请求
    猜你喜欢
    • 1970-01-01
    • 2022-07-21
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多