Spring拦截器解析token设置用户id

1、拦截器代码

@Slf4j
@Component
public class AuthHeaderSettingFilter implements Filter {

    //获取token的userId
    public String getUserIdByToken(HttpServletRequest request) {
        // 获取当前的用户
        String accessToken = request.getHeader("accessToken");
        if (StringUtils.isNotBlank(accessToken)) {
            //解析token获取userId,具体根据项目而定
            String userId = JwtHelpUtil.getUserId(accessToken);
            if (StringUtils.isBlank(userId)) {
                return "";
            }
            return userId;
        }
        return "";
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("----authHeaderSettingFilter过滤器初始化----");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        //log.info("经过AuthHeaderSettingFilter");
        HttpServletRequest req = (HttpServletRequest) request;
        HeaderMapRequestWrapper requestWrapper = new HeaderMapRequestWrapper(req);
        //获得请求参数中的token值
        String userId = getUserIdByToken(req);
        log.info("userId:{}", userId);
        //如果请求中带有这个参数,则进行过滤加一个header头
        requestWrapper.addHeader("userId", userId);
        chain.doFilter(requestWrapper, response); // Goes to default servlet.
    }

    @Override
    public void destroy() {
        log.info("----authHeaderSettingFilter过滤器销毁----");
    }
}

2、注册拦截器

/**
 * 拦截器配置
 */
@Configuration
public class MvcConfig implements WebMvcConfigurer {
    @Autowired
    private AuthHeaderSettingFilter authHeaderSettingFilter;

    /**
     * 配置过滤器
     *
     * @return
     */
    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(authHeaderSettingFilter);
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }

    /**
     * 定义全局http返回编码
     *
     * @param configurer
     */
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorParameter(true)
                // 禁用accept协商方式,即不关心前端传的accept值
                .ignoreAcceptHeader(true)
                // 哪个放在前面,哪个的优先级就高。当上面这个accept未禁用时,若请求传的accept不能覆盖下面两种,则会出现406错误
                .defaultContentType(MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML)
                // 根据传参mediaType来决定返回样式
                .parameterName("mediaType")
                // 当acceptHeader未禁用时,accept的值与mediaType传参的值不一致时,以mediaType的传值为准
                // mediaType值可以不传,为空也行,但是不能是json/xml之外的其他值
                .mediaType("json", MediaType.APPLICATION_JSON)
                .mediaType("xml", MediaType.APPLICATION_XML);
    }
}

3、工具类

public class HeaderMapRequestWrapper extends HttpServletRequestWrapper {
    /**
     * construct a wrapper for this request
     *
     * @param request
     */
    public HeaderMapRequestWrapper(HttpServletRequest request) {
        super(request);
    }

    private Map<String, String> headerMap = new HashMap<String, String>();

    /**
     * add a header with given name and value
     *
     * @param name
     * @param value
     */
    public void addHeader(String name, String value) {
        headerMap.put(name, value);
    }

    @Override
    public String getHeader(String name) {
        String headerValue = super.getHeader(name);
        if (headerMap.containsKey(name)) {
            headerValue = headerMap.get(name);
        }
        return headerValue;
    }

    /**
     * get the Header names
     */
    @Override
    public Enumeration<String> getHeaderNames() {
        List<String> names = Collections.list(super.getHeaderNames());
        for (String name : headerMap.keySet()) {
            names.add(name);
        }
        return Collections.enumeration(names);
    }

    @Override
    public Enumeration<String> getHeaders(String name) {
        List<String> values = Collections.list(super.getHeaders(name));
        if (headerMap.containsKey(name)) {
            values.add(headerMap.get(name));
        }
        return Collections.enumeration(values);
    }

}

4、userId如何直接获取(@RequestHeader(“userId”)String userId)

    @PostMapping("/approval")
    public String approval(@RequestHeader("userId")String userId){
        return applyService.approval(userId);
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值