在用户登录时更新 HTTP 会话是一种常见的最佳实践。这将强制使用新的会话 ID,避免会话固定漏洞。
当涉及@SessionScoped bean 时,是否有使用 CDI 实现此功能的首选模式?困难在于,通过使当前的 HTTP 会话无效,您将在下一个请求中获得一个不同的会话范围的 bean,但直到下一个请求才会如此。
例如,假设一个会话 bean 用于存储用户登录信息:
@Named("sessionbean")
@SessionScoped
public class SessionBean implements Serializable {
private int userId;
private String username;
private List<String> privileges;
// Accessors omitted
}
Run Code Online (Sandbox Code Playgroud)
另一个用于管理登录的 bean:
@Named("loginbean")
@ViewScoped
public class LoginBean implements Serializable {
private String username;
private String password;
@Inject private SessionBean session;
@Inject private SessionManager sessionManager;
@Inject private PrivilegeManager privilegeManager;
public String doLogin() {
String destinationUrl;
if (validate(username, password)) {
FacesContext context = FacesContext.getCurrentInstance();
// force …Run Code Online (Sandbox Code Playgroud) 我在用:
我有这个错误:
21:26:14,941 严重 [javax.enterprise.resource.webcontainer.jsf.config](ServerService 线程池 -- 76)部署期间出现严重错误::com.sun.faces.config.ConfigurationException:工厂'javax.faces.lifecycle .ClientWindowFactory' 未正确配置。在 com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:357) 在 com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:243) 在 com.sun.faces.config .ConfigManager.initialize(ConfigManager.java:443) 位于 com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:237) 位于 io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:187) 处io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:216) 在 io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:185) 在 io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1 .call(ServletRequestContextThreadSetupAction.java:42) 在 io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43) 在 org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java :105) 在 org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502) 在 org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService) .java:1502) 在 org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502) 在 org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0 (UndertowDeploymentInfoService.java:1502) 在 io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:250) 在 org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:96) 在 org. wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:78) 在 java.util.concurrent.Executors$RunnableAdapter.call(未知来源) 在 java.util.concurrent.FutureTask.run(未知来源) org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) 在 org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985) 在 …