嗨,
我目前正在玩Guice和@SessionScoped.为了更有意义,我决定构建一个(非常简单的)身份验证过程.
下面,我将解释我所做的每一步.然后我会问你一些问题.
[1] 我创建了一个代表一个人(访客或用户)的Identity类:
@SessionScoped
public class Identity implements Serializable
{
private String uid;
private String name;
public boolean isAuthenticate()
{
return uid != null;
}
public void logout()
{
this.uid = null;
}
/*Setters-Getters*/
}
Run Code Online (Sandbox Code Playgroud)
[2] 接下来,我创建了一个登录用户的Authentication类:
public class Authentication
{
@Override
public Identity authenticate(String login, String password)
{
/*some code*/
Identity identity = new Identity();
identity.setUid(user.getId());
return identity;
}
}
Run Code Online (Sandbox Code Playgroud)
[3] 然后,在我的Servlet中,我登录用户:
@RequestScoped
public class LoginAction
{
@Inject
Injector injector;
protected void login(HttpServletRequest req, HttpServletResponse resp)
{ …Run Code Online (Sandbox Code Playgroud) 我有一个自定义AuthenticationSuccessHandler.
我想要做的是在onAuthenticationSuccess方法中设置一些会话数据.
要存储会话数据,我想使用会话范围的bean,它可以在任何控制器中正常工作.
但是如果我尝试在onAuthenticationSuccess方法中检索它,我会得到一个异常:
创建名为'scopedTarget.sessionData'的bean时出错:范围'session'对当前线程无效;
我的代码是:
WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
SessionData sessionData = context.getBean(SessionData.class);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我正在尝试使用在IceFaces页面上找到的模式.(我没有使用IceFaces,使用PrimeFaces)
在这种情况下,我有两个豆:
UserController 和Usermodel
在我的UserModel上,我有一个UserVO实例(由另一个程序员创建).在我的UserController上我有这个:
@ManagedBean
@RequestScoped
public class UserController implements Serializable
{
private static final long serialVersionUID = 1L;
private UserBO bo;
private UserModel model;
public UserController()
{
bo = new UserBO();
model = new UserModel();
}
public void Login() throws IOException
{
model.setUserVo(bo.executeLogin(model.getUserVo()));
ExternalContext externalContent = FacesContext.getCurrentInstance().getExternalContext();
if (!model.getUserVo().isError())
{
model.setLoggedIn(true);
externalContent.getSessionMap().put("userSession", model);
externalContent.redirect(externalContent.getRequestContextPath() + "/views/request/search.html");
} else
{
model.setLoggedIn(false);
FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, model.getUserVo().getMessage(), model.getUserVo().getLogin());
FacesContext.getCurrentInstance().addMessage(null, facesMessage);
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个会话作用域CDI托管bean:
@Named
@SessionScoped
public class SampleBean implements Serializable {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我需要在某个流程之后从会话中删除这个bean,我使用了以下代码,如下面的答案所示:
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.getSessionMap().remove("sampleBean");
Run Code Online (Sandbox Code Playgroud)
但是,它不起作用,并且SampleBean在会话中仍然存在.
我错过了什么吗?
我有三个托管bean:一个作用域范围(S)和两个视图作用域(A,B).我想在S和B中使用A的功能,但问题是在会话范围内注入视图范围的bean是不可能的.
The scope of the object referenced by expression #{a}, view, is shorter than the referring managed beans (s) scope of session
Run Code Online (Sandbox Code Playgroud)
我不想复制A的功能.任何的想法?
我了解到 CDI Bean 可以用于不同的基于 Web 应用程序的范围(仅限于此,对吧?)。例如:@RequestScoped、@SessionScoped等。@SessionScoped 将数据保存在整个浏览器会话上的托管 bean 中。这在逻辑上听起来很安静,因为注释名称描述了它的作用。然而,现在我更仔细地了解了 EJB 会话 Bean。到目前为止我知道,这样的状态可能具有以下三种状态之一:@Stateless、@Stateful 和@Singleton。对我来说,看起来它们和 CDI bean 的注释之间有直接的可比性:@RequestScoped --> @Stateless、@SessionScoped --> @Stateful、@ApplicationScoped --> @Singleton。但由于我正在研究一些示例,我发现了一个同时包含 @Stateful 和 @SessionScoped 注释的 bean。我寻找解释 - 但我没有找到任何可以理解的答案。那么,到底有什么区别呢?为什么我必须使用这两个注释?谢谢。
我想清除 xpages 应用程序中的当前会话范围并再次重新加载它们。我努力了:
public Map<String, Object> sesScope;
this.sesScope = JSFUtil.getSessionScope();
clearMap(sesScope);
private void clearMap(Map<String, Object> map ){ // Get iterator for the keys
String methodName = new Object(){}.getClass().getEnclosingMethod().getName();
utils.printToConsole(this.getClass().getSimpleName().toString() + " " + methodName);
utils.printToConsole("-------before removing------");
utils.printToConsole(map.toString());
Set keyset = map.keySet();
Iterator itr = keyset.iterator();
while (itr.hasNext()) {
itr.next();
itr.remove();
}
utils.printToConsole("--------After removing-------");
utils.printToConsole(map.toString());
}
Run Code Online (Sandbox Code Playgroud)
不知怎的,我不能简单地说 sesScope.clear() 因为这会导致错误:
com.sun.faces.context.BaseContextMap.clear(ExternalContextImpl.java:392) 处的 java.lang.UnsupportedOperationException
如何正确清除会话范围?
好的,基于我问的最后一个问题,Mysql如何处理以下代码中的where语句:
DELIMITER ;//
DROP PROCEDURE IF EXISTS `test`;//
CREATE PROCEDURE `test`
(
id INT
)
BEGIN
SELECT *
FROM some_table
WHERE id = id;
END;//
Run Code Online (Sandbox Code Playgroud)
在这种情况下MySQL会做什么?它是否将where子句视为
some_table.id = id
Run Code Online (Sandbox Code Playgroud)
或者它是否像对待它一样
some_table.id = some_table.id
Run Code Online (Sandbox Code Playgroud)
现在我正在做类似的事情
WHERE id = @id
Run Code Online (Sandbox Code Playgroud)
因为我不知道MySQL中有会话变量而且它没有抱怨,我认为这是一种明确的方式来说"这个列等于这个变量".
有些人可能会说"呃..当然它把它当作列=变量",但我可以很容易地说"变量=列".那怎么处理呢?
我使用JSF 2.0创建了一个Web应用程序.我到处都使用会话范围bean,因此我遇到了问题.:(我将用下面的例子解释.
我有dataTable中的用户列表.当我点击用户时,我会看到该用户的详细信息.现在,当我右键单击用户A并单击时Open in new tab,我会在新选项卡中看到用户A的详细信息.
现在,当我右键单击用户B并单击在新选项卡中打开时,我会看到用户B的详细信息.
但是,当我进入选项卡(用户A详细信息在那里)并刷新该页面时,我会看到用户B的详细信息.
如何克服这一点,以便如果我刷新页面,我仍然会看到用户A而不是用户B的详细信息.
我已经阅读了范围(@SessionScoped, @ViewScoped, @ApplicationScope and @RequestScope)类型之间的所有差异,但是,我仍然在某种程度上遇到应用程序问题。我有一个page-1 与网格和我所选择的项目发送到page-2(两者page-1并page-2用相同的支持bean),以进行编辑,然后持续存在。据我所知,我的托管bean正在使用@RequestScoped,javax.faces.bean.RequestScoped这是理想的使用范围,但是它不起作用,bean被破坏了,数据丢失了。
恢复该故事,我将注释更改为@SessionScoped并且可以正常工作,但是我想知道这是否是一个好习惯?因为我已经读到,使用这种方法不是一个好习惯,@SessionScoped因为在客户端注销之前数据将一直保持活动状态。
我试图从ManagedBeanUtil类获取我的SessionScoped managedBean的对象,但所有iam获取为null.
这是我的代码: -
package com.beas.ui.manager;
@ManagedBean(name = "sessionManager")
@SessionScoped
public class SessionManager implements Serializable {
private static final long serialVersionUID = -3064514740080155761L;
//..
}
public class ManagedBeanUtil {
public static SessionManager getSessionManager() {
return (SessionManager) FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap().get("sessionManager"); // returns null
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道我做错了什么.谁能为此提供合适的解决方案?
session-scope ×11
jsf ×6
java ×4
jsf-2 ×4
cdi ×2
managed-bean ×2
annotations ×1
destroy ×1
guice ×1
jakarta-ee ×1
javabeans ×1
mysql ×1
scopes ×1
spring ×1
spring-mvc ×1
stateful ×1
variables ×1
view-scope ×1
xpages ×1