I'm running into an issue where I have 3 servlets, one that controls the home page, one that controls the login process, and one that controls the page if the user successfully logs in.
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);
}
}
}
As it stands right now, all 3 of the servlets work, but if I were to, for example, change LoginSuccessServlet's urlPattern from "/login-success.html" to "login-success.html". Literally every single path I try to access gives me a 404 error. For example, before making that change, upon loading up the web app, HomeServlet would load "index.jsp," after the change, I can't access index.jsp directly (it's not in WEB-INF), nor can I use HomeServlet or LoginServlet. I also can't access "login-success.html," which also isn't located in WEB-INF.
From what I understand about URL Patterns in Servlets (might be wrong, please correct me if I've made wrong assumptions)
- An empty URL pattern (e.g: ""), is supposed to only map to the context root.
- The URL Pattern for LoginServlet maps to /contextroot/login
- The URL pattern for LoginSuccessServlet maps to /contextroot/login-success.html
I could really use help with this because I've been trying to figure out why removing a "/" from 1 servlet would affect ever single servlet/file I'm trying to access.