인터셉터(Interceptor)란?
Controller로 가는 호출을 가로채서 특정 처리를 하는 역할.
- 아래의 빨간색 부분에서 동작
사진 출처 : http://blog.daum.net/gunsu0j/165
인터셉터를 지원하는 Spring 메소드
①HandlerInterceptor 인터페이스
②HandlerInterceptorAdapter 추상클래스
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler)
Controller 요청 전 실행
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndVeiw modelAndVeiw)
Controller 처리가 끝나고 화면에 띄어주는 처리 직전에 수행
- afterCompletion() : 모든 처리가 끝난 후 호출
로그인 처리을 위해 DB Table : Users 생성
create table Users ( Id varchar(50) not null primary key, Pw varchar(50) not null, userName varchar(100) not null ); insert into Users(Id,Pw,userName) values('user0','0000','이름1'); insert into Users(Id,Pw,userName) values('user1','1111','이름2'); insert into Users(Id,Pw,userName) values('user2','2222','이름3'); insert into Users(Id,Pw,userName) values('user3','3333','이름4');
로그인에 사용할 UsersVO 클래스 작성
public class UsersVO { private String id; private String pw; private String userName; public String getId() { return id; } public String getPw() { return pw; } public void setPw(String pw) { this.pw = pw; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } @Override public String toString() { return "UsersVO [Id = " + id+ ",Pw = " + pw + ",UserName = " + userName + "]" ; } }
로그인 처리 할 SQL문 작성 MyBatis - UsersMapper.xml
UsersDAO 인터페이스와 이를 구현하는 UsersDAOImpl 클래스 정의
public interface UsersDAO { // 세션에 등록 public UsersVO get(UsersVO usersVO ) throws Exception; }
@Repository public class UsersDAOImpl implements UsersDAO{ @Inject // Inject어노테이션이 없으면 sqlSession은 null상태이지만 // Inject어노테이션이 있으면 외부에서 객체를 주입시켜주게 된다. // try catch문, finally문, 객체를 close할 필요가 없어졌다. private SqlSession sqlSession; private static String namespace = "com.test.mapper.usersMapper"; // 세션에 등록 public UsersVO get(UsersVO usersVO ){ return sqlSession.selectOne(namespace+".loginCheck", usersVO ); } }
UsersDAOImpl은 UsersDAO인터페이스를 구현하였고,
DAO(Data Access Object)로 DB에 직접 접근하는 처리를 담당하는 클래스이다.
해당 클래스에서는 mybatis 접근 객체 : 즉, SqlSessionTemplate 객체를 이용한다.
sqlSession.selectOne("MyBatis Mapper의 namespace명.지정한id",넘겨줄 데이터 객체); 를 이용하여
MyBatis를 통해 작성한 쿼리를 실행해 UsersVO 객체를 얻어오는 작업을 해준다.
이때, @Inject나 @Autowired를 통해서 자동 주입을 한다.
(@Inject와 @Autowired는 ByType(타입이 같은 것을 자동 대입)하는 성질)
서비스 객체에서 DAO를 자동주입할 것임으로 UserDAOImpl 클래스 위에 @Repository 어노테이션을 붙였다.
이것은, 해당 클래스는 DAO 클래스를 의미하고, 자동으로 new 객체를 생성해 준다.
이후, Service 객체에서도 @Inject를 이용해 자동 주입하기 위해 생성해 놓는다.
UsersService 인터페이스와 이를 구현하는 UsersServiceImpl 클래스 정의
public interface UsersService { public UsersVO getUser(UsersVO usersVO) throws Exception; }
@Service public class UsersServiceImpl implements UsersService { @Inject private UsersDAO usersDAO; public UsersVO getUser(UsersVO usersVO) throws Exception { return usersDAO.get(usersVO); } }
UsersController 정의
@Controller public class UserController { @Inject // 자동 주입 UserService service; // 로그인 폼을 띄우는 부분 @RequestMapping(value="/login.do",method=RequestMethod.GET) public String loginForm(){ return "login/loginForm"; } // 로그인 처리하는 부분 @RequestMapping(value="/loginCheck.do",method=RequestMethod.POST) public String loginCheck(HttpSession session,UsersVO usersVO){ String returnURL = ""; if ( session.getAttribute("login") != null ){ // 기존에 login이란 세션 값이 존재한다면 session.removeAttribute("login"); // 기존값을 제거해 준다. } // 로그인이 성공하면 UsersVO 객체를 반환함. UsersVO vo = service.getUser(UsersVO); if ( vo != null ){ // 로그인 성공 session.setAttribute("login", vo); // 세션에 login인이란 이름으로 UsersVO 객체를 저장해 놈. returnURL = "redirect:/main"; // 로그인 성공시 메인페이지로 이동하고 }else { // 로그인에 실패한 경우 returnURL = "redirect:/login"; // 로그인 폼으로 다시 가도록 함 } return returnURL; // 위에서 설정한 returnURL 을 반환해서 이동시킴 } // 로그아웃 하는 부분 @RequestMapping(value="/logout.do") public String logout(HttpSession session) { session.invalidate(); // 세션 초기화 return "redirect:/login.do"; // 로그아웃 후 로그인화면으로 이동 } } // end of controller
============================================================================
인터셉터 부분 (AuthLoginInterceptor)
// 로그인처리를 담당하는 인터셉터 public class AuthLoginInterceptor extends HandlerInterceptorAdapter{ // preHandle() : 컨트롤러보다 먼저 수행되는 메서드 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // session 객체를 가져옴 HttpSession session = request.getSession(); // login처리를 담당하는 사용자 정보를 담고 있는 객체를 가져옴 Object obj = session.getAttribute("login"); if ( obj == null ){ // 로그인이 안되어 있는 상태임으로 로그인 폼으로 다시 돌려보냄(redirect) response.sendRedirect("/login.do"); return false; // 더이상 컨트롤러 요청으로 가지 않도록 false로 반환함 } // preHandle의 return은 컨트롤러 요청 uri로 가도 되냐 안되냐를 허가하는 의미임 // 따라서 true로하면 컨트롤러 uri로 가게 됨. return true; } // 컨트롤러가 수행되고 화면이 보여지기 직전에 수행되는 메서드 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // TODO Auto-generated method stub super.postHandle(request, response, handler, modelAndView); } }
마지막으로 servlet-context.xml에 추가설정
1 2 3 4 5 6 7 8 9 10 11 | <!-- 인터셉터 객체 생성 --> <beans:bean id="AuthLoginInterceptor" class="com.test.login.AuthLoginInterceptor"> </beans:bean> <!-- Interceptor 설정 --> <interceptors> <interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/resources/**"/> <beans:ref bean="AuthLoginInterceptor"/> </interceptor> </interceptors> | cs |