Java 如何使用自定义登录模块捕获Tomcat JaasRealm的响应状态

Java 如何使用自定义登录模块捕获Tomcat JaasRealm的响应状态,java,tomcat,java-8,jaas,Java,Tomcat,Java 8,Jaas,我正在使用Tomcat CMA,使用带有自定义登录模块的JaasRealm。在这里,我覆盖了布尔LoginModule#login()方法。现在,每当一个请求进入webapplication上下文时,首先它将通过这个登录方法进行身份验证。同样,此登录方法具有boolean返回类型 @Override public boolean login() throws LoginException { Callback[] callbacks = new Callback[2

我正在使用Tomcat CMA,使用带有自定义登录模块的JaasRealm。在这里,我覆盖了
布尔LoginModule#login()
方法。现在,每当一个请求进入webapplication上下文时,首先它将通过这个登录方法进行身份验证。同样,此登录方法具有
boolean
返回类型

  @Override
    public boolean login() throws LoginException {

        Callback[] callbacks = new Callback[2];

因此,如果返回值为
true
,则继续完成进一步的请求;如果返回值为
false
,则返回
401状态
。在某些情况下,当返回值为false时,我希望返回非401状态。但对我来说这似乎是不可能的。当loginModule返回false时,您知道如何发送回修改后的状态作为响应吗。

您不能在登录模块或JAASRealm中影响响应,如果身份验证成功,这些类只会创建一个主体,否则为null,JAASRealm会在该异常之上吞噬所有异常

所以,为了做到这一点,你应该

  • 扩展JAASRealm,覆盖身份验证,并将AccountExpiredException/FailedLoginException/etc作为未经检查的异常(自定义RuntimeException)抛出
  • 扩展DigestAuthenticator类并覆盖doAuthenticate(或者复制整个源代码,这肯定会起作用),在那里捕获自定义运行时异常,并使用response.senderro()将响应代码设置为所需的代码
  • 使用定制的JAASRealm类,像往常一样配置整个过程,CustomDigestAuthenticator应该是(我不知道是否有可能以一种不太全局的方式进行配置)

可以找到类似的线程

您使用的tomcat版本是什么?