首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring boot RestController获取spring内容

spring boot RestController获取spring内容
EN

Stack Overflow用户
提问于 2017-09-08 21:54:02
回答 1查看 13.9K关注 0票数 2

我使用spring boot构建项目,RestController返回字符串数据。

我想在过滤器中获取响应内容。

但是得不到,请帮帮我。

控制器:

代码语言:javascript
复制
@RestController
@RequestMapping(value = "/service/example")
public class ExampleController {
    @RequestMapping(value = "/get/test", method = RequestMethod.POST)
    public String message(@RequestBody String data) {
        return "test";
    }

    @RequestMapping(value = "/get/test1", method = RequestMethod.POST)
    public void message(HttpServletRequest request, HttpServletResponse response) throws IOException {
        PrintWriter writer = response.getWriter();
        writer.write("dfsfd");
        writer.flush();
    }
}

过滤器:

代码语言:javascript
复制
@WebFilter(filterName="myFilter",urlPatterns="/service/*")
public class MyFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
        throws ServletException, IOException {
        MyHttpServletResponseWrapper responseWrapper = new MyHttpServletResponseWrapper(response);
        filterChain.doFilter(request, responseWrapper);
        String responseContent = responseWrapper.getContent();
        System.out.println("response="+responseContent);
    }
}

MyHttpServletResponseWrapper:

代码语言:javascript
复制
public class MyHttpServletResponseWrapper extends HttpServletResponseWrapper {

    private PrintWriter cachedWriter;
    private CharArrayWriter bufferedWriter;

    /**
     * Constructs a response adaptor wrapping the given response.
     *
     * @param response The response to be wrapped
     * @throws IllegalArgumentException if the response is null
     */
    public MyHttpServletResponseWrapper(HttpServletResponse response) {
        super(response);
        bufferedWriter = new CharArrayWriter();
        cachedWriter = new PrintWriter(bufferedWriter);
    }

    @Override
    public PrintWriter getWriter() throws IOException {
        return cachedWriter;
    }

    /**
     * 获取原始HTML
     *
     * @return
     */
    public String getContent() {
        byte[] bytes = bufferedWriter.toString().getBytes();
        try {
            return new String(bytes, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            return "";
        }
    }
}

post到/service/example/ get /test无法获取内容。但是post到/service/example/ get /test1可以获得内容。

为什么?

我的项目有很多rest,比如/service/example/get/test,我不想改变每一个。

如何在filter中获取回复内容,请帮助,谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-09 00:24:20

我创建了一个简单的spring boot项目,在这个项目中,你可以控制你想要过滤的url:

Rest服务类(3个服务,我们只过滤2个)

代码语言:javascript
复制
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.filter.GenericFilterBean;

@SpringBootApplication
@RestController
@RequestMapping(value = "/service/example")
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @RequestMapping(value = "/get/test", method = RequestMethod.POST)
    public String message(@RequestBody String data) {
        return "test";
    }

    @RequestMapping(value = "/get/test1", method = RequestMethod.POST)
    public void message(HttpServletRequest request, HttpServletResponse response) throws IOException {
        PrintWriter writer = response.getWriter();
        writer.write("dfsfd");
        writer.flush();
    }

    @RequestMapping(value = "/api", method = RequestMethod.POST)
    public void messages(HttpServletRequest request, HttpServletResponse response) throws IOException {
        PrintWriter writer = response.getWriter();
        writer.write("dfsfd");
        writer.flush();
    }


    @Bean
    public FilterRegistrationBean someFilterRegistration() {

        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(myFilter());
        registration.addUrlPatterns("/service/example/get/*");
        registration.setOrder(1);
        return registration;
    } 

    @Bean(name = "someFilter")
    public GenericFilterBean myFilter() {
        return new MyFilter();
    }
}

MyFilter类:

代码语言:javascript
复制
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.web.filter.GenericFilterBean;

public class MyFilter extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        System.out.println("Filter called");
        filterChain.doFilter(servletRequest, servletResponse);
    }

}

尝试呼叫3个服务:

http://localhost:8080/service/example/get/test

http://localhost:8080/service/example/get/test1

http://localhost:8080/service/example/api

并检查打印的日志。

您可以使用下面这一行来控制url模式

代码语言:javascript
复制
registration.addUrlPatterns("/service/example/get/*");

我希望这个样品能对你有所帮助,谢谢

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46118142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档