Cookie / Session #2

์ด๋™์–ธยท2024๋…„ 8์›” 1์ผ

new world

๋ชฉ๋ก ๋ณด๊ธฐ
20/62
post-thumbnail

8.1 (๋ชฉ)

1. Listener

๐Ÿ‘‰์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋กœ, ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒ๋ช… ์ฃผ๊ธฐ ์ด๋ฒคํŠธ, ์„ธ์…˜ ์ด๋ฒคํŠธ ๋“ฑ์ด ์žˆ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด ์„œ๋ฒ„๊ฐ€ ๊ฐ€๋™ํ•˜๊ณ  ์ข…๋ฃŒ๋ ๋•Œ ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ๋„ ํ•˜๊ณ  RequestEvent(์š”์ฒญ์ด๋ฒคํŠธ)๋ฅผ ํ†ตํ•ด์„œ ๋ˆ„๊ตฐ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ๋ฐฉ๋ฌธ ํ–ˆ๋‹ค๋Š”๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.




2. Servlet Context

๐Ÿ‘‰ ๊ธฐ์กด์˜ DAO์—์„œ enum์„ ํ†ตํ•ด INSTANCE ์ƒ์„ฑํ•˜์—ฌ ์–ด๋–ค ์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋“  ํ•œ๊ฐœ์˜ ๊ฐ์ฒด๋กœ singleton์„ ์‚ฌ์šฉํ–ˆ๋˜๊ฒƒ ์ฒ˜๋Ÿผ, ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์–ด๋–ค๊ณณ์—์„œ๋“  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

๐Ÿ‘‰ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์—ญ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด๋กœ ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ์™€ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์„œ๋ธ”๋ฆฟ๋“ค์ด ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™˜๊ฒฝ ์„ค์ • ๋ฐ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.




3. Listener ์˜ˆ์ œ

3-1. LoadListener


@WebListener
@Log4j2
public class LoadListener implements ServletContextListener, ServletRequestListener {

    @Override
    public void contextDestroyed(ServletContextEvent sce) { //์„œ๋ฒ„๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ํ˜ธ์ถœ

        log.info("contextDestroyed");
        log.info("contextDestroyed");
        log.info("contextDestroyed");
        log.info("contextDestroyed");


    }

    @Override
    public void contextInitialized(ServletContextEvent sce) { //์„œ๋ฒ„๊ฐ€ ๊ฐ€๋™ํ• ๋•Œ

        ServletContext context = sce.getServletContext(); // context์ƒ์„ฑ

        ReqCounter counter = new ReqCounter(); // counter ๊ฐ์ฒด์ƒ์„ฑ
        context.setAttribute("counter", counter); // ์–ธ์ œ์–ด๋””์„œ๋‚˜ counter๋ผ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

        log.info("contextInitialized");
        log.info("contextInitialized");
        log.info("contextInitialized");
        log.info("contextInitialized");


    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {

        log.info("requestDestroyed");

    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) { //์ƒˆ๋กœ์šด ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ๋•Œ

        log.info(sre.getServletRequest().getRemoteAddr());

        Object counterObj = sre.getServletRequest().getServletContext().getAttribute("counter");
            // "counter"๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ServletContext์— ์ €์žฅ๋œ ReqCounter ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
            ReqCounter counter = (ReqCounter) counterObj;

            counter.inc();
        }

    }




3-2. ReqCounter

package org.example.w2.common;

import lombok.ToString;
import lombok.extern.log4j.Log4j2;

@ToString
public class ReqCounter {

    private int count;

    public void inc(){
        count+=1;
    }

    public int getCount(){
        return count;
    }
}




${counter}

๐Ÿ“Œ ๊ฒฐ๊ณผํŽ˜์ด์ง€

๐Ÿ‘‰ ํ˜„์žฌ๋ฐฉ๋ฌธ์ž์ˆ˜ ๋ฐ Request ํšŸ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.





@WebServlet(value = "/login")
@Log4j2
public class LoginController extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.getRequestDispatcher("/WEB-INF/login.jsp").forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String uid = req.getParameter("uid");
        String upw = req.getParameter("upw");


