Java 从HttpSessionListener获取SessionScoped bean?
嘿,伙计们。我试图在HttpSessionListener中获取会话bean,这样当用户注销或会话过期时,我就可以删除用户在应用程序中创建的一些文件。我猜会话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
@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();
}
}
// ...
}