好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SpringBoot 拦截器返回false显示跨域问题

​项目最近添加了一个ip黑白名单的功能, 发现如果ip过滤的拦截器返回 false 后前端会显示跨域, 尝试修改MVC配置类后发现还是不行, 最后在拦截器加了个判断就可以了 ↓↓↓

?

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 ;

     }

}

  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) {

         // IP拦截器

         registry.addInterceptor(ipFilterInterceptor)

                 .addPathPatterns( "/**" )

                 .order( 5 );

     }

     @Override

     public void addCorsMappings(CorsRegistry registry) {

         registry.addMapping( "/**" )

                 .allowCredentials( true )

                 .allowedOriginPatterns( "*" )

                 .allowedMethods( "*" )

                 .allowedHeaders( "*" )

                 .maxAge( 3600 );

     }

}

修改前的 IP拦截器

?

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;

     }

}

修改后的 IP拦截器

?

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;

     }

}

最后, 问题的原因是出在了拦截器身上 需要在 preHandle 中 判断 handler 的类型必须是 HandlerMethod 的话才能通过

到此这篇关于SpringBoot 拦截器返回false显示跨域问题的文章就介绍到这了,更多相关SpringBoot 跨域问题内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

原文链接:https://juejin.cn/post/7088566443154866213

查看更多关于SpringBoot 拦截器返回false显示跨域问题的详细内容...

  阅读:12次