1

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)

  1. An empty URL pattern (e.g: ""), is supposed to only map to the context root.
  2. The URL Pattern for LoginServlet maps to /contextroot/login
  3. 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.

Slmy
  • 43
  • 4
  • Why do you want to change the `urlPattern` from `/login-success.html` to `login-success.html`? The later is not correct. – Arvind Kumar Avinash Jun 14 '20 at 17:47
  • It was more of an experiment, but since it broke everything I'm fairly curious as to why it's working that way. I'm not really looking for a practical answer but more of an explanation to help me understand servlets better. – Slmy Jun 14 '20 at 17:49

1 Answers1

0

Here is a good explanation on SO.

Or see the Servlet specification.

To your question "why removing a "/" from 1 servlet would affect ...": Because the specification say, that "All other strings are used for exact matches only". To match the root, it should start with "/". A mapping that doesn't start with "/" cannot match any URL.

mentallurg
  • 4,967
  • 5
  • 28
  • 36