Pergunta

Eu sou novo no Servlets e JSPs. Eu queria saber qual seria o melhor design para um problema de amostra para o qual estou tentando escrever código. Aqui vai -

Quero criar um site (www.example.com) que apenas lista o histórico de login de todos os usuários (não qualquer função que alguém deseja, mas apenas um exemplo para o bem de um).

Portanto, existem dois URLs aqui - /index.jsp e /login (vamos supor que todos os registros sejam feitos).

O index.jsp mostrará todos os logins anteriores para esse usuário. Mas, para isso, tenho que identificar se o usuário já está conectado ou não. Se o usuário já estiver conectado, eu mostro sua história, caso contrário, tenho que encaminhá -lo para a página de login automaticamente.

Eu já escrevi um cookie criptograficamente forte personalizado que me dirá se o usuário está conectado ou não. Portanto, se o cookie for enviado para mim, posso verificar se ele é autenticado ou se o cookie/sessão expirou ou não. Isso não é um problema.

O problema de design que tenho é esse - como deve ser chamada a classe Java para a autenticação? Eu uso tags JSP personalizadas para verificar isso e reescrever a página? Quero facilitar a aula para os meus desenvolvedores HTML usarem ao criar novas páginas. Qual é a melhor maneira de fazer isso?

Acho que minha pergunta tem mais a ver com o uso correto do código Java em JSPs e/ou pode ser bibliotecas de tags personalizadas. Por favor, sinta -se à vontade para continuar um discurso retórico que quiser :)

Obrigado pela leitura.

  • Vas
Foi útil?

Solução

Você pode usar um Filter por esta. Dessa forma, você pode manter a lógica de código em um único local sem a necessidade de copypaste desnecessariamente o mesmo código em todas as páginas JSP e também mantém o JSP bem roteiro-gratuitamente.

Em vez de reinventar a sessão criando um cookie, você também pode usar o java ee fornecido HttpSession API. Isso já é basicamente apoiado por um cookie e você pode armazenar objetos Java na sessão como atributos para que eles permaneçam disponíveis em toda a sessão do usuário.

No login, basta colocar o User objeto em HttpSession:

User user = userDAO.find(username, password);
if (user != null) {
    request.getSession().setAttribute("user", user);
} else {
    // Show error.
}

Para verificar se um usuário está conectado, use um Filter. Implementar o doFilter() Método da seguinte forma:

if (((HttpServletRequest) request).getSession().getAttribute("user") != null) {
    chain.doFilter(request, response); // User is logged in, just continue with request.
} else {
    ((HttpServletResponse) response).sendRedirect("login"); // Not logged in, redirect to login page.
}

e mapeá -lo em um url-pattern Curti /secured, /restricted, /users ou então. Coloque as páginas JSP a serem restritas na mesma pasta no WebContent.

Para fazer logou um usuário, basta removê -lo da sessão:

request.getSession().removeAttribute("user");

// Or, more drastically, invalidate the entire session:
request.getSession().invalidate();

Dito isto, o Java EE já fornece segurança declarativa (XML-Config), você pode encontrar um tutorial sobre isso aqui. Você pode usar isso, mas se deseja deixar seu aplicativo interceptar independentemente nos logins gerenciados pelo contêiner para, por exemplo, manter uma visão geral do histórico de login, ainda precisa criar um Filter. Por exemplo:

HttpServletRequest httpRequest = (HttpServletRequest) request;
UserPrincipal user = httpRequest.getUserPrincipal();
HttpSession session = httpRequest.getSession();
if (user != null && session.getAttribute("user") == null) {
    session.setAttribute("user", user);

    // First-time login. You can do your intercepting thing here.
}
chain.doFilter(request, response);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top