Проблема, когда Веб приложение закрывает сеанс java используя ejb + jsf?

Я использую Glassfish server 4.1.1, java EE7 Веб, jdk 1.8 и jsf 2.2 Главный экран app:

introducir la descripción de la imagen aquí

Потом я даю клик во ввождении информацию в компьютер, пишу верительные грамоты, ввожу информацию в компьютер и инициализируй сеанс, как он появляется в следующем изображении

introducir la descripción de la imagen aquí

Но дав клик в соединении того, чтобы выходить, он дает мне следующую ошибку.

Это ошибка

ФАТАЛЬНЫЙ: JSF1073: он был перехвачен javax.faces.view.facelets. TagAttributeException в течение обработки RENDER_RESPONSE 6: UIComponent-ClientId =, Сообщение =/templates/menu_todos.xhtml @10,48 тест = "# {! homeController.logueado () }"/templates/menu_todos.xhtml @10,48 тест = "# {! homeController.logueado () } ": java.lang. ФАТАЛЬНЫЙ NullPointerException:/templates/menu_todos.xhtml @10,48 тест = "# {! homeController.logueado () }"/templates/menu_todos.xhtml @10,48 тест = "# {! homeController.logueado () } ": java.lang. NullPointerException javax.faces.view.facelets. TagAttributeException:/templates/menu_todos.xhtml @10,48 тест = "# {! homeController.logueado () }"/templates/menu_todos.xhtml @10,48 тест = "# {! homeController.logueado () } ": java.lang. NullPointerException at com.sun.faces.facelets.tag. TagAttributeImpl.getObject (TagAttributeImpl.java:358) at com.sun.faces.facelets.tag. TagAttributeImpl.getBoolean (TagAttributeImpl.java:150) at com.sun.faces.facelets.tag.jstl.core. IfHandler.apply (IfHandler.java:91) at javax.faces.view.facelets. CompositeFaceletHandler.apply (CompositeFaceletHandler.java:95) at com.sun.faces.facelets.tag.ui. CompositionHandler.apply (CompositionHandler.java:194) at com.sun.faces.facelets.compiler. NamespaceHandler.apply (NamespaceHandler.java:93) at com.sun.faces.facelets.compiler. EncodingHandler.apply (EncodingHandler.java:87) at com.sun.faces.facelets.impl. DefaultFacelet.include (DefaultFacelet.java:312) at com.sun.faces.facelets.impl. DefaultFacelet.include (DefaultFacelet.java:371) at com.sun.faces.facelets.impl. DefaultFacelet.include (DefaultFacelet.java:350) at com.sun.faces.facelets.impl. DefaultFaceletContext.includeFacelet (DefaultFaceletContext.java:199) at com.sun.faces.facelets.tag.ui. IncludeHandler.apply (IncludeHandler.java:124) at javax.faces.view.facelets. CompositeFaceletHandler.apply (CompositeFaceletHandler.java:95) at javax.faces.view.facelets. DelegatingMetaTagHandler.applyNextHandler (DelegatingMetaTagHandler.java:137) at com.sun.faces.facelets.tag.jsf. ComponentTagHandlerDelegateImpl.apply (ComponentTagHandlerDelegateImpl.java:202) at javax.faces.view.facelets. DelegatingMetaTagHandler.apply (DelegatingMetaTagHandler.java:120) at javax.faces.view.facelets. CompositeFaceletHandler.apply (CompositeFaceletHandler.java:95) at com.sun.faces.facelets.compiler. NamespaceHandler.apply (NamespaceHandler.java:93) at com.sun.faces.facelets.compiler. EncodingHandler.apply (EncodingHandler.java:87) at com.sun.faces.facelets.impl. DefaultFacelet.include (DefaultFacelet.java:312) at com.sun.faces.facelets.impl. DefaultFacelet.include (DefaultFacelet.java:371) at com.sun.faces.facelets.impl. DefaultFacelet.include (DefaultFacelet.java:350) at com.sun.faces.facelets.impl. DefaultFaceletContext.includeFacelet (DefaultFaceletContext.java:199) at com.sun.faces.facelets.tag.ui. CompositionHandler.apply (CompositionHandler.java:174) at com.sun.faces.facelets.compiler. NamespaceHandler.apply (NamespaceHandler.java:93) at com.sun.faces.facelets.compiler. EncodingHandler.apply (EncodingHandler.java:87) at com.sun.faces.facelets.impl. DefaultFacelet.apply (DefaultFacelet.java:161) at com.sun.faces.application.view. FaceletViewHandlingStrategy.buildView (FaceletViewHandlingStrategy.java:1006) at com.sun.faces.lifecycle. RenderResponsePhase.execute (RenderResponsePhase.java:99) at com.sun.faces.lifecycle. Phase.doPhase (Phase.java:101) at com.sun.faces.lifecycle. LifecycleImpl.render (LifecycleImpl.java:219) at javax.faces.webapp. FacesServlet.service (FacesServlet.java:659) at org.apache.catalina.core. StandardWrapper.service (StandardWrapper.java:1682) at org.apache.catalina.core. StandardWrapperValve.invoke (StandardWrapperValve.java:318) at org.apache.catalina.core. StandardContextValve.invoke (StandardContextValve.java:160) at org.apache.catalina.core. StandardPipeline.doInvoke (StandardPipeline.java:734) at org.apache.catalina.core. StandardPipeline.invoke (StandardPipeline.java:673) at com.sun.enterprise.web. WebPipeline.invoke (WebPipeline.java:99) at org.apache.catalina.core. StandardHostValve.invoke (StandardHostValve.java:174) at org.apache.catalina.connector. CoyoteAdapter.doService (CoyoteAdapter.java:416) at org.apache.catalina.connector. CoyoteAdapter.service (CoyoteAdapter.java:283) at com.sun.enterprise.v3.services.impl. ContainerMapper $HttpHandlerCallable.call (ContainerMapper.java:459) at com.sun.enterprise.v3.services.impl. ContainerMapper.service (ContainerMapper.java:167) at org.glassfish.grizzly.http.server. HttpHandler.runService (HttpHandler.java:206) at org.glassfish.grizzly.http.server. HttpHandler.doHandle (HttpHandler.java:180) at org.glassfish.grizzly.http.server. HttpServerFilter.handleRead (HttpServerFilter.java:235) at org.glassfish.grizzly.filterchain. ExecutorResolver$9.execute (ExecutorResolver.java:119) at org.glassfish.grizzly.filterchain. DefaultFilterChain.executeFilter (DefaultFilterChain.java:283) at org.glassfish.grizzly.filterchain. DefaultFilterChain.executeChainPart (DefaultFilterChain.java:200) at org.glassfish.grizzly.filterchain. DefaultFilterChain.execute (DefaultFilterChain.java:132) at org.glassfish.grizzly.filterchain. DefaultFilterChain.process (DefaultFilterChain.java:111) at org.glassfish.grizzly. ProcessorExecutor.execute (ProcessorExecutor.java:77) at org.glassfish.grizzly.nio.transport. TCPNIOTransport.fireIOEvent (TCPNIOTransport.java:536) at org.glassfish.grizzly.strategies. AbstractIOStrategy.fireIOEvent (AbstractIOStrategy.java:112) at org.glassfish.grizzly.strategies. WorkerThreadIOStrategy.run0 (WorkerThreadIOStrategy.java:117) at org.glassfish.grizzly.strategies. 100 WorkerThreadIOStrategy.access$ (WorkerThreadIOStrategy.java:56) at org.glassfish.grizzly.strategies. WorkerThreadIOStrategy $WorkerThreadRunnable.run (WorkerThreadIOStrategy.java:137) at org.glassfish.grizzly.threadpool. AbstractThreadPool $Worker.doWork (AbstractThreadPool.java:591) at org.glassfish.grizzly.threadpool. AbstractThreadPool $Worker.run (AbstractThreadPool.java:571) at java.lang. Thread.run (Thread.java:745) Caused by: javax.el. ELException:/templates/menu_todos.xhtml @10,48 тест = "# {! homeController.logueado () }": java.lang. NullPointerException at com.sun.faces.facelets.el. TagValueExpression.getValue (TagValueExpression.java:114) at com.sun.faces.facelets.tag. TagAttributeImpl.getObject (TagAttributeImpl.java:356)... 59 обитал Caused by: javax.el. ELException: java.lang. NullPointerException at javax.el. ELUtil.invokeMethod (ELUtil.java:336) at javax.el. BeanELResolver.invoke (BeanELResolver.java:537) at javax.el. CompositeELResolver.invoke (CompositeELResolver.java:256) at com.sun.el.parser. AstValue.getValue (AstValue.java:136) at com.sun.el.parser. AstValue.getValue (AstValue.java:204) at com.sun.el.parser. AstNot.getValue (AstNot.java:63) at com.sun.el. ValueExpressionImpl.getValue (ValueExpressionImpl.java:226) at org.jboss.weld.el. WeldValueExpression.getValue (WeldValueExpression.java:50) at com.sun.faces.facelets.el. TagValueExpression.getValue (TagValueExpression.java:109)... 60 обитал Caused by: java.lang. NullPointerException at miApp.controllers. SessionUtil.getUserLog (SessionUtil.java:36) at miApp.controllers. HomeController.logueado (HomeController.java:152) at sun.reflect. GeneratedMethodAccessor154.invoke (Ункнаун Соурсе) at sun.reflect. DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) at java.lang.reflect. Method.invoke (Method.java:497) at javax.el. ELUtil.invokeMethod (ELUtil.java:332)... 68 обитал

