package com.mes.common.filter; import com.mes.common.utils.RedisUtil; import com.mes.userinfo.service.SysUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import javax.annotation.Resource; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @Author : zhoush * @Date: 2024/4/10 9:42 * @Description: */ @Component public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { // 此处解释为什么不去实现Filter接口,因为在某些情况下会过滤两次,执行两次Filter里面的方法,所以我们选择继承SpringSecurity中的OncePerRequestFilter @Autowired private RedisUtil redisUtil; @Resource private SysUserService sysUserService; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { //获取token String token = request.getHeader("token"); // // if (!StringUtils.hasText(token)) { // //放行 // filterChain.doFilter(request, response); // return; // 此处加上return好处是后面结果返回的时候就不会再走一遍此过滤器的方法了 // } // //解析token // String userid; // try { // Claims claims = JwtUtil.getClaimByToken(token); // userid = claims.getSubject(); // } catch (Exception e) { // e.printStackTrace(); // throw new RuntimeException("token非法"); // } // //从redis中获取用户信息 // String redisKey = "login:" + userid; // LoginUser loginUser = redisUtil.getCacheObject(redisKey); // if (Objects.isNull(loginUser)) { // response.setHeader("token", ""); // throw new RuntimeException("用户未登录"); // } // //将用户信息放入当前线程 // UserInfoUtils.set(loginUser.getUser()); // //存入SecurityContextHolder,以供后面的过滤器使用 // List permissionKeyList = sysUserService.getUserAuthorityInfo(Long.parseLong(userid)); // List authorities = permissionKeyList.stream(). // map(SimpleGrantedAuthority::new) // .collect(Collectors.toList()); // UsernamePasswordAuthenticationToken authenticationToken = // new UsernamePasswordAuthenticationToken(loginUser, null, authorities); // SecurityContextHolder.getContext().setAuthentication(authenticationToken); //放行 filterChain.doFilter(request, response); } }