springboot 차단 기 는 redisTemplate 의 해결 방법 을 주입 할 수 없습니다.

작업 중 에 저 희 는 로그 인 차단 인증 이나 다른 차단 인증 기능 을 자주 해 야 합 니 다.springboot 프로젝트 를 바탕 으로 저 희 는 redis 와 결합 하여 분포 식 차단 을 생각 하고 사용자 로그 인 이나 검증 이 필요 한 정 보 를 redis 에 넣 을 생각 을 하기 쉽 습 니 다.그러나 차단 기 를 쓸 때 redisTemplate 가 주입 되 지 않 는 것 을 발 견 했 고 마지막 으로 자 료 를 찾 아 보 니 springboot 차단 기 는 Bean 이 정례 화 되 기 전에 실 행 된 것 이기 때문에 Bean 인 스 턴 스 를 주입 할 수 없 었 다.
먼저 문 제 를 보고 차단 기 를 새로 만 든 다음 redisTemplate 를 주입 합 니 다.

/**
 * @author: lockie
 * @Date: 2019/8/13 16:16
 * @Description:        
 */
@Component
public class AccessLimitIntercept implements HandlerInterceptor {
    private static final Logger logger = LoggerFactory.getLogger(AccessLimitIntercept.class);
 
    @Autowired
    private StringRedisTemplate redisTemplate;
 
    /**
     *          ip        
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        try {
 
            String test = redisTemplate.opsForValue().get("test");
            logger.info(test);
        } catch (Exception e) {
            logger.error("API        ,    :", e);
            throw new ParameterException(e);
        }
        return true;
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
 
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
 
    }
 
    private boolean setResponse(Results results, HttpServletResponse response) throws IOException {
        ServletOutputStream outputStream = null;
        try {
            response.setHeader("Content-type", "application/json; charset=utf-8");
            outputStream = response.getOutputStream();
            outputStream.write(JsonUtil.toJson(results).getBytes("UTF-8"));
        } catch (Exception e) {
            logger.error("setResponse    ", e);
            return false;
        } finally {
            if (outputStream != null) {
                outputStream.flush();
                outputStream.close();
            }
        }
        return true;
    }
}
그리고 차단 기 를 설정 합 니 다.차단 기 config 클래스 를 새로 만 듭 니 다.모든 url 을 차단 합 니 다.

@Configuration
public class WebFilterConfig implements WebMvcConfigurer {
 
	/**
	 *              
	 * @param registry
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new AccessLimitIntercept()).addPathPatterns("/**");
	}
 
}
새 controller 에 인 터 페 이 스 를 추가 하고 postman 호출 인 터 페 이 스 를 사용 합 니 다.

@RestController
@RequestMapping("/")
public class PingController extends BaseController {
 
	@GetMapping(value = "/ping")
	public Results ping() {
		return succeed("pong", "");
	}
 
}
postman 호출/ping 인 터 페 이 스 를 사용 하여 시스템 오 류 를 되 돌려 줍 니 다.

콘 솔 에서 빈 포인터 의 오 류 를 발 견 했 습 니 다.포 지 셔 닝 오 류 는 redis 에 있 는 key 가 test 의 값 을 가 져 오 려 고 할 때 redisTemplate 가 비어 있 지 않 고 주입 되 지 않 은 것 을 발 견 했 습 니 다.

문제 해결:
차단기 가 bean 실례 화 전에 실 행 된 것 을 알 고 있 으 면,차단기 가 실 행 될 때 실례 화 된 차단기 Bean 을 차단기 설정 클래스 에서 먼저 실례 화 된 차단 기 를 실행 한 다음 에 가 져 옵 니 다

@Configuration
public class WebFilterConfig implements WebMvcConfigurer {
 
	/**
	 *              ,            redistemplate
	 * @return
	 */
	@Bean
	public AccessLimitIntercept getAccessLimitIntercept() {
		return new AccessLimitIntercept();
	}
 
	/**
	 *              
	 * @param registry
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(getAccessLimitIntercept()).addPathPatterns("/**");
	}
 
 
}
postman 으로 다시 요청 하면 접근 할 수 있 습 니 다.

springboot 차단기 가 redisTemplate 에 주입 되 지 않 는 해결 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 springboot 차단기 가 redisTemplate 내용 을 주입 할 수 없습니다.이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기