springmvc는 차단기의 대상을 컨트롤러나 서비스에 우아하게 전달합니다

2411 단어 JAVA
1. 리퀘스트를 사용하여 데이터를 휴대할 수 있습니다.하지만springmvc는 추천하지 않습니다.
2. Threadlocal 스레드를 사용하여 응답을 요청하기 전에 같은 스레드에 있습니다.
예를 들어 로그인 차단기에서 preHandle 방법에서 로그인에 성공한 후 실행하기 전에user 대상을 controller나 서비스에 전송하려고 합니다
새 클래스 LoginInterceptor
public class LoginInterceptor extends HandlerInterceptorAdapter {

    private JwtProperties jwtProperties;
    private JwtProperties jwtProperties;

    //  , 
    private static final ThreadLocal tl = new ThreadLocal<>();

    public LoginInterceptor(JwtProperties jwtProperties) {
        this.jwtProperties = jwtProperties;
    }

    @Override
    public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //  token
        String token = CookieUtils.getCookieValue(request, jwtProperties.getCookieName());
        if (StringUtils.isBlank(token)) {
            //  , 401
            response.setStatus(HttpStatus.UNAUTHORIZED.value());
            return false;
        }
        //  token, 
        try {
            //  , 
            UserInfo user = JwtUtils.getUserInfo(jwtProperties.getPublicKey(),token);
            //  
            tl.set(user);
            //request.setAttribute("user", user);
            return true;
        } catch (Exception e){
            //  , , 401
            response.setStatus(HttpStatus.UNAUTHORIZED.value());
            return false;
        }

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // , 
        tl.remove();
    }

    public static UserInfo getLoginUser() {
        return tl.get();
    }
}
  • 여기서 우리는 ThreadLocal를 사용하여 조회된 사용자 정보를 저장하고 스레드 내에서 공유하기 때문에 요청이 도착하면 User
  • 를 공유할 수 있다
  • User 정보를 얻기 위한 정적 방법Controller
  • springmvc를 설정하여 차단기
    @Configuration
    @EnableConfigurationProperties(JwtProperties.class)
    public class MvcConfig implements WebMvcConfigurer {
    
        @Autowired
        private JwtProperties jwtProperties;
    
        @Bean
        public LoginInterceptor loginInterceptor() {
            return new LoginInterceptor(jwtProperties);
        }
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(loginInterceptor()).addPathPatterns("/**");
        }
    }

    좋은 웹페이지 즐겨찾기