본문 바로가기

Java/Spring

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();

'Java > Spring' 카테고리의 다른 글

CSRF(Cross-Site Request Forgery) 공격  (0) 2023.08.22
provider : searchType DB 보낼때 처리하는 방법  (0) 2023.08.18
INTERCEPTOR  (0) 2023.08.14
트랜잭션 제어  (0) 2023.08.11
AOP  (0) 2023.08.11