<?xml version="1.0" encoding="UTF-8"?>
<web-app>
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
     <session-config>
        <session-timeout>3</session-timeout>
    </session-config>
</web-app>
package br.com.caelum.tarefas.action;
import br.com.caelum.tarefas.dao.UsuarioDAO;
import br.com.caelum.tarefas.model.Usuario;
import com.opensymphony.xwork2.ActionContext;
public class LoginAction {
    private Usuario usuario;
    public String execute() {
        if (new UsuarioDAO().existe(usuario)) {
            ActionContext.getContext().getSession()
                    .put("usuarioLogado", usuario);
            return "menu";
        } else {
            return "formulario-login";
        }
    }
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
    public Usuario getUsuario() {
        return usuario;
    }
}
package br.com.caelum.tarefas.model;
public class Usuario {
    private String login;
    private String senha;
    public Usuario(String login, String senha) {
        this.login = login;
        this.senha = senha;
    }
    public String getLogin() {
        return login;
    }
    public void setLogin(String login) {
        this.login = login;
    }
    public String getSenha() {
        return senha;
    }
    public void setSenha(String senha) {
        this.senha = senha;
    }
}
package br.com.caelum.tarefas.dao;
import java.util.ArrayList;
import java.util.List;
import br.com.caelum.tarefas.model.Usuario;
public class UsuarioDAO {
     private static final List<Usuario> USUARIOS = new ArrayList<Usuario>();
     static {
         USUARIOS.add(new Usuario("admin", "complexo"));
         USUARIOS.add(new Usuario("guilherme", "silveira"));
     }
     public void adiciona(Usuario usuario) {
         USUARIOS.add(usuario);
     }
     public boolean existe(Usuario procura) {
         for(Usuario usuario : USUARIOS) {
             if(usuario.getLogin().equals(procura.getLogin()) &&
                     usuario.getSenha().equals(procura.getSenha())) {
                 return true;
             }
         }
         return false;
     }
}
formulario-login.jsp dentro de WebContent/WEB-INF/content
<html>
<body>
    <h2>Página de Login das Tarefas</h2>
    <form action="login" method="post">
        Login: <input type="text" name="usuario.login" /> <br /> 
        Senha: <input type="password" name="usuario.senha" /> <br /> 
        <input type="submit" value="Entrar nas tarefas" />
    </form>
</body>
</htm>
menu.jsp em WebContent/WEB-INF/content
<html>
<body>
    <h2>Página inicial da Lista de Tarefas</h2>
    <p>Bem vindo, ${usuarioLogado.login}</p>
    <a href="listaTarefas">Clique aqui</a> para acessar a lista de tarefas
</body>
</html>