XHTML

<h3><h:outputText value="Menu Usuario" /></h3>

<c:if test="#{!homeController.logueado()}">        
    <h:form><h:commandLink action="#{homeController.login()}" value="Ingreso" /></h:form>
</c:if> 

<c:if test="#{homeController.logueado()}">
    <h:form><h:commandLink action="#{homeController.cambio_clave()}" value="Cambio Clave" /></h:form>
    <h:form><h:commandLink action="#{homeController.logout()}"  value="Salir"  /></h:form>
</c:if>

Драйвер:

package miApp.controllers;

import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.validation.constraints.Size;
import miApp.dao.UsuarioDAO;
import miApp.models.Usuario;
/**
 *
 * @author jgzamzam
 */
@ManagedBean
@Named(value = "homeController")
@SessionScoped
public class HomeController implements Serializable {
@EJB
private UsuarioDAO dao;

@Size(min=1, message="Debe ingresar un usuario")
private String usuario;

@Size(min=1, message="Debe ingresar un usuario")
private String clave;

@Size(min=1, message="Debe ingresar un usuario")
private String claveAct;

@Size(min=1, message="Debe ingresar un usuario")
private String claveNew;

@Size(min=1, message="Debe ingresar un usuario")
private String claveRep;

//+++Constructor de la Clase
public HomeController() {
}

//++++ Setters and Getters

public String getUsuario() {
    return usuario;
}

public void setUsuario(String usuario) {
    this.usuario = usuario;
}

public String getClave() {
    return clave;
}

public void setClave(String clave) {
    this.clave = clave;
}

public String getClaveAct() {
    return claveAct;
}

public void setClaveAct(String claveAct) {
    this.claveAct = claveAct;
}

public String getClaveNew() {
    return claveNew;
}

public void setClaveNew(String claveNew) {
    this.claveNew = claveNew;
}

public String getClaveRep() {
    return claveRep;
}

public void setClaveRep(String claveRep) {
    this.claveRep = claveRep;
}   


//++++Metodos del Bean
public String index(){
    return "/index";
}//++++Fin public String index

public String acercaDe(){
    return "/home/acerca_de";
}
//++++Fin public String acercaDe

public String login(){
    return "/home/login";
}
//++++Fin public String login

//++++Funcion Ingreso al Sistema
public String ingresar(){
    Usuario login = dao.getLogin(usuario, clave);

    //Si el login no es correcto se queda en la pagina actual
    if(login == null){
        SessionUtil.addErrorMessage("Usuario o Clave incorrecto");
        return null;
    }

    //Cierra la sesion y la crea con el nuevo usuario
    SessionUtil.closeSession();
    SessionUtil.addSession(login.getId(), login.getNombre(), login.getTipousuarioId().getId(), login.getTipousuarioId().getNombre());
    return "/index";
}//Fin String ingresar

public String logout(){
    SessionUtil.closeSession();
    return "/index";
}//Fin public String logout

public String cambio_clave(){
    return "/home/cambio_clave";
}//Fin public String cambio_clave

//Funcion para cambiar la clave del usuario
public String cambiarPWD(){
    //si la clave nueva y la repeticion no coinciden, ERROR
    if(!(claveNew.equals(claveRep))){
        SessionUtil.addErrorMessage("Las claves ingresadas no son identicas");
        return null;
    }

    //Recupera el usuario actual para conocer su clave
    Usuario current = dao.find(SessionUtil.getUserLog());
    String claveUsr = current.getClave();

    //La clave del ususario debe ser igual a la actual
    if(!(claveAct.equals(claveUsr))){
        SessionUtil.addErrorMessage("La clave actual no coincide con la de su usuario");
        return null;
    }

    current.setClave(claveNew);
    dao.edit(current);
    return "/index";    
}//Fin public String cambiarPWD

//Funcion que determina si hay un usuario logueado
public Boolean logueado(){
    Integer userLog = SessionUtil.getUserLog();
    return !(userLog == null);        
}

Полезный Session

package miApp.controllers;

import java.io.IOException;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

/**
 * @author jgzamzam
 */
public class SessionUtil {

//Se crean las variables de sesión
public static void addSession(Integer userId, String userNombre, Integer tipo, String userTipo){
    FacesContext context = FacesContext.getCurrentInstance();
    HttpSession sesion = (HttpSession)context.getExternalContext().getSession(true);
    sesion.setAttribute("userLog", userId);
    sesion.setAttribute("userNombre", userNombre);
    sesion.setAttribute("userTipoId", tipo);
    sesion.setAttribute("userTipo", userTipo);
}

//Se cierra la sesión
public static void closeSession(){
    ExternalContext ctx = FacesContext.getCurrentInstance().getExternalContext();
    ((HttpSession) ctx.getSession(false)).invalidate();
}

//Recupera el código del usuario logueado
public static Integer getUserLog(){
    FacesContext context = FacesContext.getCurrentInstance();
    HttpSession sesion = (HttpSession)context.getExternalContext().getSession(false);
    Integer userLog = (Integer)sesion.getAttribute("userLog");
    return userLog;
}
1
задан 26.01.2017, 20:54
0 ответов

Проблема состоит в том, что возвращать цепь в использованном методе как action покажет, что JSF выполнил forward в поле зрения, имя которого было возвращенной цепью. А именно:

public String metodoAction() {
    /* lógica de tu action... */
    return "/pagina.xhtml"; //<-- nombre de la vista a hacer forward
}

Так как ты делаешь forward, твой контейнер servlets/servidor приложений попробует повторно использовать элементы настоящего request, между ними сеанс, но твой сеанс остался объявленным недействительным выполнением Session#invalidate, то, что способствует тому, чтобы сеанс настоящего request (который используется, чтобы производить вид в forward) был null. Поэтому, NPE.

То, что ты должен делать, состоит в том, чтобы инициализировать новый request. Для этого, вместо того, чтобы делать forward то, что ты должен делать, он redireccionar в страницу. redirect показывает, что произведется новый цикл request/response для твоего приложения. Этот новый request будет присоединен с новым сеансом. Чтобы добиваться redirect с action в JSF, ты должен добавлять ?faces-redirect=true в конце цепи:

public String metodoAction() {
    /* lógica de tu action... */
    // nombre de la vista, con el parámetro JSF lo interpreta
    // para hacer un redirect (retornar código 303) y no un forward
    return "/pagina.xhtml?faces-redirect=true";
}

Концепции forward и redirect не являются свойственными JSF, принадлежат Java США. Ты можешь видеть объяснение различий здесь.


Добавочный в это, ты можешь улучшать приложение, разделив некие действия в request, где он должен бы быть. Например, завершение сеанса соответствует bean достижения больше request, так как bean с @ViewScoped или @SessionScoped они хранятся в сеансе (та, которую ты объявляешь недействительной, и которая может удалять сеанс и элементы, которые есть в ней).

1
ответ дан 03.12.2019, 17:29

Если пользователь не logueado, переменная userLog не в сеансе. Ты делаешь пробы Integer этой переменной, не подтверждая сначала, отличная ли она null, и поэтому отпусти исключение. Подтверди, что

sesion.getAttribute("userLog")!=null

перед

Integer userLog = (Integer)sesion.getAttribute("userLog");
0
ответ дан 03.12.2019, 17:29
  • 1
    Спасибо за интерес Пабло, издал вопрос, и как ты будешь видеть пользователь, если loguea заблаговременно и потом захотев получиться - проблема........ извинение, если talvez я не понимаю твой ответ, я новый в мире java!!!! –  26.01.2017, 21:02
  • 2
    Проблема, кажется, в котором не está сохраняя правильно стоимость " userLog" в sesió n, o твой DAO возвращает недействительную стоимость для login.getId (). Проверь эти две точки. –  26.01.2017, 21:05
  • 3
    Спасибо снова Пабло, это " userLog" уже я это подтвердил, и если он показывает мне целую стоимость у подножия pag (костлявая 1 или 2 или 3), как он был пользователем logueado........ это DAO, я не понимаю, который ты имеешь в виду, еще раз извини я новый в этом java –  26.01.2017, 21:25
  • 4
    Это не это, оно просто getExternalContext () .getSession (false) vuelve недействительно. Проблема не в casteo. (false гарантирует, что не creará новость sesió n но traerá существующая, если состоит в том, чтобы было), благосклонность видеть ответ, что publiqué. –  27.01.2017, 16:47

Проблема достаточно ясная в твоем log:

Caused by: java.lang. NullPointerException at miApp.controllers. SessionUtil.getUserLog (SessionUtil.java:36) at miApp.controllers. HomeController.logueado (HomeController.java:152)

Источник NullPointerException он встречается в твоем классе SessionUtil и он, потому что ты пробуешь получать один Session что уже не существует, так как ты только что закрыл сеанс и поэтому оно объявило ее недействительной в контексте. Это вызывает, что, сделав:

HttpSession sesion = (HttpSession)context.getExternalContext().getSession(false);
sesion.getAttribute("userLog");

Ты делаешь:

HttpSession sesion = (HttpSession)context.getExternalContext().getSession(false);
// sesion es nulo, aunque se castee a HttpSession
null.getAttribute("userLog");

Я предлагаю перед hace это тебе проверять, что сеанс отличается null:

if (sesion == null) {
    // Aquí va tu código
    sesion.getAttribute("userLog");
}else {
 return null;
}
0
ответ дан 03.12.2019, 17:29