springBoot 使用拦截器

1.自定义拦截器

package com.peak.security.handler;
import com.peak.common.Constants;
import com.peak.mapper.user.UserTokenMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.security.auth.message.AuthException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @ClassName: TokenInterceptorHander
 * @Description: 判断token拦截器
 * @Author: jql
 * @Date: 2020/5/15 9:55
 * @Version: 1.0
 */
@Component
public class TokenInterceptorHander extends HandlerInterceptorAdapter {

    @Autowired
    private UserTokenMapper userTokenMapper;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取用户凭证
        String token = request.getHeader(Constants.TOKEN_NAME);
        if(StringUtils.isEmpty(token)) {
            throw new AuthException(Constants.TOKEN_NAME + "不能为空");
        }
        //查看token是否有效

        return true;
    }
}

2.将拦截器加入到springBoot中

package com.peak.common.core.configurer;

import com.peak.security.handler.TokenInterceptorHander;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName: WebConfig
 * @Description: 自定义拦截器
 * @Author: jql 
 * @Date: 2020/5/15 10:50
 * @Version: 1.0
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Resource
    private TokenInterceptorHander tokenInterceptorHander;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        //添加白名单
        List<String> patterns = new ArrayList<>();
        patterns.add("/login");
        patterns.add("/swagger*/**");
        patterns.add("/webjars/**");
        patterns.add("/getVerify");

        // 自定义拦截器,添加拦截路径和排除拦截路径
        registry.addInterceptor(tokenInterceptorHander).addPathPatterns("/**").excludePathPatterns(patterns);
    }
}

问题:
1.自定义的拦截器不起作用
如果引入包存在继承WebMvcConfigurationSupport的拦截器,那么在项目中再去实现implements WebMvcConfigurer接口就会出现拦截器无法加载的问题

解决办法:
将拦截器也继承WebMvcConfigurationSupport

但问题又来了,因为一但继承WebMvcConfigurationSupport类后,springBoot的webMVC自动配置失效了。表现为:访问不了js/css/html等静态资源。

所以在最后解决办法不在继承WebMvcConfigurationSupport,改为是实现WebMvcConfigurer。具体实现看上面代码。

分析原因:
在spring boot的自定义配置类继承 WebMvcConfigurationSupport 后,发现自动配置的静态资源路径(classpath:/META/resources/,classpath:/resources/,classpath:/static/,classpath:/public/)不生效。
看下自动配置类的定义:
在这里插入图片描述
可以看出springBoot 自动配置类 WebMvcAutoConfiguration 上有条件注解:
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
这个注解的意思是在项目类路径中缺少WebMvcConfigurationSupport类型的bean时改自动配置类才会生效,所以继承 WebMvcConfigurationSupport 后需要自己再重写相应的方法。

如果想要使用自动配置生效,又要按自己的需要重写某些方法,比如增加 viewController ,则可以自己的配置类可以继承 WebMvcConfigurerAdapter 这个类。不过在spring5.0版本后这个类被丢弃了 WebMvcConfigurerAdapter ,虽然还可以用,但是看起来不好。

所以最终选择实现WebMvcConfigurer。

参考:https://www.cnblogs.com/deng720/p/8989388.html

猜你喜欢

转载自blog.csdn.net/weixin_43727535/article/details/106141989