dkswksi
377
2015-07-10 11:25:09
4
14130

spring에서 interceptor로 세션체크하는데 세션발생시점을 언제로 해야하나요???


서블릿 컨텍스트에서 *.do로 오는 요청은 전부 인터셉트 하도록 했습니다.

<mvc:interceptors>
	<mvc:interceptor>
		<mvc:mapping path="/*.do"/>
		<bean class="common.LoginInterceptor"></bean>
	</mvc:interceptor>
</mvc:interceptors>


srping 인터셉터로 로그인체크해서 null이면 로그인폼으로 보내도록 하였습니다.

public class LoginInterceptor extends HandlerInterceptorAdapter {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		// TODO Auto-generated method stub
		HttpSession session = request.getSession();
		String check = (String) session.getAttribute("loginok");
		
		System.out.println("인터셉터 로그인여부:" + check);
if (check == null){
response.sendRedirect("loginform.go"); return false; } return true; } }


로그인폼jsp

<form action="sessionLogin.do" method="post">
	<font size="2">아이디 : </font>
		<input type="text" name="id" size="10"><br/>
	<font size="2">비밀번호 : </font>
		<input type="password" name="password" size="10">
	<input type="submit" value="로그인">
</form>


컨트롤러

로그인폼은 .go 요청이라서 인터셉트 되지 않음

@RequestMapping(value = "/loginform.go", method = {RequestMethod.GET})
	public String loginform(HttpServletRequest request) {
		return "loginForm";	
	}


로그인

@RequestMapping(value = "/sessionLogin.do", method = {RequestMethod.POST})
	public String login(HttpServletRequest request) {
		HttpSession session = request.getSession();
		session.setAttribute("loginck", "ok");
		session.setMaxInactiveInterval(3600);
		return "sessionLogin";	
	}


지금 상태로하면 로그인폼화면에서 로그인sunmit하면 세션이 null값이 뜨면서 로그인폼으로 되돌아옵니다.


그렇다고 로그인폼에 세션을 발생시키면 로그인폼한번들어왔다가 다른 페이지로가면

접속되는거같아요


0
3
  • 답변 4

  • 뱅만도리
    351
    2015-07-10 11:35:09

     

    @Override
    	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
    		
    		//로그인된 사용자 대상으로 세션 토큰 값 비교.
    		LoginInfoDto loginInfoDto = SessionManager.getUserInfo(request, response);
    		if(loginInfoDto != null && loginInfoDto.getUser_no() != null) {
    			if(!request.getRequestURI().equals("/userperm/notValidLogin.do")){
    				// 관리자가 강제로 판매자 로그인시 판매자가 재로그인 해서 세션토큰이 바뀌어도 로그인을 유지
    				String adminDealer = loginInfoDto.getLoginTypCd();
    				if(adminDealer != null && adminDealer.equals("A")) {
    					int userNo = 0;
    					try {
    						userNo = loginInfoDto.getUser_no();
    					} catch(NumberFormatException nfe) {
    						userNo = 0;
    					}
    					
    					if(userNo != 0) {
    						//로그인된 사용자인데 세션 토큰이 존재하지 않으면 로그아웃 처리
    						String sessionToken = loginInfoDto.getSessionToken();
    						if(sessionToken == null || "".equals(sessionToken)) {
    							//SessionManager.clearSession(request, response);
    							response.sendRedirect("/userperm/notValidLogin.do");
    							
    							return false;
    						}
    	
    						//DB와 쿠키의 세션 토큰이 다르면 로그아웃 처리
    						LoginInfoDto dbinfoDto = userPermService.selectUserSessionToken(loginInfoDto);
    						if(!dbinfoDto.getSessionToken().equals(loginInfoDto.getSessionToken())) {
    							//SessionManager.clearSession(request, response);
    							response.sendRedirect("/userperm/notValidLogin.do");
    	
    							return false;
    						}
    					}
    				}
    			}
    		}
    		
    		return true;
    	}

     지금 개발중인 싸이트에서 이렇게 사용하고 있네요....

    0
  • dkswksi
    377
    2015-07-10 11:56:12

    제가 잘못했었네요


    .do로 오는 요청은 전부 인터셉트를 거치게해놨는데


    세션이 발생전에 인터셉트를 거치니까 안됐던거네요

    0
  • 날림
    301
    2015-07-10 13:01:30
    /*.do  --> /**/*.do
    
    이렇게 변경하시길 바래요. 안하시면 최상위 .do만 인터셉터 경유해갈거예요
    0
  • 커비
    2k
    2015-07-10 14:13:11
    	HttpSession session = request.getSession();
    		String check = (String) session.getAttribute("loginok");
    		
    		System.out.println("인터셉터 로그인여부:" + check);		if (check == null){			response.sendRedirect("loginform.go");
    			return false;
    		}

    이부분을 보통 

    
    	HttpSession session = request.getSession(false);
    if (session == null) { 
    //세션없는 사람 
    }
    else { 
    // 세션 있는 사람
    }

    이런식으로 보통 구분 하죠 

    그래서 세션 없는 사람은 request.getSession(true) 형태로 다시 세션 만들어주구요





    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.