22.06.24 인터셉터,PrintWriter
회원권한이 필요한 페이지 요청이 들어왔을 때, 요청을 가로채 확일할 인터셉터
글쓰기 화면과 마이페이지 화면 들어가는 요청을 가로채 검사하도록 한다.
권한이 없다면 로그인 페이지로 보내자.
<script>
package com.spring.myweb.util.interceptor;
public class UserAuthHandler implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)throws Exception {
//세션에서 로그인 데이터를 얻은 후 확인을 하자
HttpSession session = request.getSession();
if(session.getAttribute("login") == null) {
//로그인 안했네?
response.sendRedirect(request.getContextPath() + "/user/userLogin");
return false; //false 컨트롤러 진입을 막는다.
}
return true; //로그인 한 사람은 통과~
}
}
</script>
UserAuthHandler 인터셉터 추가.
/freeboard/freeRegist
/user/userMypage
요청이 들어왔을때 UserAuthHandler 인터셉터 발동
<!-- namespaces 탭에서 mvc 기능 추가 -->
<!-- web.xml에 초기 설정 파일로 이 파일을 추가 -->
<bean id="userLoginSuccessHandler" class="com.spring.myweb.util.interceptor.UserLoginSuccessHandler" />
<bean id="userAuth" class="com.spring.myweb.util.interceptor.UserAuthHandler" />
<mvc:interceptors>
<!-- 로그인 이후에 실행되는 postHandler -->
<mvc:interceptor>
<mvc:mapping path="/user/login"/>
<ref bean="userLoginSuccessHandler" />
</mvc:interceptor>
<!-- 로그인 권한을 체크하는 핸들러 -->
<mvc:interceptor>
<mvc:mapping path="/freeboard/freeRegist"/>
<mvc:mapping path="/user/userMypage"/>
<ref bean="userAuth"/>
</mvc:interceptor>
</mvc:interceptors>
화면에서 변경, 수정, 삭제가 일어날 때, writer값을 넘겨주도록 처리
게시글 수정, 삭제에 대한 권한 처리 핸들러
세션값과 writer(작성자) 정보가 같다면 컨트롤러를 실행,
그렇지 않다면 '권한이 없습니다.' 경고창 출력 후 뒤로가기.
권한이 없습니다 경고창은 jsp에서 했었던 PrintWriter 객체를 이용하시면 됩니다.
PrintWriter 객체는 response 객체에게 받아 옵니다.
<script>
package com.spring.myweb.util.interceptor;
public class BoardAuthHandler implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
System.out.println("게시판 권한 인터셉터 발동!");
String writer = request.getParameter("writer");
HttpSession session = request.getSession();
UserVO vo = (UserVO)session.getAttribute("login");
System.out.println("화면에서 넘어오는 값: " + writer);
System.out.println("세션에 저장된 값: " + vo.getUserId());
if(vo != null) { //로그인중
if(writer.equals(vo.getUserId())) { //아이디와 작성자가 일치하면 통과
System.out.println("글쓴이가 너가 맞구나");
return true;
}
}
//로그인 사용자가 아니라면 경고창 출력
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("<script> \r\n");
out.print("alert('권한이 없습니다.'); \r\n");
out.print("hostory.back(); \r\n");
out.print("</script>");
out.flush();
return false;
}
}
</script>
BoardAuthHandler 인터셉터 등록.
<bean id="userLoginSuccessHandler" class="com.spring.myweb.util.interceptor.UserLoginSuccessHandler" />
<bean id="userAuth" class="com.spring.myweb.util.interceptor.UserAuthHandler" />
<bean id="boardAuth" class="com.spring.myweb.util.interceptor.BoardAuthHandler" />
<mvc:interceptors>
<!-- 로그인 이후에 실행되는 postHandler -->
<mvc:interceptor>
<mvc:mapping path="/user/login"/>
<ref bean="userLoginSuccessHandler" />
</mvc:interceptor>
<!-- 로그인 권한을 체크하는 핸들러 -->
<mvc: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/freeUpdate"/> <!-- 수정 요청 -->
<mvc:mapping path="/freeboard/freeDelete"/> <!-- 삭제 요청 -->
<ref bean="boardAuth"/>
</mvc:interceptor>
</mvc:interceptors>
변경버튼에 writer추가
<button type="button" class="btn btn-primary"
onclick="location.href='<c:url value="/freeboard/freeModify?
bno=${article.bno}&writer=${article.writer}" />'">변경</button>
글쓰기 페이지의 작성자 userId로 변경하고 readonly.
<tr>
<td class="t-title">NAME</td>
<td><input class="form-control input-sm" name="writer"
value="${login.userId}" readonly></td>
</tr>