You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Helidon MP v2.5.5中自定义401 Unauthorized响应体?

实现Helidon MP v2.5.5自定义401 Unauthorized响应

要给401响应添加时间戳和提示信息,你可以通过JAX-RS的ExceptionMapper机制来实现,具体步骤如下:

1. 定义错误响应DTO类

创建一个用于封装响应内容的Java类,用来序列化JSON格式的错误信息:

public class ErrorResponse {
    private long timestamp;
    private String message;

    public ErrorResponse(String message) {
        // 生成秒级时间戳,与示例格式匹配
        this.timestamp = System.currentTimeMillis() / 1000;
        this.message = message;
    }

    // 必须提供getter方法,Jackson序列化需要访问字段
    public long getTimestamp() {
        return timestamp;
    }

    public String getMessage() {
        return message;
    }
}

2. 实现ExceptionMapper捕获401异常

创建一个带有@Provider注解的异常映射器类,用来拦截401相关的异常并返回自定义响应:

方式一:通用拦截WebApplicationException(覆盖所有401场景)

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class UnauthorizedResponseMapper implements ExceptionMapper<WebApplicationException> {

    @Override
    public Response toResponse(WebApplicationException exception) {
        Response originalResponse = exception.getResponse();
        // 判断是否为401状态码
        if (originalResponse.getStatus() == Response.Status.UNAUTHORIZED.getStatusCode()) {
            // 自定义提示信息,可根据异常动态调整
            String errorMsg = "Your access token was expired";
            ErrorResponse errorResponse = new ErrorResponse(errorMsg);
            
            return Response.status(Response.Status.UNAUTHORIZED)
                    .entity(errorResponse)
                    .type(MediaType.APPLICATION_JSON)
                    .build();
        }
        // 非401异常按原有逻辑返回
        return originalResponse;
    }
}

方式二:精准拦截Helidon认证异常(针对安全模块触发的401)

如果你的401是由Helidon Security模块的认证失败触发的,可以直接拦截AuthenticationException,更精准:

import io.helidon.security.AuthenticationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class AuthExceptionResponseMapper implements ExceptionMapper<AuthenticationException> {

    @Override
    public Response toResponse(AuthenticationException exception) {
        // 优先使用异常自带的消息,没有则用默认提示
        String errorMsg = exception.getMessage() != null ? exception.getMessage() : "Your access token was expired";
        ErrorResponse errorResponse = new ErrorResponse(errorMsg);
        
        return Response.status(Response.Status.UNAUTHORIZED)
                .entity(errorResponse)
                .type(MediaType.APPLICATION_JSON)
                .build();
    }
}

3. 生效机制

Helidon MP会自动扫描带有@Provider注解的类并注册为JAX-RS组件,无需额外配置。当系统触发401异常时,就会自动使用你定义的响应格式返回。


内容的提问来源于stack exchange,提问作者Newbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:50:23