728x90

글 수정 기능을 구현할 것이다.

 

우선 수정과 삭제 버튼은 로그인한 사람과 작성한 사람이 같은 경우에만 노출해야 한다.

 

board controller와 board/read.jsp를 수정하자.

mapper의 getContent 쿼리문에서 content_writer_idx도 같이 가져오도록 수정하자. 그렇다면 contentBean에 글 작성자 idx까지 주입될 것이고, 로그인한 유저와 작성한 유저의 idx를 비교할 수 있다.

 

컨트롤러에서 model을 통해 loginUserBean와 content_idx를 전달한다.

read.jsp는 c:if 태그를 통해 로그인한 유저와 게시글 작성자의 idx가 같은 경우에만 수정하기, 삭제하기 버튼을 노출시킨다.

<c:if test="${loginUserBean.user_idx == contentBean.content_writer_idx }">
  <a href="${root }board/update?board_info_idx=${board_info_idx}&content_idx=${content_idx}" class="btn btn-info">수정하기</a>
  <a href="${root }board/delete?board_info_idx=${board_info_idx}&content_idx=${content_idx}" class="btn btn-danger">삭제하기</a>
</c:if>

그 후 혹시 모를 접근에 대비해 interceptor를 생성한다. 

이 인터셉터는 게시글 작성자가 아닌 유저가 수정/삭제 기능에 uri를 통해 접근하는 경우를 방지한다.

CheckWriterInterceptor라는 인터셉터를 생성, 구현한다. 

기능은 말한대로 로그인한 유저와 게시글의 작성자 idx를 비교하여 같지 않은경우 접근을 차단한다.

인터셉터에는 autowired가 되지 않기 때문에 직접 생성자를 통해 주입한다.

그래서 작성자와 idx가 다른 경우 board/not_writer.jsp로 재접근한다.

public class CheckWriterInterceptor implements HandlerInterceptor{

	private UserBean loginUserBean;
	
	private BoardService boardService;
	
	public CheckWriterInterceptor(UserBean loginUserBean, BoardService boardService) {
		this.loginUserBean = loginUserBean;
		this.boardService = boardService;
	}
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		
		String str1 = request.getParameter("content_idx");
		int content_idx = Integer.parseInt(str1);
		
		ContentBean currentContentBean = boardService.getContent(content_idx);
		
		if(loginUserBean.getUser_idx()!= currentContentBean.getContent_writer_idx()) {
			String contextPath = request.getContextPath();
			response.sendRedirect(contextPath + "/board/not_writer");
			return false;
		}
		
		return true;
	}
}

인터셉터를 등록하기 위해 ServletAppContext파일을 수정한다. 아래 코드를 addInterceptors 함수에 추가한다.

참고로 boardService를 autowired해야 한다.

		CheckWriterInterceptor checkWriterInterceptor = new CheckWriterInterceptor(loginUserBean, boardService);
		InterceptorRegistration reg3 = registry.addInterceptor(checkWriterInterceptor);
		reg3.addPathPatterns("/board/update", "/board/delete");

not_writer.jsp는 아래와 같다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var='root' value='${pageContext.request.contextPath }/'/>
<script>
	alert('작성자가 아니므로 수정/삭제가 불가능합니다.')
	location.href = "${root}main"
</script>

작성자가 같은 경우 위와같이 수정하기 삭제하기 버튼이 보인다.

 

다른 경우 위와같이 목록보기만 보인다.

 

주소를 통한 강제 접근시 위와 같이 접근을 막는다.

728x90

+ Recent posts