로그인을 하지 않은 사용자는 특정 서비스를 이용하지 못하도록 interceptor 생성
Client의 요청이 Controller에 들어가기 전 요청을 가로채서 Client가 로그인을 했는지 저장된 session으로 검증 진행
interceptor
package com.spring.myweb.util.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
public class UserAuthHandler implements HandlerInterceptor{
// 회원 권한이 필요한 페이지 요청이 들어왔을 때 요청을 가로채서 확인할 인터셉터
// 글쓰기 화면과, 마이페이지 화면에 들어가는 요청을 가로채 검사
// 권한이 없다면 로그인 페이지로 이동
// 유저 인증은 controller로 요청이 들어가기 전 체크하는 것이 좋으므로 preHandle 사용
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 세션에서 로그인 데이터를 얻은 후 확인 진행
HttpSession session = request.getSession();
// 세션이 있는지 체크 (없다면 다른 곳으로 보냄)
if(session.getAttribute("login") == null) {
// 로그인을 안했으면 session이 없으므로 null이 됨
response.sendRedirect(request.getContextPath() + "/user/userLogin");
// 로그인을 안했으므로 userLogin으로 보냄
return false;
}
else {
return true;
// 로그인을 한 사람은 interceptor를 통과
}
}
}
생성한 interceptor를 bean 등록
interceptor가 어디에 있는지 알려주고 어떤 요청에 반응해야 하는지 알려줌
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- namespaces 탭에서 mvc 기능 추가 -->
<!-- web.xml에 초기 설정 파일로 이 파일을 추가 -->
<bean id="UserLoginSuccessHandler" class="com.spring.myweb.util.interceptor.UserLoginSuccessHandler" />
<!-- 생성한 interceptor bean 등록 -->
<bean id="UserAuth" class="com.spring.myweb.util.interceptor.UserAuthHandler" />
<mvc:interceptors>
<!-- root-context.xml에 등록하는 거랑 똑같음 -->
<!-- 로그인 이후에 실행되는 postHandler -->
<mvc:interceptor>
<mvc:mapping path="/user/userLogin"/>
<ref bean="UserLoginSuccessHandler" />
<!-- 참조하는 bean 지정 -->
</mvc:interceptor>
<!-- 로그인 권한을 체크하는 핸들러 -->
<mvc:interceptor>
<!-- 로그인 권한을 체크하기 위해 해당 요청을 interceptor가 먼저 체크 -->
<mvc:mapping path="/freeBoard/freeRegist" />
<mvc:mapping path="/user/userMypage"/>
<ref bean="UserAuth" />
</mvc:interceptor>
</mvc:interceptors>
</beans>
BoardAuthHandler
특정 게시판을 작성한 사용자가 아니거나 로그인을 하지 않은 사용자가 게시물을 변경 및 수정을 진행하지 못하는 로직 작성
현재 로그인한 사용자의 정보를 session으로 가지고 와서 해당 게시글의 작성 id와 비교를 통해 사용자 검증
Interceptor를 통해 위의 내용을 Controller에 가기 전 차단
package com.spring.myweb.util.interceptor;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
import com.spring.myweb.command.UserVO;
public class BoardAuthHandler implements HandlerInterceptor {
//화면에서 변경, 수정, 삭제가 일어날 때, writer값을 넘겨주도록 처리
//게시글 수정, 삭제에 대한 권한 처리 핸들러
//세션값과 writer(작성자) 정보가 같다면 컨트롤러를 실행,
//그렇지 않다면 '권한이 없습니다.' 경고창 출력 후 뒤로가기.
//권한이 없습니다 경고창은 jsp에서 했었던 PrintWriter 객체를 이용하
//PrintWriter 객체는 response 객체에게 받아옴
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session = request.getSession();
UserVO user = (UserVO) session.getAttribute("login");
System.out.println("session에 있는 유저 객체 가져오는지 확인 : " + user);;
// login이라는 이름의 유저의 session 가져옴
String writer = request.getParameter("writer");
System.out.println("인터셉터 파라미터 가져오는지 확인 : " + writer);
// 특정 요청으로 Controller로 가는 데이터를 가져와서 확인
if (user != null) {
if (user.getUserId().equals(writer)) {
// 파라미터에서 가져온 값과 session에 저장된 값이 같으면 controller로 이동하도록
return true;
}
}
response.setContentType("text/html charset=UTF-8");
PrintWriter out = response.getWriter();
String html = "<script>\r\n"
+"alert('권한이 없습니다.'); \r\n"
+"history.back(); \r\n"
+"</script>";
out.print(html);
out.flush();
return false;
}
}
생성한 interceptor를 bean 등록
interceptor가 어디에 있는지 알려주고 어떤 요청에 반응해야 하는지 알려줌
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- namespaces 탭에서 mvc 기능 추가 -->
<!-- web.xml에 초기 설정 파일로 이 파일을 추가 -->
<bean id="UserLoginSuccessHandler" class="com.spring.myweb.util.interceptor.UserLoginSuccessHandler" />
<!-- 생성한 interceptor bean 등록 -->
<bean id="UserAuth" class="com.spring.myweb.util.interceptor.UserAuthHandler" />
<bean id="UserAuthBoard" class="com.spring.myweb.util.interceptor.BoardAuthHandler" />
<mvc:interceptors>
<!-- root-context.xml에 등록하는 거랑 똑같음 -->
<!-- 로그인 이후에 실행되는 postHandler -->
<mvc:interceptor>
<mvc:mapping path="/user/userLogin"/>
<ref bean="UserLoginSuccessHandler" />
<!-- 참조하는 bean 지정 -->
</mvc:interceptor>
<!-- 로그인 권한을 체크하는 핸들러 -->
<mvc:interceptor>
<!-- 로그인 권한을 체크하기 위해 해당 요청을 interceptor가 먼저 체크 -->
<mvc:mapping path="/freeBoard/freeRegist" />
<mvc:mapping path="/user/userMypage"/>
<ref bean="UserAuth" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/freeBoard/freeModify"/>
<mvc:mapping path="/freeBoard/freeDelete"/>
<!-- 수정 및 삭제 페이지 요청이 들어오면 interceptor가 먼저 가로채도록 -->
<ref bean="UserAuthBoard" />
</mvc:interceptor>
</mvc:interceptors>