当前位置: 首页 > 面试题库 >

从HttpSessionListener获取SessionScoped bean?

东门城
2023-03-14
问题内容

大家好。我试图在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();
            }
        } 
    }

致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");
    }
}

问题答案:

此代码应该可以正常工作。请注意,FacesContext此处不一定可用,因为此时并不一定要在线程中运行HTTP请求,但是您已经对此予以了反对。您确定您
确实在 运行问题中所示的代码吗?清理,重建,重新部署等

另一种选择是让您的UserSessionBean工具实现HttpSessionBindingListener,然后执行该valueUnbound()方法中的工作。

@ManagedBean
@SessionScoped
public class UserSessionBean implements HttpSessionBindingListener {

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

    // ...
}


 类似资料:
  • 问题内容: 如何从SessionListener访问请求标头? 创建当前会话时,我需要在当前会话上设置超时。超时需要根据HttpServletRequest中的标头而有所不同。我已经有一个SessionListener(实现HttpSessionListener),它记录新会话的创建和销毁,这似乎是设置超时的最合逻辑的地方。 我尝试了以下操作,但始终将ctx设置为null。 问题答案: 将因为它被

  • 所有。我看了网页,但没有找到适合我的解决方案。 在会话被销毁之前,我需要从中的globalsession作用域bean访问信息。 在检查会话属性后,我找到了一个解决方案,但它似乎并不顺利: 我还有单例bean,通过目标代理包含会话bean,但通过,对会话bean的引用在它们内部无效(会话bean在调用之前已被销毁) 有没有人知道解决这样的问题的好方法? 我想我们需要类似于的东西,但是对于会话bea

  • 我已经实现了HttpSessionListiner,但它不起作用。用debuger检查了它-进入servlet后创建新的session,JSESSION_ID在登录后更改,但是session.getcreatetime()保持不变(session保持不变?)。使用注释,Spring安全。也许我错过了spring Security中的一些配置?

  • 问题内容: 我正在编写一个JSP / Servlet,并且试图获取URI的锚点部分,例如: 如何从我的请求中获得分数?显然行不通吗? 任何帮助都将受到欢迎。 问题答案: 这是不可能的,因为客户端不会将“锚定部分”发送到服务器 例如,这是Chrome提交后生成的确切请求(使用Wireshark记录): 看,没有#foobar。因此,服务器应用程序无法读取它。 您可以做一些JavaScript魔术,将

  • 问题内容: 我正在编写一个JSP / Servlet,并且尝试获取URI的锚点部分,例如: 如何从我的请求中获得分数?显然行不通吗? 任何帮助都将受到欢迎。 问题答案: 这是不可能的,因为客户端不会将“锚定部分”发送到服务器 例如,这是Chrome提交后生成的确切请求(使用Wireshark记录): 看,没有#foobar。因此,服务器应用程序无法读取它。 您可以做一些JavaScript魔术,将

  • 问题内容: 我可以从org.w3c.dom.Node获取完整的xpath吗? 说当前节点指向xml文档中间的某个位置。我想提取该元素的xpath。 我正在寻找的输出xpath是。节点xpath的父级。只需忽略具有表达式并指向同一节点的xpath。 问题答案: 没有获取XPath的通用方法,主要是因为没有一个通用XPath可以标识文档中的特定节点。在某些架构中,节点将由属性唯一标识(并且可能是最常见