【问题标题】:spring boot - returning pojo response from filterspring boot - 从过滤器返回 pojo 响应
【发布时间】:2020-03-24 03:49:41
【问题描述】:

我想创建一个过滤器/bean,它具有自动装配的构造函数参数,并且对于对某些 url 的每个请求,都会检查标头并返回一个 pojo 错误(或者理想情况下抛出将由 spring 处理的异常),或者通过请求传递过滤器链。像

@Bean
class MyFilter {

  @Autowired
  public MyFilter(MyService myService) {...}

  public doFilter(request, response, chain) {
     if (request. ...) {
        throw new ResponseStatusException(HttpStatus.BAD_REQUEST)
        // or return new MyErrorPojo()
     }
     return chain.doFilter(request, response)
  }
}

春天的做法是什么?

【问题讨论】:

标签: java spring spring-boot spring-mvc spring-filter


【解决方案1】:

也许这会对你有所帮助。

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@Component
@Order( 1 )
public class RequestFilter implements Filter
{

    @Override
    public void doFilter(
            ServletRequest request,
            ServletResponse response,
            FilterChain chain ) throws IOException, ServletException

    {

        HttpServletRequest req = ( HttpServletRequest ) request;
        if( false )
        {
            response.getWriter().println( "error" );
            throw new ServletException( "" );
        }
        else
        {
            doFilter( request, response, chain );
        }

    }
}

【讨论】:

    【解决方案2】:

    我认为这里的技术组合相当混乱:

    过滤器属于 servlet 规范,在 HTTP 请求抽象级别上运行。

    一旦过滤器链通过并到达 DispatcherServlet(spring mvc 的入口点),spring 就会与所有 MVC 好东西一起发挥作用。

    因此,如果您想检查标头,则有一个名为 org.springframework.web.servlet.handler.HandlerInterceptorAdapter 的抽象

    你基本上可以创建一个实现这个接口的类,并在方法中查看头:that属于这个接口

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

    如您所见,您可以访问请求并且可以检查那里的标头。

    现在我自己还没有使用过(现在无法检查),但它需要在具有特殊“addInterceptor”方法的 WebMvcConfigurer 级别进行配置。所以我不能确认只添加一个 created 类型的 bean 就足够了,或者你应该使用 WebMvcConfigurer 配置它

    【讨论】:

      猜你喜欢
      • 2017-06-09
      • 2019-12-03
      • 2020-08-11
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 2019-07-27
      相关资源
      最近更新 更多