🎉

【初心者向け/ITスクール53日】掲示板作成プロジェクト完了

2023/09/25に公開

はじめに

今日は、ITスクールに通った53日目の日で、今日学んだ知識を記事にシェアしたいと思います。本記事が、ITを勉強を始めた方々にもロードマップになればいいと思います。

53日目は、ログインした会員が投稿をし、直接DBと連携して、select機能と連携する練習をしました。

特に複雑ことはありませんでしたが、Tomcatエラーでもう一度Workspaceを作ることになりました。

Token

board
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:if test="${sessionScope.loginMember!=null}">
 <form action="BoardWriteController" name="boardForm" 
		onsubmit="return checkBoardValid();">
		<input name="token" type="hidden" value="${generatedToken }">
	<textarea class="writeArea" placeholder="내용을 입력해주세요" name="b_text" autofocus="autofocus"
	autocomplete="off" maxlength="200" ></textarea>
		<button>작성</button>
	</form>
	</c:if>	
</body>
</html>

ログインした場合は、<c:if test="${sessionScope.loginMember !=null}">タグによって、スレッドを入力できるスペースが見えるように設定しました。

public void write(HttpServletRequest req) {
Connection con = null;
PreparedStatement pstmt = null;
  try {
	con= MemberDBManager.connect("hyonPool");	
			
	Member m = (Member)req.getSession().getAttribute("loginMember");
	String b_writer = m.getM_id();
	String b_text = req.getParameter("b_text").replace("\r\n","<br>");
			
//最初の記事を投稿する際、セッションにはformerTokenが存在しないため、null -> ルート1)に
//記事の投稿が成功したら、ルート1)でformerTokenというセッション属性が作成されます
//その後、Tokenmanagerのmakeメソッドにより、このページの属性であるgeneratedTokenが生成されます
//<input name="token" type="hidden" value="${generatedToken }"> により、token=generateToken
//最初のリクエストで押された時間のトークンが残ります(2回目ではありません)
//したがって、GETリクエストの後、ページをリロードすると、tokenが残っている状態になり、ルート2)に移行します
//簡単に言えば、トークンを2回押して、スタンプを押した時間で重複チェックされます。
			
	String formerToken = (String)req.getSession().getAttribute("formerToken");
	System.out.println(formerToken);
			
	String token = req.getParameter("token");
	System.out.println(token);
			
	//ルート 1)
	if(formerToken == null || !token.equals(formerToken)) {
	String sql = "insert into sns_board values(sns_board_seq.nextval, ?, sysdate, ?)";
	pstmt = con.prepareStatement(sql);
	pstmt.setString(1,b_writer);
	pstmt.setString(2,b_text);
	if(pstmt.executeUpdate()==1) {
		req.setAttribute("r", "<script>alert('글쓰기 성공');</script>");
		req.getSession().setAttribute("formerToken", token);
					
	//ルート2)	
	   }else {
	   	req.setAttribute("r", "<script>alert('새로고침');</script>");
		    }
			
	   }
	}catch(Exception e) {
		e.printStackTrace();
		req.setAttribute("r", "<script>alert('글쓰기 실패');</script>");

		}
	MemberDBManager.close(con, pstmt, null);
	}
	
	

Tokenを活用し、POSTの重複を防ぐ形でしたが、とても難しかったです!

Discussion