发布:2022/3/17 15:35:28作者:管理员 来源:本站 浏览次数:1607
SpringBoot中使用过滤器和拦截器(boot项目响应乱码问题解决)
过滤器(Filter)和拦截器(Interceptor)是Web项目中常用的两个功能!
Filter:是Servlet规范提供的一种技术(接口)。作用在请求到达目标资源之前,Filter可以拦截请求进行过滤处理,然后放行,那么请求会到达目标资源;作用在响应从服务器发出之前,Filter可以进行过滤处理,然后放行,响应会到达客户端。
Filter的常见使用场景敏感词过滤、ip过滤、压缩响应 !
现有这样一个Api, 要实现的功能是计算请求耗时
@GetMapping("/test/{name}")
public String getName(@PathVariable("name") String name){
System.out.println("输出名字"+name);
return "大帅哥"+name;
}
1. 实现过滤器
/**
* @Author: zhihao
* @Date: 2019/12/18 16:56
* @Description: 过滤器1
* @Versions 1.0
**/
@Component //交给容器 不然不会生效, 过滤器依赖容器才能使用
@WebFilter(urlPatterns = {"/*"}) //拦截路径 拦截所有请求
public class TestFilter1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化方法,在过滤器对象被创建时,服务器软件会执行一次");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
long start = System.currentTimeMillis();
//执行过滤的方法,每次拦截到请求,都会执行这个方法
String name = servletRequest.getParameter("name");
System.out.println("请求参数为:"+name);
//放行请求
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("结束了拦截器,耗时:"+(System.currentTimeMillis()-start));
}
@Override
public void destroy() {
System.out.println("在过滤器对象被销毁时,服务器软件会执行一次");
}
}
2. 启动测试
发现项目一启动就输出了:初始化方法,在过滤器对象被创建时,服务器软件会执行一次, 项目关闭时输出:在过滤器对象被销毁时,服务器软件会执行一次,每次进行请求与响应的时候,都会执行doFilter()方法
可以配置多个过滤器,放行是放行给下一个过滤器!
拦截器
1. 自定义类实现HandlerInterceptor拦截器
@Component
public class TestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("controller之前调用 1");
return true; //返回true是正常放行
// return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("controller执行完毕后调用 2");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("调用目标方法,完成视图渲染后执行 3");
}
}
2. 配置拦截器配置类
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
@Autowired
private TestInterceptor testInterceptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
List<String> lanjluj = new LinkedList<>();
lanjluj.add("/**");
List<String> nolanj = new LinkedList<>();
nolanj.add("/nolanj");
registry.addInterceptor(testInterceptor) //可以添加多个拦截器 每个拦截单独配置路径
.addPathPatterns(lanjluj) //添加拦截路径
.excludePathPatterns(nolanj); //添加不拦截路径
}
/*@Bean //解决响应中文乱码
public HttpMessageConverter<String> responseBodyStringConverter() {
StringHttpMessageConverter converter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
return converter;
}
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(responseBodyStringConverter());
}*/
}
3. 启动测试看看是否拦截到控制层请求
扩展资料:
过滤器与拦截器执行顺序
过滤器要先于拦截器执行,晚于拦截器结束。
32361-20180530095349427-444141538.png
扩展资料:
过滤器与拦截器执行顺序
过滤器要先于拦截器执行,晚于拦截器结束。
© Copyright 2014 - 2024 柏港建站平台 ejk5.com. 渝ICP备16000791号-4