스프링 세션 설정
이번 프로젝트에서 로그인부분에서 스프링세션을 이용해 보았다.
우선 설정방법은 크게어렵지않다.
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class LoginInterceptor extends HandlerInterceptorAdapter {
/* @Override // 이부분은 컨트롤러 타기전에
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 세션 객체 생성
HttpSession session = request.getSession();
// 세션에 id가 null이면
if(session.getAttribute("user") == null) {
// 로그인 페이지로 이동
response.sendRedirect("login.do");
// 컨트롤러를 실행하지 않는다.(요청페이지로 이동하지 않는다)
return false;
// null이 아니면
} else {
// 컨트롤러를 실행(요청페이지로 이동한다.)
return true;
}
}*/
@Override // 이건 컨트롤러에서 뷰로 넘어가기 직전
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HttpSession session = request.getSession();
if(session.getAttribute("userSession") != null) {
// 로그인 페이지로 이동
modelAndView.addObject("userSession", session.getAttribute("userSession"));
// 컨트롤러를 실행하지 않는다.(요청페이지로 이동하지 않는다)
}
}
}
원하는곳에서 공통기능을 추가하기위해 인터셉터를 사용했다. 내가 원하는것은 컨트롤러에서 뷰로넘기기 직전에 세션이 있다면 세션을 모델에 그려주도록 해보았다. preHandle메서드는 컨트롤러에 가기 직전에 수행되는 메서드이고 postHandle은 컨트롤러 수행이끝나고 뷰로 가기 직전에 수행되는 메서드이다. 나는 뷰로넘기기 전에 세션을 ModelAndView에 넣었다.
그다음 이클래스를 인터셉터 할수있도록 빈등록을 해준다
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- 인터셉터 객체 생성 -->
<beans:bean id="authenticationInterceptor" class="egovframework.example.cmmn.LoginInterceptor">
</beans:bean>
<!-- Interceptor 설정 -->
<interceptors>
<interceptor>
<mapping path="/**.do"/>
<exclude-mapping path="/getMenu.do"/>
<exclude-mapping path="/getLeftMenu.do"/>
<beans:ref bean="authenticationInterceptor"/>
</interceptor>
</interceptors>
<context:component-scan base-package="egovframework.example.**.web" />
</beans:beans>
위내용을 context-session.xml 파일을 만들어서 넣어준다. 모든 .do로 끝나는 url은 이 인터셉터클래스파일을 실행할것이고 아까 말했듯이 나는 세션이 있다면 그것을 모델에 그려주는 것이다.
는 인터셉터하고싶지않은 url이므로 제외시킨다.
여기까지만한다면 사용할 수 있다.
나는 로그인부분에서 성공할경우 userVO를 세션에 추가해주었다. 세션에 추가해주는방법은 HttpSession객체를 이용하면 된다.
반대로 로그아웃시에는 HttpSession객체에있는 invalidate 메서드를 실행하여 세션을 제거해준다.