Java 从HttpSessionListener获取SessionScoped bean?

Java 从HttpSessionListener获取SessionScoped bean?,java,jsf,jsf-2,httpsession,servlet-listeners,Java,Jsf,Jsf 2,Httpsession,Servlet Listeners,嘿,伙计们。我试图在HttpSessionListener中获取会话bean,这样当用户注销或会话过期时,我就可以删除用户在应用程序中创建的一些文件。我猜会话bean不存在,因为会话被破坏了。我还希望能以某种方式删除这些文件。谢谢你的帮助 @WebListener public class SessionListener implements HttpSessionListener { @Override public void sessionCr

嘿,伙计们。我试图在HttpSessionListener中获取会话bean,这样当用户注销或会话过期时,我就可以删除用户在应用程序中创建的一些文件。我猜会话bean不存在,因为会话被破坏了。我还希望能以某种方式删除这些文件。谢谢你的帮助

   @WebListener
    public class SessionListener implements HttpSessionListener {

        @Override
        public void sessionCreated(HttpSessionEvent se) {
            HttpSession session = se.getSession();
            System.out.print(getTime() + " (session) Created:");
            System.out.println("ID=" + session.getId() + " MaxInactiveInterval="
                    + session.getMaxInactiveInterval());
        }

        @Override
        public void sessionDestroyed(HttpSessionEvent se) {
            HttpSession session = se.getSession();

            FacesContext context = FacesContext.getCurrentInstance();
            //UserSessionBean userSessionBean = (UserSessionBean) context.getApplication().evaluateExpressionGet(context, "#{userSessionBean}", UserSessionBean.class)
            UserSessionBean userSessionBean = (UserSessionBean) session.getAttribute("userSessionBean");

            System.out.println(session.getId());
            System.out.println("File size :" + userSessionBean.getFileList().size());

            for (File file : userSessionBean.getFileList()) {
                file.delete();
            }
        } 
    }
巴卢斯克:我又回到了你之前想的方法。在我的应用程序中,将字节流式传输给用户是不灵活的。我发现我需要在页面上用ajax做很多事情,如果我必须发送一个非ajax请求以流式传输要下载的文件,这是不可能的。这样,繁重的工作通过ajax调用(生成文档)完成,而快速简单的工作可以通过非ajax调用完成

   @ManagedBean(name = "userSessionBean")
@SessionScoped
public class UserSessionBean implements Serializable, HttpSessionBindingListener {

    final Logger logger = LoggerFactory.getLogger(UserSessionBean.class);
    @Inject
    private User currentUser;
    @EJB
    UserService userService;
    private List<File> fileList;

    public UserSessionBean() {

        fileList = new ArrayList<File>();
    }

    @PostConstruct
    public void onLoad() {

        Principal principal = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
        String email = principal.getName();

        if (email != null) {
            currentUser = userService.findUserbyEmail(email);
        } else {

            logger.error("Couldn't find user information from login!");
        }
    }

    public User getCurrentUser() {
        return currentUser;
    }

    public void setCurrentUser(User currentUser) {
        this.currentUser = currentUser;
    }

    public List<File> getFileList() {
        return fileList;
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {

        logger.info("UserSession unbound");
        logger.info(String.valueOf(fileList.size()));
        for (File file : fileList) {
            logger.info(file.getName());
            file.delete();
        }
    }

    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        logger.info("UserSessionBean bound");
    }
}
@ManagedBean(name=“userSessionBean”)
@会议范围
公共类UserSessionBean实现可序列化的HttpSessionBindingListener{
最终记录器=LoggerFactory.getLogger(UserSessionBean.class);
@注入
私人用户当前用户;
@EJB
用户服务用户服务;
私有列表文件列表;
公共用户sessionbean(){
fileList=newarraylist();
}
@施工后
public void onLoad(){
Principal=FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
字符串email=principal.getName();
如果(电子邮件!=null){
currentUser=userService.FindUserByMail(电子邮件);
}否则{
logger.error(“无法从登录中找到用户信息!”);
}
}
公共用户getCurrentUser(){
返回当前用户;
}
公共无效setCurrentUser(用户currentUser){
this.currentUser=currentUser;
}
公共列表getFileList(){
返回文件列表;
}
@凌驾
public void valueUnbound(HttpSessionBindingEvent事件){
logger.info(“用户会话解除绑定”);
logger.info(String.valueOf(fileList.size());
用于(文件:文件列表){
logger.info(file.getName());
delete();
}
}
@凌驾
public void valueBound(HttpSessionBindingEvent事件){
info(“UserSessionBean绑定”);
}
}

此代码应该可以正常工作。请注意,
FacesContext
不一定在那里可用,因为在该点上运行的线程中不一定有HTTP请求,但您的评论已经超过了这一点。您确定您确实在运行问题中所示的代码吗?清理、重建、重新部署等

另一种方法是让您的
UserSessionBean
实现,然后在该方法中执行该工作


嘿,巴卢斯,我也试过了。我知道文件列表中有文件对象。我可以通过在应用程序中记录大小来测试这一点。但是,当调用unbound时,文件对象大小为0。这与会话侦听器的问题相同。我已经用代码更新了我原来的帖子。我百分之百确定列表中有对象。据我所知不是这样。该列表是userSessionBean对象的一部分。我可以在应用程序中检索并添加到列表中。
@ManagedBean
@SessionScoped
public class UserSessionBean implements HttpSessionBindingListener {

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        for (File file : files) {
            file.delete();
        }
    }

    // ...
}