        try {
            Optional<MemberVO> result = MemberDAO.INSTANCE.get(uid,upw);

            result.ifPresentOrElse( memberVO -> {

                Cookie loginCookie = new Cookie("member", uid); //member๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ uid์˜ ๊ฐ’์ด ๋„ฃ์–ด์ ธ์žˆ๋‹ค.
                loginCookie.setPath("/"); // /์Šฌ๋ž˜์‰ฌ๋กœ ํ•ด๋†“์œผ๋ฉด ๋ชจ๋“ ๊ฒฝ๋กœ์— ๋‹ค ๋จนํžŒ๋‹ค.
                loginCookie.setMaxAge(60 * 60 * 24); //24์‹œ๊ฐ„ ์œ ์ง€๋˜๋Š” ์ฟ ํ‚ค

                resp.addCookie(loginCookie); //์ฟ ํ‚ค ์ €์žฅํ•ด์ฃผ๊ธฐ.

                try {
                    resp.sendRedirect("/mypage");
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }


            }, () -> {
                try {
                    resp.sendRedirect("/login");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } );


        } catch (Exception e) {
            throw new RuntimeException(e);
        }



    }
}

๐Ÿ‘‰ getParameter๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ uid, upw์˜ ๊ฐ’์„ DAO ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ memberVO์˜ ๊ฐ’์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํŒ๋ณ„ํ•˜๋Š”๋ฐ, ๋งŒ์•ฝ ๊ฐ’์ด ์žˆ์œผ๋ฉด ๋‚ด๊ฐ€ ์ฐพ๋Š” ์•„์ด๋””๊ฐ€ DB์—๋„ ์žˆ๋‹ค๋Š” ๋ง์ด๋‹ˆ๊นŒ Cookie๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ํ•ด๋‹น cookie๋ฅผ member๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ uid์˜ ์ •๋ณด๋ฅผ ๋„ฃ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์ฟ ํ‚ค๋Š” 1์ผ๊ฐ„ ์œ ์ง€๊ฐ€ ๋œ๋‹ค.




4-2. MyPage Controller


@WebServlet(value = "/mypage")
@Log4j2
public class MyPageController extends HttpServlet { //redirect๋กœ ๋ถˆ๋Ÿฌ์˜จ ์• ๋Š” get๋ฐฉ์‹์œผ๋กœ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์—

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        log.info("get");


       Cookie[] cks = req.getCookies(); //์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•˜๊ธฐ

       if(cks == null || cks.length == 0){
           resp.sendRedirect("/login");
           return;
       }

        req.getRequestDispatcher("/WEB-INF/mypage.jsp").forward(req, resp);
    }
}

๐Ÿ‘‰ ํ•ด๋‹น์ฝ”๋“œ์—์„œ๋Š” ํ˜„์žฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ฟ ํ‚ค๊ฐ€ ์—†๋‹ค๋ฉด loginํ™”๋ฉด์œผ๋กœ ์ด๋™์‹œ์ผœ๋ฒ„๋ฆฌ๊ณ , ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด mypage๋กœ ์ด๋™ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•œ๋‹ค.



4-3. Logout Controller

@WebServlet(value="/logout")
@Log4j2
public class LogoutController extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•œ ๋กœ๊ทธ์•„์›ƒ
        //์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•œ ๋กœ๊ทธ์•„์›ƒ์„ ํ•˜๊ฒŒ ๋˜๋ฉด mypage๋Š” ๋‚˜์˜ค๋Š”๋ฐ, mypage์— ๋‚˜์˜ค๋˜ cookie์˜ ์ฃผ์†Œ๊ฐ’์€ ๋‚˜์˜ค์ง€์•Š๋Š”๋‹ค.
        Cookie[] cookies = req.getCookies();

        if(cookies != null && cookies.length > 0) {
            for(Cookie cookie : cookies) {

                if(cookie.getName().equals("member")) {
                    cookie.setMaxAge(0);
                    resp.addCookie(cookie);
                    break;
                }

            }
        }

๐Ÿ‘‰ ๋กœ๊ทธ์ธ ๊ด€๋ จ ์ฟ ํ‚ค๋Š” member์ฟ ํ‚ค์ธ๋ฐ, ํ˜„์žฌ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ์ฟ ํ‚ค๋ฅผ ๋กœ๋“œ ํ•˜์—ฌ, ๋งŒ์•ฝ ๊ทธ ์ฟ ํ‚ค์˜ ์ด๋ฆ„์ด member๋ผ๋ฉด ์œ ํšจ๊ธฐ๊ฐ„์„ 0์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋กœ๊ทธ์•„์›ƒ์‹œํ‚จ๋‹ค.




