从@WebServlet urlPattern中删除开始的“ /”会导致所有Servlet上出现404]]

问题描述 投票:1回答:1

我遇到一个问题,我有3个servlet,一个控制主页,一个控制登录过程,以及一个在用户成功登录后控制页面的小servlet。

HomeServlet:

package com.example;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.RequestDispatcher;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns="")
public class HomeServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("index.jsp");
        requestDispatcher.forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        RequestDispatcher requestDispatcher = this.getServletContext().getNamedDispatcher("com.example.LoginServlet");
        requestDispatcher.forward(request, response);
    }
}

LoginServlet:

package com.example;

import java.io.PrintWriter;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.RequestDispatcher;
import javax.servlet.annotation.WebServlet;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns={"/login"},
            initParams={
                @WebInitParam(name="username", value="admin"),
                @WebInitParam(name="password", value="admin")
            })
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        String correctUsername = this.getServletConfig().getInitParameter("username");
        String correctPassword = this.getServletConfig().getInitParameter("password");

        if (username.equals(correctUsername) && password.equals(correctPassword)) {
            Cookie loginCookie = new Cookie("username", username);

            loginCookie.setMaxAge(30 * 60);
            response.addCookie(loginCookie);
            response.sendRedirect("login-success.html");
        } else {
            PrintWriter out = response.getWriter();
            out.println("<font color=red>Either username or password is wrong.</font>");

            RequestDispatcher requestDispatcher = request.getRequestDispatcher("index.jsp");
            requestDispatcher.include(request, response);
        }
    }
}

LoginSuccessServlet

package com.example;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.RequestDispatcher;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns={"/login-success.html"})
public class LoginSuccessServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        String username = null;
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie: cookies) {
           if (cookie.getName().equals("username")) {
              username = cookie.getValue();
           }
        }

        if (username == null) {
            response.sendRedirect("login");
        } else {
            RequestDispatcher requestDispatcher = this.getServletContext().getNamedDispatcher("default");
            requestDispatcher.forward(request, response);
        }
    }
}

目前,这3个servlet均正常工作,但是例如,如果我要将LoginSuccessServlet的urlPattern从“ /login-success.html”更改为“ login-success.html”。从字面上看,我尝试访问的每个路径都会给我一个404错误。例如,在进行更改之前,加载Web应用程序后,HomeServlet将加载“ index.jsp”,更改之后,我无法直接访问index.jsp(它不在WEB-INF中),也无法使用HomeServlet或LoginServlet。我也无法访问“ login-success.html”,该文件也不位于WEB-INF中。

从我对Servlet中的URL模式的了解(可能是错误的,如果我做出了错误的假设,请更正我)

  1. 空URL模式(例如:“”,应该只映射到上下文根。
  2. LoginServlet的URL模式映射到/ contextroot / login
  3. LoginSuccessServlet的URL模式映射到/contextroot/login-success.html
  4. 我真的可以在这方面使用帮助,因为我一直在试图弄清楚为什么从1个servlet中删除“ /”会影响我尝试访问的单个servlet /文件。

我遇到一个问题,我有3个servlet,一个控制主页,一个控制登录过程,一个在用户成功登录后控制页面的HomeServlet:...

java http url servlets
1个回答
0
投票

例如,如果要更改LoginSuccessServlet的urlPattern 从“ /login-success.html”到“ login-success.html”。从字面上看 我尝试访问的单个路径给我一个404错误。

© www.soinside.com 2019 - 2024. All rights reserved.