Springboot过滤器和拦截器详解及使用场景

拦截器(Interceptor):可以拿到你请求的控制器和方法,却拿不到请求方法的参数。

切片(Aspect): 可以拿到方法的参数,但是却拿不到http请求和响应的对象

Springboot过滤器和拦截器详解及使用场景_第1张图片

二、过滤器

=====

两种方式:

1、使用spring boot提供的FilterRegistrationBean注册Filter

2、使用原生servlet注解定义Filter

两种方式的本质都是一样的,都是去FilterRegistrationBean注册自定义Filter

方式一: (使用spring boot提供的FilterRegistrationBean注册Filter )

①、先定义Filter:

package com.corwien.filter;

import javax.servlet.*;

import java.io.IOException;

public class MyFilter implements Filter {

@Override public void init(FilterConfig filterConfig) throws ServletException {

}

@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // do something 处理request 或response

// doFilter()方法中的servletRequest参数的类型是ServletRequest,需要转换为HttpServletRequest类型方便调用某些方法

System.out.println(“filter1”); // 调用filter链中的下一个filter

HttpServletRequest request = (HttpServletRequest) servletRequest;

HttpServletResponse response = (HttpServletResponse) servletResponse;

String ip = request.getRemoteAddr();

String url = request.getRequestURL().toString();

SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);

Date d = new Date();

String date = sdf.format(d);

System.out.printf(“%s %s 访问了 %s%n”, date, ip, url);

filterChain.doFilter(request, response);

}

@Override public void destroy() {

}

}

②、注册自定义Filter

@Configuration

public class FilterConfig {

@Bean

public FilterRegistrationBean registrationBean() {

** FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new** MyFilter());

filterRegistrationBean.addUrlPatterns(“/*”);

return filterRegistrationBean;

}

}

方式一的①②步骤可以用下面这段代码代替:

@Configuration public class FilterConfig {

@Bean public FilterRegistrationBean registFilter() {

FilterRegistrationBean registration **= new FilterRegistrationBean();

registration.setFilter(new** LogCostFilter());

registration.addUrlPatterns(“/*”);

registration.setName(“LogCostFilter”);

registration.setOrder(1); return registration;

}

}

public class LogCostFilter implements Filter {

@Override public void init(FilterConfig filterConfig) throws ServletException {

}

@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { long start = System.currentTimeMillis();

filterChain.doFilter(servletRequest,servletResponse);

System.out.println(“Execute cost=”+(System.currentTimeMillis()-start));

}

@Override public void destroy() {

}

方式二:(使用原生servlet注解定义Filter 

// 注入spring容器

@Component // 定义filterName 和过滤的url

@WebFilter(filterName = “my2Filter” ,urlPatterns = “/*”) public class My2Filter 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(“filter2”);

}

@Override public void destroy() {

}

}

这里直接用**@WebFilter就可以进行配置,同样,可以设置url匹配模式,过滤器名称等。这里需要注意一点的是@WebFilter这个注解是Servlet3.0的规范,并不是Spring boot提供的。除了这个注解以外,我们还需在启动类中加另外一个注解:@ServletComponetScan,指定扫描的包。**

三、拦截器的配置

========

实现拦截器可以通过继承 HandlerInterceptorAdapter类也可以通过实现HandlerInterceptor这个接口。另外,如果preHandle方法return true,则继续后续处理。

首先我们实现拦截器类:

public class LogCostInterceptor implements HandlerInterceptor { long start = System.currentTimeMillis();

@Override public boolean preHandle(HttpServletReque 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 st httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {

start = System.currentTimeMillis(); return true;

}

@Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

System.out.println(“Interceptor cost=”+(System.currentTimeMillis()-start));

}

@Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

你可能感兴趣的:(Java,经验分享,面试,java)