-
백엔드 (3) - 서블릿 포워드, 쿠키와 세션백엔드 프로그래밍 2021. 12. 29. 23:47
서블릿 포워드 방법
- rediret : HttpServletResponse 객체의 sendRedirect() 메소드 사용
- 형식 : sendRedirect ( "포워드할 서블릿 또는 JSP");
- refresh : HttpServletResponse 객체의 addHeader() 메소드 사용
- 형식 : response.addHeader ("Refresh", 경과시간(초);url=요청할 서블릿 또는 JSP);
- location : 자바스크립트 location 객체의 href 속성 이용
- 형식 : location.href = "요청할 서블릿 또는 JSP";
- dispatch : 일반적으로 포워딩 기능 지칭
- 형식 : RequestDispatcher dis = request.getRequestDispatcher ("포워드할 서블릿 또는 JSP");
- dis.forward(request, response);
- 형식 : RequestDispatcher dis = request.getRequestDispatcher ("포워드할 서블릿 또는 JSP");
redirect, refresh, location
- 서블릿이 웹 브라우저를 거쳐 다른 서블릿이나 JSP에게 요청하는 방법
dispatch
- 클라이언트를 거치지 않고 서블릿에서 바로 다른 서블릿에게 요청하는 방법
포워딩 예제 : sec08
- redirect 이용한 포워딩
`protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {` `// 서버 -> 클라이언트로 setContentType` `response.setContentType("text/html;charset=utf-8");` `response.sendRedirect("second01");` `}` `}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 서버 -> 클라이언트로 setContentType response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("sendRedirect를 이용한 redirect 포워딩"); out.println("</body></html>"); } }
- refresh 이용한 포워딩
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.addHeader("Refresh","2;url=second02"); } }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 서버 -> 클라이언트로 setContentType response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("refresh를 이용한 redirect 포워딩"); out.println("</body></html>"); } }
- location 이용한 포워딩
// location을 이용한 포워딩 // 자바스크립트의 location 객체 사용 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("<script type='text/javascript'>"); out.println("location.href='second03';"); out.println("</script>"); } }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("location.href를 이용한 포워딩"); out.println("</body></html>"); } }
- 포워딩 하면서 데이터 전달
- redirect 이용
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.sendRedirect("second04?name=hong"); } }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); // url 뒤에 붙어서 전송된 데이터 받기 : "second04?name=hong" String name = request.getParameter("name"); out.println("<html><body>"); out.println("이름 : " + name); out.println("</body></html>"); } }
- dispatch 이용한 포워딩
- url 안 바뀜 : http://localhost:8080/Servlet01/first05
- /second05로 이동된 페이지 내용 출력되지만 url은 first05 그대로
- 클라이언트를 안거쳐 가서!!!
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher dispatch = request.getRequestDispatcher("second05?name=lee"); dispatch.forward(request, response); } }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); // url 뒤에 붙어서 전송된 데이터 받기 : "second05?name=lee" String name = request.getParameter("name"); out.println("<html><body>"); out.println("이름 : " + name); out.println("<br> dispath 이용한 포워딩"); out.println("</body></html>"); }
GET 방식으로 데이터 전달 시 문제
- 대량의 데이터를 전달할 때 : 길이 제한, 안전성, 불편..
- 바이딩(binding) 기능 사용
- 바인딩 방법
- 포워딩할 때 setAttribute("바인딩이름", 데이터) 메소드 사용해서
- 바인딩이름과 데이터를 묶어서 설정한 후
- 포워딩된 문서에서 getAttribute("바인딩이름") 메소드를 이용해서
- 바이딩된 데이터를 추출해서 사용
- 바인딩 방법
- redirect 방식으로는 서블릿에서 바인딩한 데이터를 다른 서블릿으로 전송할 수 없음
- dispatch 포워딩 방법일 경우에만 바인딩 가능
바인딩 예제 : sec08 -> 06
- redirect 방식으로 바인딩 : 바인딩 안 되는 것 보여주는 예제
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); request.setAttribute("address", "서울시 강남구"); response.sendRedirect("second06"); } }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); String address = (String)request.getAttribute("address"); out.println("<html><body>"); out.println("주소 : " + address); out.println("<br> redirect를 이용한 바인딩"); out.println("</body></html>"); } }
- dispatch 방식으로 바인딩
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); request.setAttribute("address", "서울시 강남구"); RequestDispatcher dispatch = request.getRequestDispatcher("second07"); dispatch.forward(request, response); } }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); String address = (String)request.getAttribute("address"); out.println("<html><body>"); out.println("주소 : " + address); out.println("<br> dispatch를 이용한 바인딩"); out.println("</body></html>"); } }
- 데이터베이스의 회원 정보를 ArrayList 객체에 저장한 후 바인딩
(3) 데이터베이스의 회원 정보를 ArrayList 객체에 저장한 후 바인딩 (setAttribute()) ViewServlet에서 getAttribute() 사용해서 회원 정보 가져와서 출력 sec09 복사 MemberVO MemberDAO 추가 MemberBindingServlet : /memBinding MemberViewServlet : /memView
- MemberBindingServlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doProcess(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doProcess(request, response); } protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { MemberDAO dao = new MemberDAO(); ArrayList<MemberVO> memList = dao.memberSelect(); request.setAttribute("memList", memList); // 이름, 데이터 RequestDispatcher dispatch = request.getRequestDispatcher("memView"); dispatch.forward(request, response); } }
- MemberViewServlet
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // (1) 요청 받음 request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); // (2) 비즈니스 로직 처리 : DAO 호출하고 결과 받아옴 List memList = (List) request.getAttribute("memList"); // ArrayList<MemberVO> memList = (ArrayList<MemberVO>) request.getAttribute("memList"); // (3) 응답 처리 : 클라이언트에게 결과 전송 out.print("<html><head></head><body>"); out.print("<table border=1><tr align='center' bgcolor='gold'>"); out.print("<td>아이디</td><td>비밀번호</td><td>이름</td>" + "<td>이메일</td><td>가입일</td><td>삭제</td></tr>"); for(int i=0; i<memList.size(); i++) { MemberVO vo = (MemberVO) memList.get(i); String id = vo.getId(); String pwd = vo.getPwd(); String name = vo.getName(); String email = vo.getEmail(); Date joinDate = vo.getJoinDate(); // 한 행씩 출력 out.print("<tr><td>" + id + "</td><td>" + pwd + "</td><td>" + name + "</td><td>" + email + "</td><td>" + joinDate + "</td><td>" + "<a href='/Servlet01/memberDelete?id=" + id + "'>삭제</a></td></tr>"); } out.print("</table></body></html>"); } }
- MemberVO, MemberDAO는 가져와서 쓴거!!!
쿠키와 세션
- 클라이언트와 서버 간에 정보를 교환하는데
- 클라이언트 PC 또는 서버의 메모리에 저장해 두고 사용하면 프로그램 속도를 향상 시킬 수 있음
HTTP 프로토콜
- 서버 - 클라이언트 통신 시 stateless 방식으로 통신
- 브라우저에서 새 웹페이지를 열면 기본의 웹페이지나 서블릿에 관한 어떤 연결 정보도 유지 되지 않음
- 새로 열린 페이지에서 어떤 정보도 알 수 없음
- 페이지가 서로 독립적이어서 서로의 상태를 알 수 없음
웹 페이지 사이에 또는 서블릿 간에 상태나 정보를 공유하려면
- 웹 페이지를 연결시켜 주는 기능이 필요 : 세션 트레킹
웹 페이지를 연결하기 위한 방법
페이지 간에 정보를 교환하거나 데이터를 공유하기 위한 방법 (1) <hidden> 태그 사용 <input type=’hidden’ value=’${id}’> 태그 사용 - 현재 페이지에 데이터를 숨겨놓고 - 연결된 다음 페이지로 데이터를 보내는 방법 - 두 웹페이가 데이터를 공유 - 페이지1에서 <input type=’hidden’ name=’id’ value=’abcd’>로 데이터 숨겨 놓음 - 페이지2에서 request.getParameter()로 받아서 사용할 수 있음 (2) URL Rewriting - GET 방식으로 전송할 때 데이터가 URL 뒤에 붙어서 다음 페이지로 전송 - second02?name=lee - 다음 페이지에서 request.getParameter()로 받아서 사용할 수 있음 - (3) 쿠키 - 클라이언트 PC의 Cookie 파일에 정보를 저장한 후 웹 페이지 공유 - (4) 세션 - 서버 메모리에 정보를 저장한 후 웹 페이지 공유
'hidden'과 URL Rewriting 방식
- GET 방식으로 전송 : 데이터 노출, 길이 제한, 보안 문제
예제 ( 프로젝트 새로 생성 Servlet02 )
프로젝트 새로 생성 Servlet02 Java Build Path / Classpath에 Servlet-api.jar 추가 패키지 생성 : sec01 hidden 방식 - login-hidden.html - LoginHiddenServlet : /loginHidden URL Rewriting - login.html - LoginServlet : /login
- hidden
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); String user_id = request.getParameter("user_id"); String user_pw = request.getParameter("user_pw"); String user_address = request.getParameter("user_address"); String user_email = request.getParameter("user_email"); String user_hp = request.getParameter("user_hp"); String data = "<html><body>"; data += "안녕하세요!<br> 로그인하셨습니다.<br><br>"; data += "아이디 : " + user_id + "<br>"; data += "비밀번호 : " + user_pw + "<br>"; data += "주소 : " + user_address + "<br>"; data += "이메일 : " + user_email + "<br>"; data += "휴대전화 : " + user_hp + "<br>"; data += "</body></html>"; out.print(data); } }
- URL Rewriting
// URL Rewriting 방식 이용 user_address = URLEncoder.encode(user_address, "utf-8"); out.print("<br><br><a href='/Servlet02/second?user_id=" + user_id + "&user_pw=" + user_pw + "&user_address=" + user_address + "'>두 번째 서블릿으로 보내기</a>"); data = "</body></html>"; } else { out.println("로그인 하지 않았습니다. <br><br>"); out.println("다시 로그인 하세요. <br><br>"); out.println("<a href='/Servlet02/login.html'>로그인 창으로 이동</a>"); } }
- 쿠키
- 서버 측에서 클라이언트 측에 상태 정보를 저장하고 추출하기 위한 메커니즘
- 서버에서 생성하여, 클라이언트 측에 저장됨
- 서버에 요청할 때마다 속성 값을 참조하거나 변경
- 크기는 4kb 용량
- 클라이언트에 300개까지 쿠키 저장 가능
- 하나의 도메인 당 20개의 값만 저장
- 클라이언트에 저장되므로 보안상의 문제 발생
- 따라서 민감한 정보는 쿠키 내에 저장하지 않음
- 쿠키는 사용자가 거부할 수 있으면 256문자 이하의 text 데이터만 저장됨
- 쿠키 생성 및 저장 과정
- 서버에서 쿠키 생성
- Cookie 클래스로부터 쿠키 객체 생성
- Cookie cookie = new Cookie(이름, 값);
- 속성 설정
- setter 사용해서 쿠키 객체의 유효기간 설정
- cookie.setMaxAge(초단위_유효기간);
- 클라이언트에 전송되어 저장
- response 내장 객체의 addCookie() 메소드로 전송
- response.addCookie(쿠키객체);
- 서버에서 쿠키 생성
쿠키 관련 주요 메소드
setMaxAge() : 유효 기간 설정 setValue() : 쿠키 값 설정 sevVersion() : 쿠키 버전 설정 setPath(0 : 쿠키 사용의 유효 디렉터리 설정 getMaxAge() : 유효 기간 반환 getName() : 쿠키 이름 반환 getValue() : 쿠키 값 반환 .. 쿠키 제거 cookie.setMaxAge(0) 으로 설정 클라이언트에 전송되어 변경된 값으로 저장 response.addCookie(cookie)
쿠키 유형
- Persistence 쿠키
- setMaxAge(양수) 메소드를 사용해서 양수값으로 지정해서 파일로 저장하면 지속해서 남아있음
- 유효 기간 동안 지속됨
- Session 쿠키
- 브라우저가 사용하는 메모리에 생성되는 쿠키로
- 브라우저가 종료되면 메모리의 Session 쿠키도 자동으로 소멸
- setMaxAge(음수) : Session 쿠키로 생성
쿠키 예제
sec02 SetCookieValue 서블릿 : /setCookie GetCookieValue 서블릿 : getCookie
@WebServlet("/setCookie") public class SetCookieValue extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); Date d = new Date(); // Cookie 객체 생성한 후 cookieTest 이름으로 한글 정보를 인코딩해서 쿠키에 저장 Cookie cookie = new Cookie("cookieTest", URLEncoder.encode("Cookie 테스트입니다2", "utf-8")); cookie.setMaxAge(24 * 60 * 60);// 유효기간 설정 response.addCookie(cookie);// 생성한 쿠키를 브라우저로 전송해서 저장 out.print("현재 시간 : " + d); out.print("<br> Cookie에 저장"); } }
@WebServlet("/getCookie") public class GetCookieValue extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); Cookie[] allValues = request.getCookies(); for(int i=0; i<allValues.length; i++) { // 생성된 쿠키 이름 cookieTest가 존재한다면 if(allValues[i].getName().equals("cookieTest")) { out.println("<h2>Cookie 값 가져오기 : " + URLDecoder.decode(allValues[i].getValue(), "utf-8")); } } } }
쿠키 이용해서 팝업창 제어
- 팝업창 제어는 서버에서 쿠키를 다루지 않고
- 자바스크립트를 이용해서 쿠키에 접근
예제
popUp.html 체크박스 체크하여 쿠키 설정 : 오늘 더 이상 팝업창 띄우지 않기 쿠키이름=값;패스=/;유효기간=값 popUpTest.html 페이지 로드 하면서 쿠키 읽어 옴 설정한 값이 아니면 팝업창 열림 설정한 값이 있으면 유효기간 전에는 팝업창 안 열림
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>팝업창 </title> <script type="text/javascript"> function setPopUpStart(obj){ if(obj.checked == true){ var expireDate = new Date(); // alert(expireDate); // 오늘 날짜 var days = 1; expireDate.setDate(expireDate.getDate() + days); // alert(expireDate); // 오늘 날짜 + 1일 // 쿠키 값 설정 : 쿠키 이름, 패스, 유효 기간 document.cookie = "notShowPop=" + "true" + ";path=/;expires=" + expireDate.toGMTString(); // 팝업창 닫기 window.close() } } </script> </head> <body> 알림 팝업창입니다. <br><br><br><br><br><br> <form> <input type="checkbox" onClick="setPopUpStart(this)">오늘 더 이상 팝업창 띄우지 않기 </form> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>popUpTest </title> <script type="text/javascript"> // 시작 시 페이지 로드 함수 호출 window.onload = pageLoad; // 페이지 로드 함수 : 팝업창(popUp.html) 띄우는 함수 function pageLoad(){ // 쿠키 읽어 오는 함수 getCookieValue() 함수 호출해서 저장된 쿠키 읽어 오기 var notShowPop = getCookieValue(); // 읽어 온 쿠키 값이 "true"가 아니면 popUp.html 열기 if(notShowPop != "true"){ window.open("popUp.html", "pop", "width=400, height=500, " + "history=no,resizable=no,status=no,scrollbars=yes,menubar=no"); } } /* 쿠키 읽어 함수 */ function getCookieValue(){ var result = "false"; // 쿠키 존재 여부 확인 : 쿠키가 존재하면 if(document.cookie != ""){ // 구분자를 세미콜론(;)으로 해서 각 값을 배열로 저장 (쿠키이름=값;패스=/;유효기간=값) cookie = document.cookie.split(";"); for(var i=0; i<cookie.length; i++){ // 구분자를 =으로 해서 각 값을 배열로 저장 element = cookie[i].split("="); value = element[0]; // 쿠키 이름 (배열 첫 번째 요소) value = value.replace(/^\s*/,''); // 앞 공백 제거 정규식 (^\s) // 쿠키 이름이 notShowPop 이면 if(value == "notShowPop"){ result = element[1]; // 쿠키 값 가져오기 ("true") (배열 두 번째 요소) } } } return result; } // 쿠키 삭제하는 함수 function deleteCookie(){ document.cookie = "notShowPop=" + "false" + ";path=/;expires=-1"; } </script> </head> <body> <form> <input type="button" value="쿠키삭제" onClick="deleteCookie()"> </form> </body> </html>
공백제거 정규식
replace(' ', '') : 첫 번째 공백 제거 replace(/^\s*/,'') : 앞에 있는 모든 공백 제거 replace(/\s*$/,'') : 뒤의 모든 공백 제거
쿠키 확인법!!!
세션 (Session)
- 클라이언트와 웹 서버 간에 네트워크로 연결이 지속적으로 유지되고 있는 상태
- 쿠키와 마찬가지로 서버와의 관계를 유지하기 위한 수단
- 쿠키와 달리 클라이언트 측에 저장되는 것이 아니라 서버 상에 객체로 존재
- 따라서 세션은 서버에서만 접근이 가능하여 보안이 좋음
- 서버에서 사용자의 정보를 유지 관리
- 사용자 인증 후 여러 페이지에 걸쳐 정보를 공유해서 사용할 수 있게 해줌
- Session은 서버 측에서만 설정이 가능
- 브라우저 당 한 개씩 생성
세션 생성 및 사용 과정
- 클라이언트가 서버에 페이지 요청
- Session 자동 생성
- Session 속성 설정
- session 내부 객체의 메소드 사용
세션 ID
- 클라이언트가 처음 접속하면 서버(컨테이너)로 부터 유일한 ID를 부여 받게 되는데 이를 세션 ID라고 하고
- 클라이언트가 재 접속했을 때 클라이언트를 구분하기 위한 수단
- 서블릿에서 생성된 세션 id는 브라우저로 전송되어 세션 쿠키에 쿠키 이름 jessionID로 저장됨
- F12 개발자도구에서 / Application / Cookies에서 확인 가능
세션 관련 메소드
setAttribute(이름, 값) : 세션 이름과 값 설정 getAttribute(이름) : 이름에 해당된 값 반환 getAttributeNames() : 모든 세션 이름 반환 getId() : 세션 ID 반환 isNew() : 새로 생성되었는지 여부 반환 getMaxInactiveInterval() : 설정된 유효기간 반환 removeAttribute() : 설정된 속성값 제거 invalidate() : 실행 중인 세션 종료. 모든 데이터 삭제. 로그아웃 시 사용 isRequestedSessionIdValid() : 유효한 세션 ID가 있는 여부 반환
세션 값 설정
- session.setAttribute("SID","abcd")
- session : 내장 객체
세션 값 알아오기
- Object obj = session.getAttribute("SID");
- Object 타입 반환 (사용 시 형 변환)
세션 속성 제거
- session.removeAttribute("SID");
세션 종료
- session.invalidate()
- 또는 설정된 유효 기간이 만료되면 종료
세션 무효화
- invalidate() 메소드를 사용해서 바로 무효화시킬 수 있음
- web.xml 파일에서 session-timeout 설정해서 시간을 정할 수 있음
- setMaxInactiveInterval()를 사용해서 시간 지정 가능
- 기본 세션은 마지막 요청으로부터 30분 경과 후 자동 소멸됨
- 세션 유효 기간을 따로 설정하지 않으면 톰캣에서 설정한 기본 유효 시간 30분이 적용
세션 예제
sec03 SessionTest 서블릿 : /sess 세션 아이디, 최소 생성 시간, 접근 시간, 유효 시간, isNet() 확인 SessionTest2 서블릿 : /sess2 세션 유효 시간 5초로 설정 SessionTest3 서블릿 : /sess3 invalidate() 호출해서 사용자가 세션을 강제로 삭제 세션 이용해서 로그인/로그아웃 기능 sessionLogin.html LoginLogout 서블릿 : /logInOut
@WebServlet("/sess") public class SessionTest extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); out.println("세션 아이디 : " + session.getId() + "<br>"); out.println("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>"); out.println("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>"); out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>"); if(session.isNew()) { out.print("새 세션이 만들어졌습니다"); } } }
세션 유효 시간을 5초로 설정
out.println("기본 세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>"); session.setMaxInactiveInterval(5);// 세션 유효 시간을 5초로 설정 out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
invalidate() 호출해서 생성된 세션 객체를 강제로 삭제
if(session.isNew()) { out.print("새 세션이 만들어졌습니다"); } session.invalidate(); // 생성된 세션 객체를 강제로 삭제 } }
세션 이용해서 로그인 / 로그아웃 기능
@WebServlet("/logInOut") protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); String user_id = request.getParameter("user_id"); String user_pw = request.getParameter("user_pw"); // 처음 접속이면 if(session.isNew()) { // user_id 입력 값이 있으면 if(user_id != null) { // SID 이름, user_id 값으로 세션 변수 설정 session.setAttribute("SID", user_id); // 다시 실행시켜서 SID 확인 out.print("<a href='logInOut'>로그인 상태 확인</a>"); }else { // user_id 입력 값이 없으면 out.print("<a href='sessionLogin.html'>다시 로그인 하세요!</a>"); session.invalidate(); } } else { //아니고 세션이 있으면 user_id = (String) session.getAttribute("SID"); if(user_id != null && user_id.length() != 0) { out.print("안녕하세요 " + user_id + "님!!"); out.print("<br><a href='logout'>로그아웃</a>"); } else { out.print("<a href='sessionLogin.html'>다시 로그인 하세요!</a>"); session.invalidate(); } } } }
@WebServlet("/logout") public class SessionLogout extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); session.invalidate(); // 세션 무효화 out.print("로그아웃 되었습니다. <br>"); out.print("<a href='sessionLogin.html'>로그인</a>"); } }
'백엔드 프로그래밍' 카테고리의 다른 글
백엔드 (5) - JSP, EL, JSTL, Core 태그 (1) 2022.01.01 백엔드 (4) - JSP(Java Server Page) (1) 2021.12.30 백엔드 (2) - 서블릿 로직 처리, 커넥션 풀 (0) 2021.12.29 백엔드(1) - Servlet (1) 2021.12.28 - rediret : HttpServletResponse 객체의 sendRedirect() 메소드 사용