隐藏直接访问JSP页面,但是如何访问目标页面?

时间:2010-09-16 23:26:03

标签: java jsp servlets hide

下面的URL,所选答案中的第一个内容描述了JSP隐藏。

Hidden features of 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映射到web.xml(DD)中的servlet类Register

针对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可以访问它。 这意味着我需要创建用于转发请求的servlet。

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,我必须创建另一个servlet 只是为了进入登录页面目的 ???

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 个答案:

答案 0 :(得分:4)

你有一个Servlet在doPost()方法中执行登录任务吗?你可以向它添加必要的doGet() :)

顺便说一句,我只会将Register servlet映射到url-pattern这样的/register,以便您可以在<a href="/register">中使用它(将调用{ {1}}方法)和doGet()(将调用<form action="/register" method="post">方法),而不需要两个servlet映射。

为了更进一步,您可以将这一切重构为一个servlet,该servlet根据请求URL采取相应的操作。如您所见,有一些代码重复可以被抽象掉。通常,这是由Struts2,Spring-MVC,JSF2等MVC框架完成的,但您也可以自己创建一个基本框架。更多详细信息和代码示例可以在this answer中找到。

答案 1 :(得分:1)

是的,这是正确的。通常,使用框架(如struts或spring)会更容易。