head.jspf
<c:if test="${!rq.isLogined()}">
<li class="hover:underline">
<a class="flex h-full items-center px-3" href="../member/login">
<span>LOGIN</span>
</a>
</li>
</c:if>
<c:if test="${rq.isLogined()}">
<li class="hover:underline">
<a class="flex h-full items-center px-3" href="../member/doLogout">
<span>LOGOUT</span>
</a>
</li>
rq객체
(로그인에 관한 정보를 담은 객체)를 만들어서 requset.setAttribute() 하고 있기 때문에c:if 태그
사용 1) 로그인, 로그아웃에 Rq 적용
public String doLogin(HttpServletRequest req, String loginId, String loginPw) {
Rq rq = (Rq) req.getAttribute("rq");
if (rq.isLogined()) {
return Ut.jsHistoryBack("이미 로그인 되었습니다.");
}
로그인 정보
를 가져옴2) rq.login(), rq.logout()
public void login(Member member) {
session.setAttribute("loginedMemberId", member.getId());
session.setAttribute("loginedMemberLoginId", member.getLoginId());
}
public void logout() {
session.removeAttribute("loginedMemberId");
session.removeAttribute("loginedMemberLoginId");
}
login() , logout()
메소드를 만들어 사용HttpSevletRequest객체
가 저장되있어 HttpSevletRequest객체를 통해 HttpSession
을 가져오고3) 로그아웃 후 메인페이지로 이동
@RequestMapping("/usr/member/doLogout")
@ResponseBody
public String doLogout(HttpServletRequest req) {
Rq rq = (Rq) req.getAttribute("rq");
if (rq.isLogined() == false) {
return Ut.jsHistoryBack("로그아웃 상태 입니다.");
}
rq.logout();
return Ut.jsReplace("로그아웃 했습니다.", "/");
}
rq.logout()
통해 로그아웃을 하고1) 수정 시도시 수정페이지를 보여주기 이전에 체크
@RequestMapping("/usr/article/modify")
public String showModify(HttpServletRequest req, Model model, int id) {
Rq rq = (Rq) req.getAttribute("rq");
Article article = articleService.getForPrintArticle(rq.getLoginedMemberId(), id);
model.addAttribute("article", article);
if (article == null) {
return rq.jsHistoryBackOnView(Ut.f("%d번 게시물은 존재하지 않습니다.", id));
}
ResultData actorCanModifyRd = articleService.actorCanModify(rq.getLoginedMemberId(), article);
if (actorCanModifyRd.isFail()) {
return rq.jsHistoryBackOnView(actorCanModifyRd.getMsg());
}
return "usr/article/modify";
}
보여주기 전
에 게시물 존재여부, 권한 체크하여 수정페이지로 이동 제한
@ResponseBody
어노테이션이 없기때문에rq.jsHistoryBackOnView()
의 메소드는 jsp파일위치
를 반환 해야한다. 반환된 jsp파일위치
로 이동modify.jsp
파일을 보여주게 됨2) rq.jsHistoryBackOnView
public String jsHistoryBackOnView(String msg) {
req.setAttribute("msg", msg);
req.setAttribute("historyBack", true);
return "usr/common/js";
}
jsp파일의 위치를 반환하는 메소드
"usr/common/js"
로 이동전에 setAttribute를 통해 msg
와 historyBack
을 request객체에 담는다.3) usr/common/js.jsp
<script>
var historyBack = '${historyBack}' == 'true';
var msg = '${msg}'.trim();
if (msg) {
alert(msg);
}
if (historyBack) {
history.back();
}
var replaceUri = '${replaceUri}'.trim();
if (replaceUri) {
location.replace(replaceUri);
}
</script>
이동 실패
시 보여주게 되는 jsp파일EL표현식
을 사용할수 있다.msg
와 historyBack
을 통해 페이지 뒤로가기
와 메세지경고창
을 구현4) url로 수정하려는 시도 방어, 수정 후에 replace
@RequestMapping("/usr/article/doModify")
@ResponseBody
public String doModify(HttpServletRequest req, int id, String title, String body) {
Rq rq = (Rq) req.getAttribute("rq");
Article article = articleService.getForPrintArticle(rq.getLoginedMemberId(), id);
if (article == null) {
return Ut.jsHistoryBack(Ut.f("%d번 게시물은 존재하지 않습니다.", id));
}
ResultData actorCanModifyRd = articleService.actorCanModify(rq.getLoginedMemberId(), article);
if (actorCanModifyRd.isFail()) {
return Ut.jsHistoryBack(actorCanModifyRd.getMsg());
}
articleService.modifyArticle(id, title, body);
return Ut.jsReplace(Ut.f("%d번 게시물 수정", id), Ut.f("../article/detail?id=%d", id));
}
/usr/article/modify
)에서 /usr/article/doModify
로 이동하는 정상적인 루트 문제가 없지만url로
직접 수정시도시수정권한체크를 하여 수정시도를
방어```해야한다.자바스크립트의 조건식은 논리형 데이터(true, false)가 아닌 다른 형의 데이터가 입력되어도 true 또는 false로 인식된다.
0, null, “”(빈 문자), undefined
이 값들이 조건식에 입력되면 false를 반환한다.
이 외의 값은 true 로 인식된다