当前位置: 首页 > 面试题库 >

如何在Spring Boot中设置过滤器链?

任飞鸣
2023-03-14
问题内容

我遇到过spring-boot,打算为传入的请求添加过滤器链。

这是应用程序:

package example.hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
    }

}

这是控制器:

package example.hello;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.atomic.AtomicLong;

@RestController
public class GreetingController {

    private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @RequestMapping("/greeting")
    public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
        return new Greeting(counter.incrementAndGet(),
                String.format(template, name));
    }
}

这是过滤器配置:

package example.hello;

import org.springframework.boot.context.embedded.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebConfig {

    @Bean
    public FilterRegistrationBean greetingFilterRegistrationBean() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setName("greeting");
        GreetingFilter greetingFilter = new GreetingFilter();
        registrationBean.setFilter(greetingFilter);
        registrationBean.setOrder(1);
        return registrationBean;
    }

    @Bean
    public FilterRegistrationBean helloFilterRegistrationBean() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setName("hello");
        HelloFilter helloFilter = new HelloFilter();
        registrationBean.setFilter(helloFilter);
        registrationBean.setOrder(2);
        return registrationBean;
    }

}

这是HelloFilter和Greeting过滤器:

package example.hello;

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

public class HelloFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

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

    @Override
    public void destroy() {

    }
}

package example.hello;

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

public class GreetingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

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

    @Override
    public void destroy() {

    }
}

当我启动应用程序并运行时curl localhost:8080/greeting,仅收到“来自过滤器的问候”,并且HelloFilter不会被调用。

此外,没有任何回应Greeting Controller。似乎GreetingFilter阻止了该程序。

那么如何在Spring Boot中设置过滤器链。上面的代码中有任何错误吗?


问题答案:

在GreetingFilter中添加以下代码行

filterChain.doFilter(servletRequest, servletResponse);


 类似资料:
  • 问题内容: 我的应用程序中有2个过滤器。根据某些条件,我想选择是否执行第二个过滤器。有没有办法做到这一点? 我做了一些谷歌搜索,但没有成功。我希望请求继续执行而不执行第二个过滤器。那可能吗? 任何帮助将不胜感激。 问题答案: 您可以在请求中设置一个属性,然后在第二个过滤器中对其进行检查。 您可以像这样简化上面的代码: 这样,您只需检查属性“ executeSecondFilter”的存在

  • 时间过滤器按照指定的时间段展示搜索结果。设置了 index contains time-based events 和 time-field 的索引模式可以使用时间过滤器。 时间过滤器默认的时间段为最近15分钟。您可以使用页面顶部的 Time Picker 来调整时间段和刷新频率。 通过 Time Picker 设置时间过滤器: 点击 Kibana 工具栏中的 Time Picker 。 可以通过点

  • 我使用python和opencv构建了一个使用两个摄像头的立体跟踪器。 问题是如何在openCV版本3.0中设置电源线频率过滤。0(或任何其他)。我知道我使用的相机(microsoftHD3000)有这个属性,它可以在linux和windows中从v4l2设置,我可以使用skype设置一次,但这很难看。 不幸的是,我在CAP_PROP_*常量中找不到相应的属性。 如果有的话,正确的方法是什么?

  • 我想设置一个推荐人cookie,因为我需要排除一些页面(例如错误、登录、注销等)要在登录后重定向到上次调用但未被排除的页面,请执行以下操作: 但是Spring Security过滤链在CookiierReferrerFilter之前就被触发了。因此,调用安全页面将立即将我重定向到登录页面,而无需调用之前,没有设置cookie。 有一个类配置WebApp(设置配置类、映射、过滤器),它扩展了: 还有

  • 问题内容: 我试图在过滤器中将压缩文件的内容类型设置为正确的mime类型,而不是application / gzip。这是我的一些代码: 输出: 在浏览器中,我看到正确设置为,但仍为。似乎正在重置内容类型。 知道如何永久重置内容类型吗? 我没有其他过滤器。 问题答案: 我借助以下答案解决了它: 然后将我上面的代码更改为: 它不是一个很好的解决方法,但它可以工作。

  • 问题内容: 我的过滤器很少 在我的项目中,要获得良好的结果,我必须在控制器中进行此过滤,而不是在视图中 我知道基本的语法,但我不知道如何在控制器中制作过滤器链,因此一切都将如模板中的示例一样工作。 我找到了一些解决方案,现在仅使用一个过滤器,但是应该可以用于许多;) 我在ng-repeat中使用此功能可以正常工作,但是我必须使用少量过滤器进行检查。 问题答案: 您只需重新过滤您从第一个过滤器返回的

  • 问题内容: 前言 这是我第一次尝试过滤器,要小心。 项目介绍 我正在尝试为我们的一些应用程序最终确定SSO的构建,而且似乎步履维艰。我尝试连接的Webapp使用“身份验证”标头来确定应用程序内的用户凭据。我构建了一个Filter,希望在将标头传递到Web应用程序之前对其进行设置。 问题 该代码通过Eclipse验证,编译,加载到Tomcat,然后传递到Webapp。唯一缺少的是Authentica

  • 主要内容:1.maven仓库,2.过滤器,3.拦截器,4.监听器,5.实例化,6.测试,7.拦截器与过滤器的区别1.maven仓库 2.过滤器 过滤器的英文名称为 Filter, 是 Servlet 技术中最实用的技术。 如同它的名字一样,过滤器是处于客户端和服务器资源文件之间的一道过滤网,帮助我们过滤掉一些不符合要求的请求,通常用作 Session 校验,判断用户权限,如果不符合设定条件,则会被拦截到特殊的地址或者基于特殊的响应。 3.拦截器 Java中的拦截器是动态拦截 action 调用的