在JSF 2.0应用程序中使会话无效的最佳方法是什么?我知道JSF本身不会处理会话.到目前为止我能找到
private void reset() {
HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
.getExternalContext().getSession(false);
session.invalidate();
}
Run Code Online (Sandbox Code Playgroud)
@SessionScopedUserBean处理用户的登录注销.我在同一个bean中有这个方法.现在,当我reset()完成必要的数据库更新后调用该方法时,我当前的会话作用域bean会发生什么?既然豆本身也存放在HttpSession?public class LoginAction extends ActionSupport {
private String username;
private String password;
@Override
public String execute() throws Exception {
ActionContext ctx = ActionContext.getContext();
Integer counter = (Integer)ctx.getApplication().get("counter");
// put counter into application
ctx.getApplication().put("counter", counter);
// put username into session
ctx.getSession().put("user", username);
if (getUsername().equals("crazyit.org")
&& getPassword().equals("leegang")) {
ctx.put("tip", "Login Success! ");
return SUCCESS;
}
else {
ctx.put("tip", "Login Falied!");
return ERROR;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我把"counter"在应用"user"会话和"tip"中ActionContext.在JSP中,我可以使用${session.user}和${sessionScope.user}引用"user"属性.${request.tip}并${requestScope.tip}参考 …
我有一个名为userSession的SessionScoped bean来跟踪用户(用户名,ifLogged等).我想过滤一些页面,因此我需要从我创建的webFilter访问bean.我怎么做?我看起来甚至不可能将豆子导入到潜在的可见区域.
Singleton无法自动装配SessionBean,但ScopedProxy可以.
假设100个用户在同一个应用程序中同时拥有一个有效的Session,ScopedProxy如何决定会话的含义?
我不认为ScopedProxy正在选择任何随机会话,这在我看来是无稽之谈.
NullPointerException发生吗?我想有一个会话作用域的JSF bean与一个请求(页面)作用域的属性.有可能吗?
我知道Application-Scope持久存在于多个用户之间,因此我们应该确保所有ApplicationScoped ManagedBeans都是线程安全的.
我也明白,我们不需要关心RequestScoped ManagedBean的线程安全性.这是因为它仅针对一个HTTP请求而持续,并且如果被引用则针对每个请求进行新实例化.
但我不太清楚为什么我们应该担心SessionScoped ManangedBean的线程安全性.即使它在多个请求中持续存在,每个用户都可以获得自己的实例,对吧?
那么,为什么我们需要在SessionScoped ManagedBeand的情况下担心线程安全,这也适用于ViewScoped ManagedBean吗?ViewScope在同一视图的两个连续请求中持续存在,对吧?
出于身份验证的目的,我将请求范围的支持bean注入另一个将存储已记录用户的会话范围bean.或者至少它应该...以下,一些代码:
请求scoped bean - 托管属性
@ManagedProperty(value="userLogin")
Run Code Online (Sandbox Code Playgroud)
错误 无法为托管bean凭据设置属性userLogin
堆栈跟踪
com.sun.faces.mgbean.ManagedBeanCreationException: Unable to set property userLogin for managed bean credentials
at com.sun.faces.mgbean.ManagedBeanBuilder$BakedBeanProperty.set(ManagedBeanBuilder.java:615)
at com.sun.faces.mgbean.ManagedBeanBuilder.buildBean(ManagedBeanBuilder.java:133)
at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:104)
at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244)
at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116)
at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:72)
at org.apache.el.parser.AstValue.getValue(AstValue.java:161)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:182)
at javax.faces.component.UIOutput.getValue(UIOutput.java:169)
at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:205)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:355)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:164)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312)
at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782)
at …Run Code Online (Sandbox Code Playgroud) 我有一个开放的Castle ActiveRecord SessionScope.我需要使用包装在SessionScope中的nhibernate会话.
如何从SessionScope检索当前的NHibernate会话对象?
非常感谢你的回复.
[更新]我有这个代码
ISession session = SessionScope.Current.GetSession( );
Run Code Online (Sandbox Code Playgroud)
但我不知道什么传递给GetSession参数
我开发了一个 Spring Web-MVC 应用程序。我的项目中有一些办公室。每个用户属于一个办公室。user.getOfficeType()返回一个表示用户办公室类型的整数。如果 office 类型为 1,则用户属于 Office1 等。但是我想将经过身份验证的用户的 office 注入我的服务类:
class MyService{
@Autowired
Office currentOffice;
...
}
Run Code Online (Sandbox Code Playgroud)
我阅读了 Spring 文档。我需要一个会话范围的 bean 将它注入到我的服务类中。
applicationContext.xml :
<mvc:annotation-driven />
<tx:annotation-driven transaction-manager="hibernateTransactionManager"/>
<context:annotation-config />
<context:component-scan base-package="com.package.controller" />
<context:component-scan base-package="com.package.service" />
...
<bean id="office" class="com.package.beans.Office" scope="session">
<aop:scoped-proxy/>
</bean>
Run Code Online (Sandbox Code Playgroud)
我有Office接口的三个实现。一旦用户请求资源,我想知道他的办公室。所以我需要将他的会话范围的 Office 注入我的服务类。但是我不知道如何根据用户的办公室来实例化它。请帮忙!
我对会话作用域CDI bean的生命周期有疑问.
据我所知,会话范围内的CDI bean是在会话开始时由容器构造的,并在会话结束时销毁.在销毁bean之前,调用@PreDestroy方法,如https://docs.oracle.com/javaee/6/tutorial/doc/gmgkd.html所述.它还说要在这种方法中释放资源.
在我构建的JSF应用程序中,我遇到内存泄漏,因为bean似乎没有被销毁,因此不会调用@PreDestroy方法来释放垃圾收集器的一些引用.所以我构建了一个简单的应用程序来测试行为.我的经验是会话bean在会话结束时不会被破坏,而且当需要内存空间时它甚至不会被破坏.我不敢相信我是第一个遇到这种情况的人,但我没有找到任何有关此行为的信息.
所以我的问题是:在上下文过期之后,不应该销毁CDI bean - 因此调用@PreDestroy方法吗?如果不是,在需要空间时,它至少应该被破坏吗?
我的测试应用:
我不允许发布图片,但大纲是eclipse生成的非常基本的jsf webapp.我也有beans.xml文件.
Test.java:
package com.test;
import java.io.Serializable;
import java.util.ArrayList;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
@SessionScoped
@Named
public class Test implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String test;
private ArrayList<ComplexType> cps;
private ArrayList<ComplexType> cps_2;
@PostConstruct
public void init() {
System.out.println("test postconstruct..");
test = "Cdi Test";
}
@PreDestroy
public void cleanUp() {
cps …Run Code Online (Sandbox Code Playgroud) session-scope ×10
jsf ×5
managed-bean ×4
java ×2
session ×2
spring ×2
cdi ×1
destroy ×1
el ×1
httpsession ×1
jsf-2 ×1
jsp ×1
nhibernate ×1
object ×1
singleton ×1
spring-bean ×1
spring-mvc ×1
weld ×1