0

私はスプリングブートビルドプロジェクト、RestControllerリターン文字列データを使用します。スプリングブートRestController get HttpServletResponse content

フィルタで応答コンテンツを取得します。

でも、私は助けてください。

コントローラ:

@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(); 
    } 
} 

フィルタ:

@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:カントは、コンテンツを取得/サービス/例/取得/試験に

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 ""; 
     } 
    } 
} 

ポスト。 ですが、/ service/example/get/test1に投稿するとコンテンツを取得できます。

なぜですか?

私のプロジェクトには/ service/example/get/testのような休憩がたくさんありますが、それぞれを変更したくありません。

フィルターの応答内容を取得する方法、お手数です、ありがとうございます!

答えて

0

私は1つの単純な春のブートプロジェクトを作成し、このプロジェクトでは、あなたがフィルタリングしたいURLを制御することができます

休憩サービスクラス(3つのサービス、我々は唯一の2をフィルタします)

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をクラス:

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/test1

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

と印刷ログを確認してください。

あなたは

registration.addUrlPatterns("/service/example/get/*"); 

このラインを使用して、URLのパタパタを制御することができ、私は感謝

、このサンプル・ヘルプにあなたを願っています
関連する問題