Session com Struts 2, alguém pode explicar realmente como funciona?

Pessoal boa noite, desculpe o título do tópico, o que acontece e que fiz um sistema de login com struts 2 e hibernate 3. Bom tudo esta funcionando , menos a sessão, preciso registar a sessao com um objeto usuario e obter ela nas outras páginas.
Pesquisei muito e achei algumas dicas, mas coisas picadas, nada que conseguisse implementar. Li sobre SessionAware, os interceptors do struts 2 e gostaria de uma ajuda se possível.

Gostaria de saber como crio a sessão usando SessionAware, recupero e intercepto ela somente nas páginas que quero.

Tenho minha classe locar que extende a ActionSupport e nela valido o usuario vejam:

public class Loga extends ActionSupport {
    private String nome;
    private String senha;

    public String execute() {
        validate();

        Usuario user = new Usuario();
        user.setUsuario(getNome());
        user.setSenha(getSenha());

        if (user.ValidaUsuario() == true) {
            //aqui devo registrar a sessao
            
            //-----
            addActionMessage("Login efetuado");
            return "success";
        } else {
            addActionError("Usuário ou senha inválido");
            return "error";
        }
    }
...

Abraços

Dae blz,

Gravar a session

package tutorial;
   
 import java.util.Map;  
 import org.apache.struts2.interceptor.SessionAware;  
 import com.opensymphony.xwork2.ActionSupport;  
   
 public class Login extends ActionSupport implements SessionAware{  
       
     private Usuario usuario;      
     private Map session;  
       
     private static final long serialVersionUID = 1L;  
   
     public Usuario getUsuario() {  
         return usuario;  
     }  
   
     public void setUsuario(Usuario usuario) {  
         this.usuario = usuario;  
     }  
   
     public Map getSession() {  
         return session;  
     }  
   
     public void setSession(Map session) {         
         this .session = session;  
     }  
       
     @Override  
     public String execute() {  
         session.put("usuario",usuario);  
         return SUCCESS;  
     }      
   
 }  

Criar o Interceptor
http://www.vitarara.org/cms/struts_2_cookbook/creating_a_login_interceptor

Opa mauricio bom esta dando certo, arrumei um problema e criei outro hauhaaa.
Está funcionando agora, redirecionando para a página de login, mas agora a validação do formulario não funciona, e não está recebendo os valores dos campos do formulario:

veja como fiz:

gravei a session:

public class Loga extends ActionSupport implements SessionAware,DisableLogin{
    Map session;
    private String nome;
    private String senha;

    public String execute() {
        validate();

        Usuario user = new Usuario();
        user.setUsuario(getNome());
        user.setSenha(getSenha());

        if (user.ValidaUsuario() == true) {
            //grava usuario na session
            session.put("user",user);

criei o interceptor para o login:

[code]
public class LoginInterceptor implements SessionAware,Interceptor{
private Map session;

public void setSession(Map session) {
    this.session = session;
}

public void destroy() {
}

public void init() {
}

public String intercept(ActionInvocation invocation) throws Exception {
    Action action = (Action) invocation.getAction();
    
    if(action instanceof DisableLogin) {
        return invocation.invoke();
    }else{
        ActionContext ac = null;
        Usuario user = (Usuario) ac.getContext().getSession().get("user");

        if(user == null){
           return "login";
        }
    }
    return invocation.invoke();
}

}[/code]

coloquei ele no struts.xml:


        <interceptors>
            <interceptor name="login" class="interceptors.LoginInterceptor" />
            <interceptor-stack name="loginStack">   
                <interceptor-ref name="login" />
            </interceptor-stack>  
        </interceptors>
        
        <default-interceptor-ref name="login"/>  

Abraços

Dae blz,

Eu acho que como o teu interceptor é default ele funciona para o login tb :slight_smile:
não pode deixar ele executar no seu login.

Sds,

Opa, no login eu desabilito usando:

public class Loga extends ActionSupport implements SessionAware,DisableLogin{

toda classe que implementa DisableLogin não é verificado login.

abraços

Opa consegui fazendo assim:

        <interceptors>
            <interceptor name="login" class="interceptors.LoginInterceptor" />
            <interceptor-stack name="loginStack">   
                <interceptor-ref name="servlet-config" />   
                <interceptor-ref name="params" />   
                <interceptor-ref name="login" />   
                <interceptor-ref name="prepare" />   
                <interceptor-ref name="chain" />   
                <interceptor-ref name="model-driven" />   
                <interceptor-ref name="fileUpload" />   
                <interceptor-ref name="static-params" />   
                <interceptor-ref name="params" />   
                <interceptor-ref name="conversionError" />   
                <interceptor-ref name="validation" />   
                <interceptor-ref name="workflow" />  
            </interceptor-stack>  
        </interceptors>
        
       <default-interceptor-ref name="loginStack"/>

Não sei se é o correto mas foi o que achei pesquisando na web.

So tem mais um problema, como bloqueio acesso aos JSP?

Obrigado pela ajuda, pra gente como eu que está começando agora com Java e web não é facil :roll: muitos conceitos a estudar, mas devagar chegamos la.
Abraços

[Editado]
Para bloquear o jsp coloca eles na pasta WEB_INF ou coloca no web.xml

<security-constraint>

<display-name>

Bloqueio  a acesso direto as paginas JSP.

</display-name>

<web-resource-collection>

<web-resource-name>Raw-JSF-JSP-Pages</web-resource-name>

<!-- Add url-pattern for EACH raw JSP page -->

<url-pattern>*jsp</url-pattern>

</web-resource-collection>

<auth-constraint>

<description>Sem regras, Apenas bloqueio  acesso direto</description>

</auth-constraint>

</security-constraint>

</web-app>

só tem liga no teu index.jsp com o redirecionamento para action…coloca index.html que funciona

O erro da validação so da quando usa o interceptor, esta solução ai foi postada inclusive por outros usuários aqui do fórum, e foi o que achei na web.
Agora so tenho que saber como bloquear acesso aos jsp.

Mais um detalhe: estou usando:

ActionContext.getContext().getSession().clear();

para limpar a sessão. Funciona mas está correto isso?

abraços