替换j_security_check自定义登录后重定向失败,遇Weld上下文停用错误
自定义登录重定向时Weld会话上下文销毁错误的解决方案
1. 手动管理会话上下文生命周期
错误核心是请求销毁时无法停用Weld会话上下文,大概率是自定义登录流程未正确处理上下文生命周期:
- 在
continueAuthentication()方法中,认证成功后主动结束当前会话上下文(如果存在):@Inject private Conversation conversation; public String continueAuthentication() { // 执行自定义认证逻辑 if (认证成功) { if (!conversation.isTransient()) { conversation.end(); } // 必须带?faces-redirect=true触发重定向,避免转发导致上下文残留 return "SUCCESS?faces-redirect=true"; } return "LOGIN"; }
2. 排查会话作用域Bean的意外实例化
若登录页面的EL表达式引用了@ConversationScoped或@SessionScoped bean,可能导致上下文提前初始化且未清理:
- 检查登录页面的组件绑定、数据引用,移除不必要的会话作用域依赖。
- 确保登录请求仅触发必要的请求作用域逻辑,避免上下文泄漏。
3. 调整Weld/JBoss配置
在WEB-INF/beans.xml中指定会话上下文实现,强制请求结束时清理:
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd" version="2.0"> <alternatives> <class>org.jboss.weld.module.web.context.http.HttpConversationContext</class> </alternatives> </beans>
也可在JBoss的standalone.xml中调整会话上下文超时:
<subsystem xmlns="urn:jboss:domain:weld:5.0"> <contexts> <conversation-context timeout="60000"/> </contexts> </subsystem>
4. 确保容器级认证完成
不要仅依赖自定义逻辑,调用容器的login()方法完成安全上下文绑定:
@Inject private HttpServletRequest request; @Inject private Conversation conversation; public String continueAuthentication() { try { // 调用容器认证,确保安全上下文正确初始化 request.login(username, password); if (!conversation.isTransient()) { conversation.end(); } return "SUCCESS?faces-redirect=true"; } catch (ServletException e) { // 处理认证失败 return "LOGIN"; } }
这一步能避免Weld上下文与安全会话不匹配导致的销毁异常。
5. 验证JSF导航配置
检查faces-config.xml中的导航规则,确保SUCCESS触发重定向:
<navigation-rule> <from-view-id>/login.xhtml</from-view-id> <navigation-case> <from-outcome>SUCCESS</from-outcome> <to-view-id>/home.xhtml</to-view-id> <redirect/> </navigation-case> </navigation-rule>
或直接在返回字符串中指定重定向参数,不依赖导航规则。
内容的提问来源于stack exchange,提问作者Aria
相关产品推荐
相关产品推荐

