- 글 수정 기능 중 작성 권한에 대한 처리를 합니다.
- 수정과 삭제 버튼은 로그인한 사람과 작성한 사람이 같을 경우에만 노출합니다.
- 직접 주소를 입력하고 요청할 경우를 대비해 Interceptor로 처리해줍니다.
BoardController
현재 로그인 된 유저의 정보는 sessioUser에 저장되어있어서 불러온다.
sessionUser을 모델로 보내준다. read페이지로
기존에 있던 getBoardDetail 수정
writer_idx 추가
<select id="getBoardDetail" parameterType="Integer" resultType="com.demo.domain.ContentVO" >
SELECT board_idx,u.name, writer_idx,
DATE_FORMAT(regDate,'%y-%m-%d') AS regDate,
title,
content,
content_file
FROM board b
JOIN user u
ON b.writer_idx = u.user_idx
WHERE board_idx = #{board_idx}
</select>
read.jsp
조건문으로 세션의 아이디와 글 작성자가 동일할 경우에만 해당 메뉴 보이게 함
테스트
현재 로그인 유저는 홍길동임
그래서 무지가 작성한 글을 보면 목록보기 버튼만 출력
홍길동은 수정하기, 삭제하기 보임
로그인 한 다른 유저가 주소창을 통해 직접 입력하고 요청 할 경우를 대비해서 인터셉터로 처리해준다.
CheckWriterInterceptor
package com.demo.interceptor;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import com.demo.domain.ContentVO;
import com.demo.domain.LoginUser;
import com.demo.service.BoardService;
import com.demo.service.MenuService;
public class CheckWriterInterceptor implements HandlerInterceptor{
@Resource(name = "sessionUser")
private LoginUser sessionUser;
@Autowired
private BoardService boardService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 인터셉터는 요청에 먼저 실행되어 작업을 하고 만약 리턴이 false가 되면 요청을 취소한다.
String str1 = request.getParameter("board_idx");
int board_idx = Integer.parseInt(str1); //str1을 int로 바꿔줌
ContentVO content = boardService.getContentDetail(board_idx);
if(sessionUser.getUser_idx() != content.getWriter_idx()) { //유저 인덱스 번호랑 글쓴이 번호랑 동일여부
request.setAttribute("sessionUser", sessionUser);
String contetxPath = request.getContextPath();
response.sendRedirect(contetxPath + "/board/not_writer");
return false; //요청한 주소를 취소
}
return true;
}
}
인터셉터 등록 및 설정
<!--인터셉터 객체 등록 -->
<beans:bean id="MenuInterceptor"
class="com.demo.interceptor.MenuInterceptor">
<beans:constructor-arg>
<beans:bean class="com.demo.service.MenuService"></beans:bean>
</beans:constructor-arg>
</beans:bean>
<beans:bean id="CheckLoginInterceptor"
class="com.demo.interceptor.CheckLoginInterceptor" />
<beans:bean id="CheckWriterInterceptor"
class="com.demo.interceptor.CheckWriterInterceptor" />
<!--인터셉터 설정 -->
<interceptors>
<interceptor>
<mapping path="/" />
<mapping path="/board/*" />
<mapping path="/user/*" />
<beans:ref bean="MenuInterceptor" />
</interceptor>
<interceptor>
<mapping path="/user/modify" />
<mapping path="/user/logout" />
<mapping path="/board/*" />
<exclude-mapping path="/board/main" />
<beans:ref bean="CheckLoginInterceptor" />
</interceptor>
<interceptor>
<mapping path="/board/modify" />
<mapping path="/board/delete" />
<beans:ref bean="CheckWriterInterceptor" />
</interceptor>
</interceptors>
BoardController
@GetMapping("/not_writer")
public String not_writer() {
return "board/not_writer";
}
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>
BoardService
//수정 전 정보를 가져와서 수정 게시글 객체에 입력한다
public void getContents(BoardVO modifyContent) {
ContentVO temp = boardDAO.getContentDetail(modifyContent.getBoard_idx());
modifyContent.setName(temp.getName());
modifyContent.setTitle(temp.getTitle());
modifyContent.setRegDate(temp.getRegDate());
modifyContent.setContent(temp.getContent());
modifyContent.setContent_file(temp.getContent_file());
}
BoardController
@GetMapping("/modify")
public String modify(@RequestParam("info_idx") int info_idx,
@RequestParam("board_idx") int board_idx,Model model,
@ModelAttribute("modifyContent") BoardVO modifyContent) {
modifyContent.setInfo_idx(info_idx);
modifyContent.setBoard_idx(board_idx);
boardService.getContents(modifyContent); // 수정 전 정보를 db에서 가져온다
model.addAttribute("modifyContent", modifyContent); //수정페이지로 전달
model.addAttribute("info_idx", info_idx); //게시판번호 전달
return "board/modify";
}
넘어오는 board_idx를 modifyContent에 넣음
modify.jsp
이미지 수정할 때 꼭 작성해야함
<form:form action='${root}/board/modify_pro'
modelAttribute="modifyContent" enctype="multipart/form-data">
<form:hidden path="board_idx" />
<form:hidden path="info_idx" />
<div class="form-group">
<form:label path="name">작성자</form:label>
<form:input path="name" class='form-control'
readonly="true" />
</div>
<div class="form-group">
<form:label path="regDate">작성날짜</form:label>
<form:input path="regDate" class='form-control'
readonly='true' />
</div>
<div class="form-group">
<form:label path="title">제목</form:label>
<form:input path="title" class='form-control' />
<form:errors path="title" style='color:red' />
</div>
<div class="form-group">
<form:label path="content">내용</form:label>
<form:textarea path="content" class="form-control"
rows="10" style="resize:none" />
<form:errors path="content" style='color:red' />
</div>
<div class="form-group">
<label for="board_file">첨부 이미지</label>
<!-- 만약 이미지가 있을 경우 표시하고, 이미지를 새로 첨부하지 않을 경우에 hidden이 다시 전달됨 -->
<c:if test="${modifyContent.content_file != null }">
<img src="${root }/upload/${modifyContent.content_file}"
width="100%" />
<form:hidden path="content_file" />
</c:if>
<form:input path="upload_file" type='file' class="form-control"
accept="image/*" />
</div>
<div class="form-group">
<div class="text-right">
<form:button class='btn btn-primary'>수정완료</form:button>
<a
href="${root }/board/read?info_idx=${modifyContent.info_idx}&board_idx=${modifyContent.board_idx}"
class="btn btn-info">취소</a>
</div>
</div>
</form:form>
BoardVO 수정( 게터 세터 추가) 글쓴이 이름
private int board_idx; //글번호
private String name; //작성자
@NotBlank(message = "제목을 입력해주세요")
private String title; //제목
@NotBlank(message = "내용을 입력해주세요")
private String content; //글내용
private String content_file; //이미지 파일 이름
private int writer_idx; //글쓴이
private int info_idx; //게시판이름
private String regDate; //작성날짜
private MultipartFile upload_file; //업로드 파일
테스트하기
취소하기 버튼 눌렀을 경우
'BACKEND > Spring' 카테고리의 다른 글
게시판 만들기 2 - 게시글 수정 처리 (0) | 2023.11.02 |
---|---|
게시판 만들기 2 - 이미지 업로드 방법 변경 (0) | 2023.11.02 |
게시판 만들기 2 - 글 작성 후 작성했던 메뉴로 돌아가기 (0) | 2023.11.01 |
게시판 만들기 2- 글 상세보기 페이지 (1) | 2023.11.01 |
게시판 만들기 2 -게시판 제목 및 게시글 목록 (1) | 2023.11.01 |