Le projet a récemment ajouté une fonction de liste noire et blanche IP. J'ai découvert que si l'intercepteur de filtrage IP renvoie false, le front-end affichera plusieurs domaines. J'ai essayé de modifier la classe de configuration MVC et j'ai constaté que cela ne fonctionnait toujours pas. . Enfin, j'ai ajouté un jugement à l'intercepteur et c'était bien
1 2 3 4 5 6 7 | @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
if (!(handler instanceof HandlerMethod)) {
return true;
}
}
|
Copier après la connexion
Classe de configuration WebMvcConfigurer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | @Configuration
@RestControllerAdvice
public class WebMvcConfig implements WebMvcConfigurer {
@Resource
private IpFilterInterceptor ipFilterInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(ipFilterInterceptor)
.addPathPatterns( "/**" )
.order(5);
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping( "/**" )
.allowCredentials(true)
.allowedOriginPatterns( "*" )
.allowedMethods( "*" )
.allowedHeaders( "*" )
.maxAge(3600);
}
}
|
Copier après la connexion
L'intercepteur IP avant modification
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | @Component
public class IpFilterInterceptor implements HandlerInterceptor {
private boolean enable;
private boolean isWhiteList;
private List<String> filters;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
if (!enable) {
return true;
}
String ip = Servlets.getRemoteAddr(request);
if (Const.LOCALHOST_IP_V4.equals(ip)) {
return true;
}
boolean contains = false;
for (String filter : filters) {
if (Strings.isBlank(filter)) {
continue ;
}
contains = Utils.checkIpIn(ip, filter);
if (contains) {
break ;
}
}
boolean pass;
if (isWhiteList) {
pass = contains;
} else {
pass = !contains;
}
if (!pass) {
response.setContentType(StandardContentType.APPLICATION_JSON);
Servlets.transfer(response, HttpWrapper.of(ResultCode.IP_BAN).toJsonString().getBytes());
}
return pass;
}
}
|
Copier après la connexion
L'intercepteur IP modifié
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | @Component
public class IpFilterInterceptor implements HandlerInterceptor {
private boolean enable;
private boolean isWhiteList;
private List<String> filters;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
if (!enable) {
return true;
}
if (!(handler instanceof HandlerMethod)) {
return true;
}
String ip = Servlets.getRemoteAddr(request);
if (Const.LOCALHOST_IP_V4.equals(ip)) {
return true;
}
boolean contains = false;
for (String filter : filters) {
if (Strings.isBlank(filter)) {
continue ;
}
contains = Utils.checkIpIn(ip, filter);
if (contains) {
break ;
}
}
boolean pass;
if (isWhiteList) {
pass = contains;
} else {
pass = !contains;
}
if (!pass) {
response.setContentType(StandardContentType.APPLICATION_JSON);
Servlets.transfer(response, HttpWrapper.of(ResultCode.IP_BAN).toJsonString().getBytes());
}
return pass;
}
}
|
Copier après la connexion
Enfin, la cause du le problème est que l'intercepteur doit juger le gestionnaire dans preHandle. Le type doit être HandlerMethod pour passer
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!