springboot 차단 인증 로그인 예시

8533 단어 springboot
문서를 정리하고springboot 구현 차단기 검증 로그인 예시를 스크랩하여 공유를 간소화합니다.
jar 패키지를 추가합니다. 이jar 패키지는 필수가 아닙니다. 차단기에서 사용할 뿐입니다. 사용하지 않으면 전혀 도입하지 않아도 됩니다.

<dependency> 
      <groupId>org.apache.commons</groupId> 
      <artifactId>commons-lang3</artifactId> 
      <version>3.5</version> 
    </dependency> 
springboot는 기본적으로 Tomcat입니다. jetty를 사용하려면 도입해야 합니다.

<dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.1.0</version> 
    </dependency> 
1. 로그인 검증을 예로 들면 먼저 @Auth 메모를 만듭니다.

package com.demo.interceptor; 
 
import java.lang.annotation.*; 
 
/** 
 * Created by huguoju on 2016/12/30. 
 *  @Auth  
 */ 
@Target({ElementType.TYPE, ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
public @interface Auth { 
} 
2, 차단기에서 사용할 Constants 만들기

package com.demo.util; 
 
/** 
 * Created by huguoju on 2016/12/30. 
 */ 
public interface Constants { 
  int MAX_FILE_UPLOAD_SIZE = 5242880; 
  String MOBILE_NUMBER_SESSION_KEY = "sessionMobileNumber"; 
  String USER_CODE_SESSION_KEY = "userCode"; 
  String SESSION_KEY = "sessionId"; 
} 
3. 세션에 저장할 필드를 만드는 SessionData

package com.demo.model; 
 
import lombok.Data; 
 
/** 
 * Created by huguoju on 2016/12/30. 
 */ 
@Data 
public class SessionData { 
  private Integer userCode; 
  private String mobileNumber; 
} 

4. 로그인 차단 실현

package com.demo.interceptor; 
 
import com.demo.model.SessionData; 
import com.demo.util.RedisUtil; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 
import org.springframework.web.method.HandlerMethod; 
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 
 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.lang.reflect.Method; 
 
import static com.demo.util.Constants.MOBILE_NUMBER_SESSION_KEY; 
import static com.demo.util.Constants.SESSION_KEY; 
import static com.demo.util.Constants.USER_CODE_SESSION_KEY; 
 
/** 
 * Created by huguoju on 2016/12/30. 
 */ 
@Component 
public class LoginInterceptor extends HandlerInterceptorAdapter { 
  @Autowired 
  private RedisUtil redisUtils; 
  private final static String SESSION_KEY_PREFIX = "session:"; 
  public boolean preHandle(HttpServletRequest request, 
               HttpServletResponse response, Object handler) throws Exception { 
    if (!handler.getClass().isAssignableFrom(HandlerMethod.class)) { 
      return true; 
    } 
    handlerSession(request); 
 
    final HandlerMethod handlerMethod = (HandlerMethod) handler; 
    final Method method = handlerMethod.getMethod(); 
    final Class<?> clazz = method.getDeclaringClass(); 
    if (clazz.isAnnotationPresent(Auth.class) || 
        method.isAnnotationPresent(Auth.class)) { 
      if(request.getAttribute(USER_CODE_SESSION_KEY) == null){ 
  
         throw new Exception(); 
         
      }else{ 
        return true; 
      } 
    } 
 
    return true; 
 
  } 
  public void handlerSession(HttpServletRequest request) { 
    String sessionId = request.getHeader(SESSION_KEY); 
    if(org.apache.commons.lang3.StringUtils.isBlank(sessionId)){ 
      sessionId=(String) request.getSession().getAttribute(SESSION_KEY); 
    } 
    if (org.apache.commons.lang3.StringUtils.isNotBlank(sessionId)) { 
      SessionData model = (SessionData) redisUtils.get(SESSION_KEY_PREFIX+sessionId); 
      if (model == null) { 
        return ; 
      } 
      request.setAttribute(SESSION_KEY,sessionId); 
      Integer userCode = model.getUserCode(); 
      if (userCode != null) { 
        request.setAttribute(USER_CODE_SESSION_KEY, Long.valueOf(userCode)); 
      } 
      String mobile = model.getMobileNumber(); 
      if (mobile != null) { 
        request.setAttribute(MOBILE_NUMBER_SESSION_KEY, mobile); 
      } 
    } 
    return ; 
  } 
} 
5. 차단기 구성

package com.demo.interceptor; 
 
import org.hibernate.validator.HibernateValidator; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.MessageSource; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.PropertySource; 
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; 
import org.springframework.context.support.ReloadableResourceBundleMessageSource; 
import org.springframework.validation.Validator; 
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; 
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; 
import org.springframework.web.servlet.ViewResolver; 
import org.springframework.web.servlet.config.annotation.*; 
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; 
import org.springframework.web.servlet.view.InternalResourceViewResolver; 
 
/** 
 * Created by huguoju on 2016/12/30. 
 */ 
@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages = "com.demo.controller") 
@PropertySource(value = "classpath:application.properties", 
    ignoreResourceNotFound = true,encoding = "UTF-8") 
public class MvcConfig extends WebMvcConfigurerAdapter { 
  private static final Logger logger = LoggerFactory.getLogger(MvcConfig.class); 
  @Autowired 
  LoginInterceptor loginInterceptor; 
 
  /** 
 
   * <p> 
   *     
   * </p> 
   * 
   * @return 
   */ 
  @Bean 
  public ViewResolver viewResolver() { 
    logger.info("ViewResolver"); 
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
    viewResolver.setPrefix("/WEB-INF/jsp/"); 
    viewResolver.setSuffix(".jsp"); 
    return viewResolver; 
  } 
 
  /** 
   *   
   * @param registry 
   */ 
  @Override 
  public void addInterceptors(InterceptorRegistry registry) { 
    //   
    registry.addInterceptor(loginInterceptor) 
        .addPathPatterns("/**") 
     .excludePathPatterns("/configuration/ui"); 
 
  } 
 
  @Override 
  public void addCorsMappings(CorsRegistry registry) { 
    registry.addMapping("/**") 
        .allowedOrigins("*") 
        .allowedHeaders("*/*") 
        .allowedMethods("*") 
        .maxAge(120); 
  } 
 
  /** 
   *   
   * @param registry 
   */ 
  @Override 
  public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    logger.info("addResourceHandlers"); 
    registry.addResourceHandler("/swagger-ui.html") 
        .addResourceLocations("classpath:/META-INF/resources/"); 
    registry.addResourceHandler("/webjars/**") 
        .addResourceLocations("classpath:/META-INF/resources/webjars/"); 
  } 
 
} 
이상에서 완성되었습니다. 테스트 시 Login Interceptor에서 인터럽트를 끊고 controller나 방법에 @Auth 주석을 추가할 수 있습니다.
controller에 추가된 후 이 controller의 모든 요청은 로그인을 검증합니다. 방법에 이 방법만 요청할 때 검증합니다.

@Auth 
@RestController 
public class TestController {  } 
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기