java Micronaut中HttpServletRequest和HttpServletResponse的替代方案

fwzugrvs  于 2023-04-10  发布在  Java
关注(0)|答案(4)|浏览(130)

我正在玩Micronaut,我目前错过的是访问HttpServletRequestHttpServletResponse。这些通常允许访问以下内容:

  • 请求参数
  • 输入/输出流(特别是直接写入输出流)
  • 获取/设置cookie
  • 获取/设置标题
  • 正在获取客户端IP

我也不确定是否有其他选择:

  • @RequestParam files: List<MultipartFile>
  • @RequestBody myClass: MyClass
jdzmm42g

jdzmm42g1#

https://docs.micronaut.io/latest/guide/index.html#requestResponse 和https://docs.micronaut.io/latest/guide/index.html#binding展示了如何绑定到请求参数、cookie、标头等。
https://docs.micronaut.io/latest/guide/index.html#uploads 展示了如何处理文件上传。
输入/输出流(特别是直接写入输出流)
Micronaut做的事情不同,所以你不能访问要写入的流。你可以返回一个React类型,以便在数据可用时将其推送到响应中。
正在获取客户端IP
通常可通过主机标头或www.example.com获得https://docs.micronaut.io/latest/api/io/micronaut/http/HttpRequest.html#getRemoteAddress--
编辑:发送分块的XML文件

@Get(uri = "/xml", produces = MediaType.TEXT_XML)
Flowable<String> getXml() {
    return Flowable.create(emitter -> {
        emitter.onNext("<<xml header>>");
        //do some work
        emitter.onNext("more xml");
        emitter.onNext("<<xml footer>>");
    }, BackpressureStrategy.BUFFER);
}
f0brbegy

f0brbegy2#

@RequestBody -〉@Body(https://docs.micronaut.io/latest/guide/index.html#bodyAnnotation)
@RequestParam -〉@QueryValue
https://micronaut-projects.github.io/micronaut-spring/latest/guide/index.html

p3rjfoxz

p3rjfoxz3#

您可以使用过滤器来使用HTTP请求/响应

@Singleton
public class TraceService {

Flowable<Boolean> yourFilter(HttpRequest<?> request) {

Micronaut HTTP服务器支持以与传统Java应用程序中的Servlet过滤器类似但React式的方式将过滤器应用于请求/响应处理的能力。
筛选器提供支持以下使用情形的能力:
传入HttpRequest的修饰
修改传出的HttpResponse

bvpmtnay

bvpmtnay4#

结果我今晚被这个问题困住了,但有一个办法可以解决。
创建一个存储HttpHeaders属性的通用Bean。

public class HttpHeaderHolder {
    private HttpHeaders headers;

    public HttpHeaderHolder() {
    }

    public HttpHeaders getHeaders() {
        return headers;
    }

    public void setHeaders(HttpHeaders headers) {
        this.headers = headers;
    }

}

一旦你有了这个,创建一个工厂,创建一个该类的RequestScoped bean。

@Factory
public class HttpHeaderFactory {

    @Bean
    @RequestScope
    public HttpHeaderHolder requestHeaders() {
        return new HttpHeaderHolder();
    }

}

现在,您可以创建一个Filter,它注入了这个bean,然后可以从请求中注入头。

@Filter("/**")
public class SomeFilter implements HttpFilter {
    @Inject
    private HttpHeaderHolder instance;

    @Override
    public Publisher<? extends HttpResponse<?>> doFilter(HttpRequest<?> request, FilterChain chain) {
        instance.setHeaders(request.getHeaders());
        return chain.proceed(request);
    }

}

现在你有了一个bean,你可以注入到任何地方来获取当前请求的头部。它似乎可以工作,因为过滤器会拦截请求,并在到达控制器之前将HttpHeaders推入bean。

相关问题