8.17 사용자 처리 및 board
mvc_part11_common 프로젝트
컨트롤러 스캔시
<context:component-scan base-package="com.bitc.*.controller" />
c:url 이용해서 절대경로로 지정해준다.
<a href="<c:url value='/user/signIn'/>">SIGN IN</a>
<a href="<c:url value='/user/signUp'/>">SIGN UP</a>
location.href='<c:url value="/user/signOut"/>';
log.info("target : {}", pjp.getTarget()); // {} : 뒤에 데이터를 추가해서 문자열로 완성시켜줌. // 어디에서 호출된건지
아이디길이, 비밀번호 길이 처럼
정책에 따라 변경될 수 있는 내용은 interceptor에서 처리한다.
이렇게 하면 로직 손대지 않고 할 수 있어서 유지관리 쉽다.
* 자바스크립트에서도 유효성검사 진행해야함!
*interceptor 이용시 interceptor-context.xml에 등록 꼭 하기
회원가입시 비밀번호 확인 처리
Interceptor에서 확인 후 pw와 repw가 일치하지 않으면 지정된 페이지로 포워드 한다.
RequestDispatcher rd = request.getRequestDispatcher(
"/WEB_INF/views/user/signUp.jsp"
);
message = "비밀번호가 일치하지 않습니다.";
request.setAttribute("message", message);
rd.forward(request, response);
중복 로그인 처리
MySessionEventListener 클래스 생성 (implements HttpSessionListener, HttpSessionAttributeListener)
web.xml에 com.bitc.common.session.MySessionEventListener 추가
정적 인스턴스 생성
public static Hashtable<String, Object> sessionRepository; // 로그인된 사용자 정보 저장할 공간
static {
sessionRepository = new Hashtable<>();
}
attributeAdded에서 Hashtable에 넣어준다.
attributeRemoved에서는 remove.
public static boolean expireDuplicatedSession(String uid,String sessionId) {
System.out.println("Active Session Count : " + sessionRepository.size());
Enumeration<Object> enumeration = sessionRepository.elements(); // elements() : 등록된 value값 나열해서 전달
while(enumeration.hasMoreElements()) {
HttpSession session = (HttpSession) enumeration.nextElement();
UserVO user = (UserVO)session.getAttribute("userInfo");
// 사용자 정보가 session에 존재하고
// 새로 로그인 하려는 uid랑 일치하는 사용자일때
if(user != null && user.getUid().equals(uid)) {
if(!session.getId().equals(sessionId)) {
// 다른 브라우저에서 로그인 요청
System.out.printf("login - user %s, sessionId %s %n", user.getUid(),sessionId);
//session.invalidate(); // 기존에 등록되어 있는 세션 없앰.
session.setAttribute("invalidate", "중복 로그인으로 로그아웃됩니다. 싸우세요.");
// 로그아웃 되게 로직 변경함
return true; // 동일한 사용자 존재함 표시
}
}
}
return false; // 동일한 사용자 존재 x
}
기존에 로그인 된 사용자를 로그아웃 처리 해주기 위해
SignInInterceptor 에서 방금 정의한 정적 메소드를 사용합니다.
//로그인 성공 시 기존에 동일한 id로 로그인된 사용자 정보가 존재하면 삭제
boolean result = MySessionEventListener.expireDuplicatedSession(
userInfo.getUid(),
session.getId()
);
if(result) {
System.out.println("중복제거");
}else {
System.out.println("첫 로그인");
}
# header에서 로그아웃처리하는 mapping으로 연결 해준다.
<script>
const invalidate = '$(invalidate)';
if(invalidate !=''){
alert(invalidate);
location.href='<c:url value="/user/signOut"/>';
}
</script>
로그아웃 처리하는 ControllerMapping에서
session.removeAttribute("invalidate");
꼭 지워주기...! 안지워주면 계속된다...ㄷㄷ
# Enumeration 인터페이스
: 주로 ArrayList, Vector, HashMap, Hashtable에서 쓰인다.
가능하면 Enumeration 대신 Iteration 사용을 권장중임.(Iterator)
- 메소드 : boolean hasMoreElements() : 현재 커서 이후에 요소들이 있는지 여부 체크
- E nextElement() : E타입 반환, 커서를 다음요소로 이동시키고, 가리키고 있는 요소 객체를 꺼내 반환한다.
사용시 인터페이스라서 직접 객체 생성 x, 컬렉션에서 가져온다.
ex) Enumeration em = table.elements();