2010-09-16 5 views
5

L'URL ci-dessous, le premier contenu de la réponse choisie, décrit le masquage JSP.Masquer la page JSP à partir d'un accès direct, mais comment accéder à la page cible?

Hidden features of JSP/Servlet

Je comprends si loin que je peux mettre des fichiers jsp sous/WEB-INF. Afin qu'il empêche un utilisateur d'un accès direct comme http://test.com/WEB-INF/register.jsp (retour 404)

Je pensais comprendre mais pas et veut mieux décrire donc j'ouvre la question ici.

J'ai, disons, 2 fichiers jsp comme ci-dessous.

webapps/ROOT/home.jsp

webapps/ROOT/WEB-INF/register.jsp

REMARQUE: /go_register est mis en correspondance avec la classe servlet Register dans 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> 

So .. depuis register.jsp réside dans/WEB-INF /, seul RequestDispatcher peut accéder. Cela signifie que j'ai besoin de créer une servlet pour transmettre la requête.

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); 
    } 
} 

Mais cela ne semble pas correct. Si je veux ajouter la page de connexion /WEB-INF/login.jsp à home.jsp, afin d'accéder au login.jsp, je dois créer une autre servlet juste pour aller à la page de connexion? ??

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); 
    } 
} 

Je pense que j'utilise la technique de la mauvaise façon. Quelqu'un pourrait-il expliquer comment utiliser ce jsp se cachant?

Répondre

4

Vous avez une servlet qui effectue la tâche de connexion dans la méthode doPost()? Vous pouvez simplement ajouter le doGet() nécessaire pour lui :)

Soit dit en passant, je qu'élaborer le servlet Register sur un seul url-pattern comme /register afin que vous puissiez l'utiliser dans les deux <a href="/register"> (qui appellera doGet() méthode) et <form action="/register" method="post"> (qui appellera la méthode doPost()) sans avoir besoin de deux mappages de servlet. Pour aller plus loin, vous pouvez refactoriser tout cela en une seule servlet qui agit en conséquence en fonction de l'URL de la requête. Comme vous le voyez, il y a une répétition de code qui peut être extraite. Normalement, ceci doit être fait par un framework MVC comme Struts2, Spring-MVC, JSF2, etcetera, mais vous pouvez aussi en créer un vous-même. Plus de détails et des exemples de code peuvent être trouvés dans this answer.

+0

Modèle de contrôleur frontal semble être la voie à suivre pour mes besoins. J'ai pensé centraliser le point d'entrée mais je n'ai jamais pensé à de tels modèles, merci pour le lien! –

1

Oui, c'est correct. Habituellement, il est plus facile d'utiliser un cadre, comme des entretoises ou le printemps.

+1

Je pense que l'utilisation de framework serait plus facile que tu l'as dit mais je n'utilise pas de framework alors j'ai besoin de quelque chose pour m'écrire, merci pour le conseil cependant. –

Questions connexes