我在 Glassfish 7.0.16 中部署了一个基于雅加达的 Web 应用程序。目前,我正在使用数据库中的用户角色实施 Jakarta Security。这工作正常,直到客户端同时执行多个ajax请求,它从2°或3°ajax请求开始响应403禁止。事实上,这种情况有时会出现 10 次左右 3 次。
我尝试将安全设置更改为 web.xml 中的
<security-role>
、Servlet 文件中的 @ServletSecurity
以及 Servlet 类中的 @inject SecurityContext
我在 Servlet 类中删除了
@ServletSecurity
并编写了一个过滤器,我在其中注入 SecurityContext
并进行了如下检查:
public class AuthorizationFilter implements Filter {
@Inject
SecurityContext sc;
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
if (req.isUserInRole("ROLE_A") || sc.isCallerInRole("ROLE_A")) {
doChain(request, response);
} else {
// log info about Principal and session attributes
}
}
}
就像我上面提到的,如果客户端同时发出6个ajax请求,其中一个将响应403禁止。检查
else
片段中生成的日志,所有会话属性和主体都像另外5个ajax请求一样.
知道发生了什么?
这看起来像是已报告的 GlassFish 已知问题。我想我找到了一个解决方案,通过这个更改:https://github.com/eclipse-ee4j/glassfish/issues/25141。
留意新的 GlassFish 版本,它应该会带来修复。