ㅎㅇ
글쓰기 작성페이지 SaveForm.jsp 에서는
<%@page import="com.cos.blog.domain.user.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="../layout/header.jsp" %>
<!-- 해당 페이지로 직접 URL(자원에 직접 파일.확장자) 접근을 하게 되면 또 파일 내부에서 세션 체크를 해야함. -->
<!-- 필터에 .jsp로 접근하는 모든 접근을 막아버리면 됨. -->
<div class="container">
<form action="/blog/board?cmd=save" method="POST">
<input type="hidden" name="userId" value="${sessionScope.principal.id}" />
<div class="form-group">
<label for="title">Title:</label>
<input type="text" class="form-control" placeholder="title" id="title" name="title">
</div>
<div class="form-group">
<label for="content">Content:</label>
<textarea id="summernote" class="form-control" rows="5" id="content" name="content"></textarea>
</div>
<button type="submit" class="btn btn-primary">글쓰기 등록</button>
</form>
</div>
<script>
$('#summernote').summernote({
placeholder: '글을 쓰세요.',
tabsize: 2,
height: 400
});
</script>
</body>
</html>
type="hidden " userId 값을 전송해야한다.
그렇다면 value값은 어디서 정해지는걸까 ?
답 : ${ } (EL표현식)을 사용하여 EL내장객체인 SessionScope에 접근하여 가져온다.
else if(cmd.equals("login")) { //로그인 완료
// 서비스 호출
String username = request.getParameter("username");
String password = request.getParameter("password");
LoginReqDto dto = new LoginReqDto();
dto.setUsername(username);
dto.setPassword(password);
User userEntity = userService.로그인(dto);
if(userEntity != null) {
HttpSession session = request.getSession();
session.setAttribute("principal", userEntity); //인증주체
//response.sendRedirect("index.jsp"); //로그인 성공
RequestDispatcher dis = request.getRequestDispatcher("index.jsp");
dis.forward(request, response);
}else {
Script.back(response, "로그인 실패");
}
}
key값인 principal 은 UserController에서 cmd.equals("login") 기능 내부에서
session.setAttribute() 되어서 RequestDispatcher를 사용하여 저장된다
이번 글에서 설명하고자 하는것은
"로그인을 하지않은 사용자가 글쓰기를 시도하려한다면?" 에 대한 방법입니다.
config 패키지
ForbiddenUrlConfig.java
package com.cos.blog.config;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 이제부터는 내부에서의 모든 요청은 RequestDispatcher로 해야한다.
// 그래야 다시 필터를 타지 않는다.
public class ForbiddenUrlConfig implements Filter{
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
System.out.println("ForbiddenUrlConfig 접근");
System.out.println(request.getRequestURL());
System.out.println(request.getRequestURI());
if(request.getRequestURI().equals("/blog/") || request.getRequestURI().equals("/blog/index.jsp")) {
chain.doFilter(request, response);
}else {
PrintWriter out = response.getWriter();
out.print("잘못된 접근입니다.");
out.flush();
}
}
}
WEB-INF 폴더에 있는
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="4.0"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd">
<description>MySQL Test App</description>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<filter>
<filter-name>charConfig</filter-name>
<filter-class>com.cos.blog.config.CharConfig</filter-class>
</filter>
<filter>
<filter-name>forbiddenUrlConfig</filter-name>
<filter-class>com.cos.blog.config.ForbiddenUrlConfig</filter-class>
</filter>
<!-- 매핑순서가 1 -->
<filter-mapping>
<filter-name>charConfig</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 매핑순서가 2 -->
<filter-mapping>
<filter-name>forbiddenUrlConfig</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
</web-app>
만들었던 필터를 등록시킨다. 완전히 적용시키려면 서버를 재실행해야한다.
페이지 이동방법 설명
sendRedirect() = 외부로 갔다가 내부필터에 다시 들어옴
RequestDispatcher() = 톰캣이 생성하는 request, response를 재사용하여 덮어씌움
그래서 프로젝트 중에 사용했던 sendRedirect()를 모두 RequestDispatcher()로 바꿔주어야한다.
그렇지않으면 방금 만든 필터때문에 잘못된 접근 경고페이지를 보게될것이다.
바꾸어야할 파일 : UserController.java , BoardController.java .... 등등 sendRedirect() 사용했던 모든곳
예시
else if(cmd.equals("joinForm")) {
//response.sendRedirect("user/joinForm.jsp");
RequestDispatcher dis =
request.getRequestDispatcher("user/joinForm.jsp");
dis.forward(request, response);
}
'국비지원 Spring프레임워크 > JSP dynamic web project blog' 카테고리의 다른 글
blog 6. 글 목록 페이징 하기 (0) | 2021.02.23 |
---|---|
blog 5. 글 목록 보기 (0) | 2021.02.16 |
blog 3. 글작성, DB INSERT (0) | 2021.01.27 |
blog 2. 회원가입, 로그인 만들기 (0) | 2021.01.11 |
blog 1. DB생성 , Model 생성, DB연동 + JUnit 테스트 (0) | 2021.01.08 |