content: package com.platform.admin.filter;
  
  import com.alibaba.fastjson.JSON;
  import com.baomidou.mybatisplus.extension.api.R;
  import com.platform.admin.exception.TokenIsExpiredException;
  import com.platform.admin.util.JwtTokenUtils;
  import org.springframework.security.authentication.AuthenticationManager;
  import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
  import org.springframework.security.core.authority.SimpleGrantedAuthority;
  import org.springframework.security.core.context.SecurityContextHolder;
  import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
  
  import javax.servlet.FilterChain;
  import javax.servlet.ServletException;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import java.io.IOException;
  import java.util.Collections;
  
  
  public class JWTAuthorizationFilter extends BasicAuthenticationFilter {
  
      public JWTAuthorizationFilter(AuthenticationManager authenticationManager) {
          super(authenticationManager);
      }
  
      @Override
      protected void doFilterInternal(HttpServletRequest request,
                                      HttpServletResponse response,
                                      FilterChain chain) throws IOException, ServletException {
  
          String tokenHeader = request.getHeader(JwtTokenUtils.TOKEN_HEADER);
          // 如果请求头中没有Authorization信息则直接放行
          if (tokenHeader == null || !tokenHeader.startsWith(JwtTokenUtils.TOKEN_PREFIX)) {
              chain.doFilter(request, response);
              return;
          }
          // 如果请求头中有token，则进行解析，并且设置认证信息
          try {
              SecurityContextHolder.getContext().setAuthentication(getAuthentication(tokenHeader));
          } catch (TokenIsExpiredException e) {
              //返回json形式的错误信息
              response.setCharacterEncoding("UTF-8");
              response.setContentType("application/json; charset=utf-8");
              response.getWriter().write(JSON.toJSONString(R.failed(e.getMessage())));
              response.getWriter().flush();
              return;
          }
          super.doFilterInternal(request, response, chain);
      }
  
      // 这里从token中获取用户信息并新建一个token
      private UsernamePasswordAuthenticationToken getAuthentication(String tokenHeader) throws TokenIsExpiredException {
          String token = tokenHeader.replace(JwtTokenUtils.TOKEN_PREFIX, "");
          boolean expiration = JwtTokenUtils.isExpiration(token);
          if (expiration) {
              throw new TokenIsExpiredException("登录时间过长，请退出重新登录");
          }
          else {
              String username = JwtTokenUtils.getUsername(token);
              String role = JwtTokenUtils.getUserRole(token);
              if (username != null) {
                  return new UsernamePasswordAuthenticationToken(username, null,
                          Collections.singleton(new SimpleGrantedAuthority(role))
                  );
              }
          }
          return null;
      }
  
  }
  