4-4. login.jsp


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/login" method="post">

        <div>
            <img src="/capcha">
            <input name="number" type = "text">
        </div>

        <div>
            <label>ID or Email</label>
        <input name="uid" type="text">
        </div>

        <div>
            <label>PassWord</label>
        <input name="upw" type="password">
        </div>

        <button>LOGIN</button>
    </form>

<div>
    <form action="/member/join">
        <button type="submit">Join</button>
    </form>
</div>
</body>
</html>




4-5. mypage.jsp


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>MyPage</h1>

    <h2>${cookie.member}</h2>

    <form action = "/logout" method="post">
        <button>LOGOUT</button>
    </form>

</body>
</html>

๐Ÿ‘‰ mypage์—์„œ๋Š” cookie.member๋ฅผ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.




5. session์„ ์ด์šฉํ•œ movie mini project

5-1. SigninController

@WebServlet(value="/signin")
@Log4j2
public class SigninController extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        log.info("sign doGet");

        req.getRequestDispatcher("/WEB-INF/signin.jsp").forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            log.info("sign doPost");
            String uid = req.getParameter("uid"); //uid์˜ ์ •๋ณด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.


            HttpSession session = req.getSession(); //์„ธ์…˜์ด ์—†์œผ๋ฉด ์ƒ์„ฑ, ์žˆ์œผ๋ฉด ๊ธฐ์กด๊ฒƒ์œผ๋กœ ์‹œ์ž‘.

            session.setAttribute("userInfo", uid);
            // userInfo๋ผ๋Š” ์ด๋ฆ„์˜ ์„ธ์…˜์— uid์ •๋ณด๋ฅผ ๋„ฃ์–ด์ค€๋‹ค. ๊ฒฐ๊ตญ์—๋Š” Obejct userInfo = uid
            // ์ด๋ ‡๊ฒŒ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ํ™œ์šฉ๋„ ๊ฐ€๋Šฅํ•˜๊ณ , ๋‹ค๋ฅธ ํŽ˜์ด์ง€์—์„œ ์ด ํŽ˜์ด์ง€๋ฅผ ๋“ค๋ ธ๋‹ค๋Š” ์ž…์žฅ๊ถŒ ์—ญํ• ๋„ ํ•œ๋‹ค.
            resp.sendRedirect("/movies");
    }
}




5-2. MoviesController

@WebServlet(value="/movies")
@Log4j2
public class MoviesController extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        log.info("movies doGet");

        ArrayList<String> movies = new ArrayList<>();
        // movies๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ jpg์‚ฌ์ง„์„ ๋„ฃ์„ list๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค.

        movies.add("movie1.jpg");
        movies.add("movie2.jpg");
        movies.add("movie3.jpg");
        movies.add("movie4.jpg");
        movies.add("movie5.jpg");

        req.setAttribute("movies", movies);
        //jsp์—์„œ๋Š” movies๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ movies ๋ฐฐ์—ด์˜ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ€์žˆ์–ด์„œ ๋ณ€์ˆ˜์—ญํ• ์„ ํ•˜๊ณ .
        //Controller์—์„œ๋Š” session์ž…์žฅ๊ถŒ ์—ญํ• ์„ํ•œ๋‹ค.

        req.getRequestDispatcher("/WEB-INF/movies.jsp").forward(req, resp);
    }
}




5-3. BuyController

