Скрыть страницу JSP от прямого доступа, но как получить доступ к целевой странице? - PullRequest
5 голосов
/ 17 сентября 2010

URL-адрес ниже, первый контент в выбранном ответе описывает скрытие JSP.

Скрытые функции JSP / Servlet

Я до сих пор понимаю, что могу поместить файлы jsp в каталог / WEB-INF. Так что это предотвращает прямой доступ пользователя, например http://test.com/WEB-INF/register.jsp (возврат 404)

Я думал, что понимаю, но нет, и хочу описать лучше, поэтому я раскрываю вопрос здесь.

У меня есть, скажем, 2 jsp файла, как показано ниже.

WebApps / ROOT / home.jsp

WebApps / ROOT / WEB-INF / register.jsp

ПРИМЕЧАНИЕ: /go_register сопоставлен с классом сервлета Register в web.xml (DD)

home.jsp

<html>
<body>
  <a href="/go_register">Go to register.jsp</a>
<body>
</html>

register.jsp

<html>
<body>
  <form method="post" action="/process_register">
  <input type="submit">
</form>
<body>
</html>

Итак ... поскольку register.jsp находится в / WEB-INF /, только RequestDispatcher может получить к нему доступ. Это означает, что мне нужно создать сервлет для пересылки запроса.

public class Register extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String address = "/WEB-INF/register.jsp";
        request.getRequestDispatcher(address).forward(request, response);
    }
}

Но это выглядит не так. Если я хочу добавить страницу входа /WEB-INF/login.jsp в home.jsp , чтобы получить доступ к login.jsp, мне нужно создать еще один сервлет только для того, чтобы перейти на страницу входа в систему ???

public class Login extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String address = "/WEB-INF/login.jsp";
        request.getRequestDispatcher(address).forward(request, response);
    }
}

Я думаю, что использую технику неправильно. Может кто-нибудь объяснить, как использовать этот JSP сокрытие?

Ответы [ 2 ]

4 голосов
/ 17 сентября 2010

У вас есть сервлет, который выполняет задачу входа в метод doPost()? Вы можете просто добавить необходимые doGet() к нему :)

Кстати, я бы просто отобразил сервлет Register на один url-pattern, например /register, чтобы вы могли использовать его как в <a href="/register"> (который вызовет метод doGet()), так и в <form action="/register" method="post"> (который вызовет метод doPost()) без необходимости в двух отображениях сервлетов.

Чтобы продвинуться дальше, вы можете реорганизовать все это в один сервлет, который выполняет действия соответственно на основании URL-адреса запроса. Как видите, есть некоторое повторение кода, которое можно абстрагировать. Обычно это делается с помощью инфраструктуры MVC, такой как Struts2, Spring-MVC, JSF2 и т. Д., Но вы также можете создать базовую версию самостоятельно. Более подробную информацию и примеры кода можно найти в этом ответе .

1 голос
/ 17 сентября 2010

Да, это правильно.Обычно легче использовать каркас, например распорки или пружины.

...