vida una servlet que instancia entre diferencia clases ciclo java jsp java-ee servlets user-management

una - servlet java 8



¿Cómo puedo manejar/restringir el acceso del usuario a servlets & jsp''s? (1)

Actualmente estoy escribiendo una pequeña aplicación web dinámica en Java. Se supone que la aplicación es una plataforma de eventos donde puede crear una cuenta de usuario, iniciar sesión y luego puede ver todos los eventos abiertos (en una iteración posterior, los usuarios pueden crear / participar en esos eventos).

En este momento, la estructura de la aplicación web podría ser (simplificada) descrita así:

Register-Servlet -> Register.jsp | V Login-Servlet -> Login.jsp | V Main-page-Servlet -> Main.jsp

Entonces, ahora mismo, un usuario podría ir a Login.jsp, su información de inicio de sesión sería enviada al Servlet de Inicio de Sesión, que la validaría y luego la enviaría al Servlet de Página Principal. El servlet de la página principal luego (luego de validar el inicio de sesión nuevamente) obtiene todos los eventos actuales de una base de datos, los adjunta a la solicitud y los reenvía a Main.jsp, que los muestra para que los vea el usuario.

Ahora, si un usuario quiere acceder al Main.jsp directamente (sin proceder del Servlet de Página Principal), obviamente no puede mostrar los eventos disponibles. La solución que estoy usando actualmente es hacer una comprobación nula para ver si los eventos están ahí, y si no, redirigir al Servlet de Página Principal.

Me molesta resolver mi problema así, ya que no creo que sea la mejor práctica y creo que creará muchos otros problemas cuanto más grande sea mi aplicación.

Lo primero que pensé al respecto fue que podría ser útil si simplemente "ocultara" todos los .jsp del usuario, por lo que el usuario estaría aterrizando solo en servlets y no podría acceder al .jsp de una manera diferente.

¿Hay una manera de hacer eso? O, si no, ¿cuál sería la mejor solución si escribiera una aplicación profesional de nivel empresarial?


Esto se puede manejar en un Filter y hay una gran explicación y ejemplo en la wiki Servlet-Filter .

Adaptar el código allí para su problema (tenga en cuenta la adición y el uso del método needsAuthentication ):

@WebFilter("/*") public class LoginFilter implements Filter { @Override public void init(FilterConfig config) throws ServletException { // If you have any <init-param> in web.xml, then you could get them // here by config.getInitParameter("name") and assign it as field. } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; HttpSession session = request.getSession(false); String requestPath = httpServletRequest.getRequestURI(); if (needsAuthentication(requestPath) || session == null || session.getAttribute("user") == null) { // change "user" for the session attribute you have defined response.sendRedirect(request.getContextPath() + "/login"); // No logged-in user found, so redirect to login page. } else { chain.doFilter(req, res); // Logged-in user found, so just continue request. } } @Override public void destroy() { // If you have assigned any expensive resources as field of // this Filter class, then you could clean/close them here. } //basic validation of pages that do not require authentication private boolean needsAuthentication(String url) { String[] validNonAuthenticationUrls = { "Login.jsp", "Register.jsp" }; for(String validUrl : validNonAuthenticationUrls) { if (url.endsWith(validUrl)) { return false; } } return true; } }

Yo recomendaría mover todas las páginas que requieren autenticación dentro de una carpeta como app y luego cambiar el filtro web a

@WebFilter("/app/*")

De esta forma, puede eliminar el método needsAuthentication del filtro.