@WebServlet(value = "/buy")
@Log4j2
public class BuyController extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        log.info("buy doPost");

        String [] items = req.getParameterValues("item");
        // movies.jsp์—์„œ ์„ ํƒํ•œ๊ฒƒ์ธ name="item"์˜ item์„ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.
        // ๊ทธ๊ฒƒ๋“ค์„ String์œผ๋กœ ๋ฐฐ์—ด์— ๋‹ด๋Š”๋‹ค.

        if(items == null || items.length == 0){ //๋งŒ์•ฝ์— movies์—์„œ ๋‹ด์ง€ ์•Š์•˜์œผ๋ฉด movies๋กœ ๋‹ค์‹œ ๋ณด๋‚ธ๋‹ค.
            log.info("no");
            resp.sendRedirect("/movies");
            return;
        }


        HttpSession session = req.getSession(false);
        // session์„ ์ƒ์„ฑํ•˜์ง€์•Š๊ณ , ํ•œ๋ฒˆ ๊บผ๋‚ด๋ด.

        Object cartObj = session.getAttribute("cart");
        //cart๋ผ๋Š” session์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.


        if(cartObj == null){ // cart session์ด ์—†๋‹ค๋ฉด (์ฒซ๋ฐฉ๋ฌธ)
            ArrayList<String> cartItems = new ArrayList<>();
            for(int i = 0; i < items.length; i++){
                cartItems.add(items[i]);
            }
            session.setAttribute("cart", cartItems); // ๋‚˜์ค‘์— cart๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ cartItems๋ฐฐ์—ด์„ ์‚ฌ์šฉํ• ๊ฑฐ์•ผ.
        }
        else{ // ์žฌ๋ฐฉ๋ฌธํ• ๋–„
            ArrayList<String> cartItems = (ArrayList<String>) cartObj; //๋‹ค์šด์บ์ŠคํŒ…
            for(int i = 0; i < items.length; i++){
                cartItems.add(items[i]);
            }
        }

        log.info("buy now");
        resp.sendRedirect("/mypage");


    }


}




5-4. MypageController

@WebServlet(value = "/mypage")
@Log4j2
public class MypageController extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        log.info("mypage doGet");

        HttpSession session = req.getSession(false);
        // ์„ธ์…˜๊ฒ€์‚ฌํ•œ๋‹ค. ์—†์œผ๋ฉด ์ƒ์„ฑ์•ˆํ•ด์ฃผ๊ณ , ์žˆ๋Š”๊ฑฐ ๊บผ๋‚ด๋ผ.

        Object cartSession = session.getAttribute("cart");
        //cart๋ผ๋Š” ์„ธ์…˜์„ cartSession์— ๋‹ด์•„๋‘๊ณ  (์ด ๊ณผ์ • ์ƒ๋žตํ•˜๊ณ  ๋ฐ‘์— ์ฝ”๋“œ๋ž‘ ํ•ฉ์ณ๋„ ๋ฌด๋ฐฉ session์ด Object ํƒ€์ž…์ธ๊ฑธ ๋ณด์—ฌ์ฃผ๊ณ ์‹ถ์—ˆ์Œ.)

        if(cartSession == null) { // cart session์ด ์—†๋‹ค๋ฉด movies๋กœ ๋“ค๋ ค
            resp.sendRedirect("/movies");
            return;
        }

        req.getRequestDispatcher("/WEB-INF/mypage.jsp").forward(req, resp);
    }
}




5-5. LoginCheckFilter

@WebFilter(urlPatterns = {"/movies","/buy","/mypage"}) 
// ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์œผ๋กœ ๋“ค๊ณ ์žˆ์–ด์•ผํ•˜๋Š” userInfo๋ผ๋Š” session ๊ฐ’์€ ๋งค ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ๊ฒ€์‚ฌํ• ๊ฑฐ์•ผ. 
// value ๋ผ๊ณ  ํ•ด๋„ ์ƒ๊ด€์—†์Œ.

@Log4j2

public class LoginCheckFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;

        HttpSession session = req.getSession(false);
        //session ๊ฒ€์‚ฌํ•œ๋‹ค. ์žˆ์œผ๋ฉด ๊บผ๋‚ด๊ณ , ์—†์œผ๋ฉด ์ƒ์„ฑ์•ˆํ•ด์ค˜

        if(session == null || session.getAttribute("userInfo") == null){ 
        //๊ฐ€์žฅ ์ฒ˜์Œ์— ์ง€๊ธ‰ํ•˜๋Š” userInfo ๊ฒ€์‚ฌ.
        
            resp.sendRedirect("/signin"); //์—†์œผ๋ฉด ์ดˆ๊ธฐํ™”๋ฉด์œผ๋กœ
            log.info("No session");
            return;
        }

        filterChain.doFilter(servletRequest, servletResponse); //๊ผญํ•ด์ค˜์•ผํ•ด.

    }
}




5-6. signin.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Signin Page</h1>

