Skip to main content

过滤器和拦截器

拦截器

tip

如果遇到路由404,那么会默认访问对应路由下的静态资源,这导致在访问404接口时拦截器会跑两次。(问题不大,但是强迫症表示不能接受。)

可以通过配置静态资源路径的方式去解决。

application.yml
spring:
mvc:
static-path-pattern: /static/**

写拦截器

package com.kinda.springBootDemo.interceptor;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
@Slf4j
public class Oauth2Interceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("鉴权标识符: {}", request.getHeader("authorization"));
return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}

注册自定义拦截器

package com.kinda.springBootDemo.interceptor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
* 配置拦截器
* 此处绑定接口鉴权部分
*/
@Configuration
public class interceptor implements WebMvcConfigurer {
@Autowired
private Oauth2Interceptor oauth2Interceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(oauth2Interceptor);
}
}

过滤器

使用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;
}
}