JSP 수업 기록

22-12-07 mvc2구조 글목록 화면에 뿌리기, 글 삭제 / 15강 필터 내용

JadeStone 2022. 12. 7. 21:39

15강-filter란.pdf
0.31MB

 

<오늘 내용 복습> 

-board 컨트롤러 기능 작업-

1.작성된 글 내용들 list 페이지에 뿌리기.
 -서비스 영역에서 bno 키워드를 통해서 해당 bno의 해당하는 글내용들을 
 각각의 vo 객체에 저장해서 리스트로 저장하여 controller에 가져왔다.
 -다음페이지로만 ArrayList 객체배열을 넘겨줄 것이기에
 request.setAttribute에 데이터를 담아서 board_list.jsp 페이지로 넘어간다.
 -board_list 페이지에 작성된 글 리스트(ArrayList)가 넘어와 있다. 
 지정된 변수명은 list.
 JSTL 구문에서 c:forEach 구문을 통해서 list의 각 vo의 값을 해당 태그에 맞게 뿌려준다.

 -글 제목을 눌렀을 때 글 세부내용(board_content)화면으로 넘어가게 a태그를 걸어줌
  이때 해당하는 글을 분별한 bno(글번호)가 필요해서 겟방식 중에 주소에 값을 담아서 보내는 방법을 사용했다.
  a href="board_content.board?bno=${vo.bno}" 이렇게.
  
  그럼. 컨트롤러를 타고 board_content 페이지가 열린다.
  
2.글에대한 삭제
 -서비스 영역에 딜리트 메서드를 만든다. 
  글을 딜리트 하기 위해서는 글의 번호가 필요하다. 그래서 서비스 객체에서 bno값을 받아온다.
  DAO 클래스에서 글의 번호를 이용해서 해당하는 행을 삭제.
  반환 값을 serviceImpl에서 받는다 메서드 기능 완성.
  -보드 컨트롤러에서 반환값에 따라서 경고창에 알림을 주도록 한다. 
  그러면서 board_list 창으로 넘어감.

 <15강 filter>
 

# 필터의 생성 방법

  
 #필터를 사용하는 방법은 2가지가 있음.

  
 1.어노테이션

-어노테이션 사용은 위의 사진과 같이 사용된다.

 필터가 한개일 때 주로 사용된다. 하지만 사용되어야 하는 필터가 여러개일 때는 web.xml을 이용한 방법으로 해야한다.

 

AuthFilter.java

package com.example.util.filter;

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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

//필터를 실행할 요청 경로
@WebFilter({"/board/board_write.board",
	 	 	"/board/board_modify.board",
	 	 	"/board/registForm.board",
	 	 	"/board/updateForm.board",
	 	 	"/board/board_delete.board"})
public class AuthFilter implements Filter {
       

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		//권한검사
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse res = (HttpServletResponse)response;
		
		//req에서 세션을 얻음
		HttpSession session = req.getSession();
		String user_id =(String)session.getAttribute("user_id");
		
		//user_id == null 이라면 권한이 없다는 의미
		if(user_id == null) {
			
			String path = req.getContextPath(); //컨택스트패스
			
			res.setContentType("text/html; charset=utf-8");
			PrintWriter out = res.getWriter();
			out.println("<script>");
			out.println("alert('권한이 필요한 기능입니다');");
			out.println("location.href='"+path+"/user/user_login.user"+"';");
			out.println("</script>");
			
			return; //함수를 종료하면 컨트롤러로 연결되지 않음
			
		}
		
		chain.doFilter(request, response);//필터가 여러개라면 다음필터로 연결함 . 다음 필터가 없으면 원래 요청이 들어오는 컨트톨러로 붙여줌.
	}


}

 

AuthFilter2.java

package com.example.util.filter;

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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebFilter({"/board/board_modify.board",
			"/board/updateForm.board",
			"/board/board_delete.board"}) //경로
public class AuthFilter2 implements Filter{

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		/*
		 * 세션의 user_id와 request로 넘어오는 작성자가 다르면 수정불가.
		 * 
		 * 1. 각 요청경로에서 writer가 파라미터로 반드시 전달되도록 처리.
		 * 
		 */
		request.setCharacterEncoding("utf-8");
		
		//권한검사
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse res = (HttpServletResponse)response;
		
		//각요청에 넘어오는 writer파라미터
		String writer = request.getParameter("writer");
		
		//세션에 저장된 user_id
		HttpSession session = req.getSession();
		String user_id = (String)session.getAttribute("user_id");
		
		System.out.println(writer);
		System.out.println("세션ID" + user_id);
		
		if(user_id == null || !writer.equals(user_id)) {
			
			String path = req.getContextPath(); //컨택스트패스
			
			res.setContentType("text/html; charset=utf-8");
			PrintWriter out = res.getWriter();
			out.println("<script>");
			out.println("alert('권한이 필요한 기능입니다');");
			out.println("location.href='"+path+"/board/board_list.board"+"';");
			out.println("</script>");
			
			return;
		}
		
		
		chain.doFilter(request, response);
		
	}

}


 2. web.xml

-web.xml 생성하는 법


 

-web.xml 방식은 필터를 여러개 사용해야할 때 사용됨.

 

web.xml 파일 내용

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
  <display-name>JSPWeb</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 필터 등록하는 방법과 필터체이닝 -->
  <!--  
  <filter>
  	<filter-name>A</filter-name>
  	<filter-class>com.example.util.filter.AuthFilter</filter-class>
  </filter>
  
  <filter-mapping>
  	<filter-name>A</filter-name>
  	<url-pattern>/board/board_write.board</url-pattern>
  </filter-mapping>
  
  <filter>
  	<filter-name>B</filter-name>
  	<filter-class>com.example.util.filter.AuthFilter2</filter-class>
  </filter>
  
  <filter-mapping>
  	<filter-name>B</filter-name>
  	<url-pattern>/board/board_write.board</url-pattern>
  </filter-mapping>
  -->
  
</web-app>


 
 <기억할 내용>
 #get방식 중에서 주소에 값을 어 보내주는거를 쿼리스트링이라고함.