<form action ="/signin" method="post">
    <div>
        <label>ID</label>
        <input type="text" name="uid">
    </div>

    <div>
        <label>PW</label>
        <input type="password" name="upw">
    </div>

    <button>Signin</button>
</form>
</body>
</html>




5-7. movies.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Movies Page</h1>
<style>
    .pic{
        width: 12rem;
        margin : 2rem;
    }
</style>

<form action="/buy" method="post"> <!--buy๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด post๋งŒ ์žˆ๋Š” buy์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ด๋™ํ•œ๋‹ค.-->
        <c:forEach items="${movies}" var="movie"> 
          <!--movies์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฐฐ์—ด๋กœ ๋„ฃ์–ด๋‘๊ณ  movies๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.-->
            <li>
                <img class="pic" src="/img/${movie}">
                <input type="checkbox" name="item" value="${movie}" >${movie}
                <!-- name="item"์€ ๋‚˜์ค‘์— buy์ปจํŠธ๋กค๋Ÿฌ์—์„œ item์„ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜๋ฉด ๋‚ด๊ฐ€ ์„ ํƒํ•œ value(์‚ฌ์ง„)๋“ค์ด ๋“ค์–ด์˜จ๋‹ค.-->
            </li>
        </c:forEach>
    <button>BUY</button>
</form>
</body>
</html>




5-8. mypage.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<style>
    .pic{
        width: 12rem;
        margin : 2rem;
    }
</style>
<h1>My Page</h1>
<h2>๋‚ด๊ฐ€ ๊ตฌ๋งคํ•œ ๋ชฉ๋ก</h2>
<ul>
    <c:forEach items="${cart}" var="item">
        <li>
            <img class="pic" src="/img/${item}">
            ${item}
        </li>
    </c:forEach>
</ul>

</body>
</html>




6. ์„œ๋ธ”๋ฆฟ์„ ์ด์šฉํ•œ ์ž๋™๊ฐ€์ž…๋ฐฉ์ง€ ์ˆซ์ž์ƒ์„ฑ.

@WebServlet(value = "/capcha")
public class ImageMaker extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //์ง€๊ธˆ ๋งŒ๋“œ๋Š”๊ฑด imageํŒŒ์ผ์ด๋‹ค ๋ผ๊ณ  ์„ ์–ธ
        resp.setContentType("image/jpeg");

        //๋ฉ”๋ชจ๋ฆฌ์ƒ์— ๋งŒ๋“œ๋Š” ์ด๋ฏธ์ง€, ๊ฐ€๋กœ 300 ์„ธ๋กœ200์ธ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
        BufferedImage image
                = new BufferedImage(300, 200, BufferedImage.TYPE_INT_RGB);


        Graphics g = image.getGraphics(); //๋ถ“์„ ๋งŒ๋“ ๋‹ค

        g.setColor(Color.lightGray);
        g.fillRect(0, 0, 300, 200); //(0,0) ~ (300,200) ๊นŒ์ง€ ์ฑ„์šฐ๊ธฐ

        g.setColor(Color.black);
        g.setFont(new Font("Arial", Font.BOLD, 20)); //ํฐํŠธ์ •ํ•˜๊ธฐ

        int number = (int)(Math.random() * 10000);

        HttpSession session = req.getSession();
        session.setAttribute("tempNum", number); //์ด๋ฏธ์ง€ ์ˆซ์ž์™€ ์ผ์น˜ํ•œ์ง€ ํ™•์ธ

        g.drawString("" + number ,10,100); // ๋ฌธ์ž์™€ ์ˆซ์ž๋ฅผ ํ•ฉ์ณ์„œ ๋ฌธ์ž๋ฅผ ๋งŒ๋“ค๊ธฐ / 10,100์€ ์ขŒํ‘œ


        @Cleanup OutputStream out = resp.getOutputStream();

        //์œ„์˜ image๊ฐ์ฒด๋ฅผ jpeg์˜ ํ˜•ํƒœ๋กœ OutputStremํ• ๊ฒƒ์ด๋‹ค.
        ImageIO.write(image, "jpeg", out);
    }
}

๐Ÿ‘‰ ์ดํ›„์— ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” jsp์— ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด๋œ๋‹ค.

<div>
	<img src="/capcha">
 	<input name="number" type = "text">
</div>

0๊ฐœ์˜ ๋Œ“๊ธ€