🎉
【初心者向け/ITスクール53日】掲示板作成プロジェクト完了
はじめに
今日は、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