Получение бина SessionScoped из HttpSessionListener? - PullRequest
1 голос
/ 09 марта 2011

Привет, ребята.Я пытаюсь получить сессионный компонент в HttpSessionListener, чтобы, когда пользователь выходит из системы или истекает сеанс, я мог удалить некоторые файлы, созданные пользователем в приложении.Я предполагаю, что сессионный компонент не существует, потому что сессия уничтожена.Я надеялся все же удалить эти файлы как-нибудь.Спасибо за помощь.

   @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();
            }
        } 
    }

To BalusC: Я вернулся к методу, который вы ранее имели в виду.Потоковая передача байтов пользователю не была гибкой в ​​моем приложении.Я обнаружил, что мне нужно было сделать много вещей в 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");
    }
}

1 Ответ

3 голосов
/ 09 марта 2011

Этот код должен работать нормально. Обратите внимание, что FacesContext не обязательно доступен там, поскольку в потоке, выполняемом в этот момент, не обязательно есть средства HTTP-запроса, но вы уже прокомментировали это. Вы уверены, что на самом деле выполняете код, как показано в вопросе? Очистить, восстановить, повторно развернуть и т. Д.

В качестве альтернативы можно разрешить вашему UserSessionBean реализовать HttpSessionBindingListener и затем выполнить работу в методе valueUnbound().

@ManagedBean
@SessionScoped
public class UserSessionBean implements HttpSessionBindingListener {

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

    // ...
}
...