Session
쿠키와 마찬가지로 서버와의 관계를 유지하기 위한 수단 (http 통신 데이터 유지)
쿠키와 다르게 클라이언트의 특정 위치에 저장되는 것이 아니라 서버 상에 객체 형태로 존재
서버 당 하나의 세션 객체를 가질 수 있음 (브라우저 별 서로 다른 세션 사용)
세션 객체는 브라우저 창을 종료하면 삭제
session.setAttribute(이름, Object value);
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%--
- 세션은 쿠키와 마찬가지로 http 통신 데이터를 유지하기 위한 수단으로 사용
- 세션에 데이터를 저장할 때는 jsp 내장 객체 session이 지원하는
setAttribute() 메서드를 사용
- 해당 메서드의 첫번째 매개값으로 세션의 이름을 정하고, 두번째로 세션에 저장할 값을 지정
--%>
<%
session.setAttribute("nickname", "홍길동");
session.setAttribute("hobbies", new String[] {"축구", "독서", "게임"});
// session의 setAttribute에서 value는 Object로 지정되어 있으므로 모든 객체 대입 가능
%>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="session_check.jsp">세션 데이터 확인</a>
</body>
</html>
<%@page import="java.util.Arrays"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%
/*
- 세션에 저장한 데이터는 브라우저 창이 종료될 때 까지 혹은 세션의 유효시간이
만료되기 전까지 웹 어플리케이션의 모든 jsp파일에서 사용 가능
- 세션에 저장된 데이터를 가져오려면 session 객체의 메서드 getAttribute()를 사용하며
매개값으로 가져올 세션 데이터의 이름을 작성
*/
String nick = (String) session.getAttribute("nickname");
// getAttribute의 리턴 타입은 Object이기 때문에 강제 형 변환을 통해 타입을 내려서 준비한 변수에 대입
String[] hobbies = (String []) session.getAttribute("hobbies");
out.print(nick+ "<br>");
out.print(Arrays.toString(hobbies) + "<br>");
out.print("-----------------------------<br>" );
// 세션의 유효기간 설정.
// 세션의 수명을 따로 지정하지 않으면 기본 30분의 유효시간을 가짐
session.setMaxInactiveInterval(10*2); // 20초 짜리 세션
int sTime = session.getMaxInactiveInterval();
// 현재 세션의 유효시간을 확인
out.print("세션의 유효시간 : " + sTime + "초 <br>");
out.print("--------------------------------- <br> ");
// 특정 세션의 데이터를 삭제(지우고 싶은 세션 이름)
session.removeAttribute("nickname");
nick = (String) session.getAttribute("nickname");
out.print("삭제 후 nick의 값 : " + nick + "<br>");
out.print("--------------------------------- <br> ");
// 모든 세션 데이터를 삭제 (무효화 메소드)
session.invalidate();
hobbies = (String []) session.getAttribute("hobbies");
// 세션이 무효화되었으므로 (해당 페이지에서 더 이상 세션 객체를 사용할 수 없으므로) getAttribute()를 사용할 수 없음
// 아래의 코드는 에러가 발생
// 새롭게 요청이 들어오기 전까지는 세션 객체를 사용할 수 없음
out.print("삭제 후 hobbies의 값 : " + Arrays.toString(hobbies) + "<br>");
out.print("-----------------------------<br>" );
%>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
Session login
session_login
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%
String id = (String) session.getAttribute("user_id");
%>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% if (id != null ) {%>
<h2> <%= id %>님이 이미 로그인 중입니다~</h2>
<a href = "session_welcome.jsp">웰컴 페이지로~</a>
<%} else{
// session정보가 없다는 뜻이므로 로그인을 안했다는 것을 말함
%>
<form action="session_login_con.jsp" method="post">
<input type="text" name="id" size="10" placeholder="ID"> <br>
<input type="password" name="pw" size="10" placeholder="PW"> <br>
<input type="text" name="nick" size="10" placeholder="별명"> <br>
<input type="submit" value="로그인">
</form>
<%} %>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String nick = request.getParameter("nick");
if (id.equals("abc1234") && pw.equals("aaa1111")){
// 값이 같으면 세션 생성
session.setAttribute("user_id", id);
session.setAttribute("user_nick", nick);
session.setMaxInactiveInterval(10);
response.sendRedirect("session_welcome.jsp");
}
else {
%>
<%--
HTML 내부에 자바스크립트 코드를 사용하려면 <script> 태그를 사용
- JS내장 함수인 alert()은 브라우저에 경고창을 띄움
()안에 띄우고 싶은 문구를 작성
- JS내장 객체인 location.href="이동시킬URL" == sendRedirect(URL)
- JS내장 객체인 history가 제공하는 메서드인 back()은 뒤로가기 기능을 수행
--%>
<script>
alert("로그인에 실패했습니다.");
// history.back();
location.href="session_login.jsp";
// sendRedirect()와 같은 기능
</script>
<% session.invalidate(); } %>
session_welcome
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%
/*
1. 로그인하지 않은 사용자가 주소창에 이 페이지의 URL를 직접 적고
들어왔을 경우 로그인창으로 돌려보내는 코드를 작성하세요.
(조건문을 사용하여 로그인 성공 시 생성되는 세션이 있는지를 확인.)
2. 로그인한 회원 아이디와 별명을 통해 "nick(id)님 환영합니다!" 를
출력하세요.
3. a태그로 로그인창으로 돌아가는 링크와 request폴더에 앨범 선택 페이지로
갈 수 있는 링크 2개를 작성하세요.
4. session_login.jsp에서도 로그인 세션이 존재하는지를 확인하여 이미 로그인 중인 사용자와
그렇지 않은 사용자가 서로 다른 화면을 볼 수 있도록 작성해 주세요.
(로그인 성공 -> 이미 로그인 중이라는 화면, 로그인 x -> 폼)
*/
%>
<% if (session.getAttribute("user_id") == null) {
response.sendRedirect("session_login.jsp");
// session값이 null이면 로그인을 안한거니깐 돌아가라 라는 뜻
}
else {
String id = (String) session.getAttribute("user_id");
String nick = (String) session.getAttribute("user_nick");
// session이 있다는 것은 로그인 성공이니깐 값 가져옴
%>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2><%= nick %>(<%= id %>)님 환영합니다!</h2>
<a href="session_login.jsp">로그인창으로 돌아가기</a>
<a href = "/JSPBASIC/JspObjRequest/req_album_answer.jsp">앨범창</a>
<%} %>
</body>
</html>
Session sign up
순서
user 클래스 생성
package user;
public class User {
private String account;
private String password;
private String name;
private String nickName;
// private를 통해서 외부에서 직접 접근하지 못하게 하고 User클래스의 객체 연산으로만 접근가능하도록 사용
public User(){
}
public User(String account, String password, String name, String nickName) {
super();
this.account = account;
this.password = password;
this.name = name;
this.nickName = nickName;
}
// alt+shift+s를 통해서 매개변수를 받는 생성자 생성 가능
// 객체를 생성하면 자동으로 해당 변수들이 초기화되도록 함
// Getter와 Setter를 통해서 메소드를 통해 접근하여 값을 변경하도록 함(alt+shift+s)
// Setter에 입력값의 유효성 검증을 할 수 있음
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
}
UserRepository 생성
package user;
import java.util.ArrayList;
import java.util.List;
public class UserRepository {
// 회원의 정보를 담아놓을 리스트(회원 저장소)
private static List<User> userList = new ArrayList<>();
// user의 정보를 담을 수 있는 리스트 생성하면서 전역에서 사용할 수 있음
public static void save (User u) {
userList.add(u);
}
// 회원저장소(List)에 회원(User)을 추가하기 위한 메소드
// public User find (int number) {
// return userList.get(number);
// }
//
// public void delete (int number) {
// userList.remove(number);
// }
//회원 정보 저장 후 리스트 내부를 보여주는 메서드.
public static void showUsers() {
System.out.println("### 회원 정보 ###");
for(User user : userList) {
System.out.println("아이디: " + user.getAccount());
System.out.println("비밀번호: " + user.getPassword());
System.out.println("이름: " + user.getName());
System.out.println("별명: " + user.getNickName());
System.out.println("===============================");
}
}
// 매개값으로 id를 받아서 해당 id를 가진 객체가 userList에 있는지 탐색
public static User getUser(String id) {
User finduser = null;
for (int i = 0; i<userList.size(); i++) {
if (userList.get(i).getAccount().equals(id)) {
//userList에 같은 id가 있으면
finduser = userList.get(i);
}
}
return finduser;
}
}
register_form
값을 받아서 화면에 출력하기 위한 양식
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>register_form</title>
</head>
<body>
<h2>회원 가입 양식</h2>
<form action="register_controller.jsp" method="post">
<p>
<input type="text" name="account" placeholder="ID" required>
<br> <input type="password" name="password" placeholder="PW">
<br> <input type="text" name="name" placeholder="이름"> <br>
<input type="text" name="nickname" placeholder="별명"> <br>
<input type="submit" value="회원가입">
</p>
</form>
</body>
</html>
register_controller
값들을 받아서 받은 값을 다른 곳에 전달
<%@page import="user.User"%>
<%@page import="user.UserRepository"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
// 값 가져오기
String id = request.getParameter("account");
String pw = request.getParameter("password");
String name = request.getParameter("name");
String nick = request.getParameter("nickname");
User user = new User(id, pw, name, nick);
// getparamter를 통해서 받은 값을 User객체에 바로 전달(변수 초기화)
UserRepository.save(user);
// 유저리스트에 static 메소드인 save를 활용하여 User객체 넣기
// static 메소드는 객체 생성 X
UserRepository.showUsers();
response.sendRedirect("register_result.jsp");
%>
register_result
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>회원 가입 성공 </h2>
<a href = "login_form.jsp">로그인 페이지로</a>
<a href = "register_form.jsp">회원가입 페이지로</a>
</body>
</html>
login_form
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="login_controller.jsp" method="post">
<!-- login_controller.jsp로 전송 -->
<input type="text" name="account" placeholder="아이디"> <br>
<input type="password" name="password" placeholder="비밀번호"> <br>
<input type="submit" value="로그인">
<button type="button" onclick="location.href='register_form.jsp'">회원가입</button>
<%--
onclick 속성을 사용하면 해당 태그가 클릭 되었을 시에 동작할
자바스크립트 문법을 작성할 수 있습니다.
자바스크립트는 문자열을 "", '' 둘 다 인정합니다.
--%>
</form>
</body>
</html>
login_controller
<%@page import="user.UserRepository"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
/*
1. 입력된 회원 정보를 가져오세요.
2. 로그인을 시도하는 회원의 모든 정보를 얻어오세요. (getUser())
getUser() -> 아이디를 전달받아 해당 아이디와 일치하는 객체가 있는지
확인 후, 있다면 그 객체를 리턴.
일치하는 객체가 없다면 null을 리턴.
3. 조건문을 사용하여 getUser()의 리턴값이 null인지 아닌지를 확인하여
null값을 받았다면 회원가입이 되어있지 않은 사람이 로그인을 시도한 것이므로
로그인 페이지로 보내주세요. (script로 경고창 띄운 후 로그인 페이지로. (location.href=""))
4. getUser()의 리턴값이 null이 아닌 경우
회원 가입 당시에 작성했던 비밀번호가 로그인할 때 작성한 비밀번호와
일치하는지를 확인하여 같다면 세션에 로그인 데이터를 저장해 주세요.
("login", User객체)
5. 세션을 만든 후 "login_welcome.jsp"로 페이지를 이동시켜 주세요.
6. 비밀번호가 일치하지 않는다면 script태그로 "비밀번호가 일치하지 않습니다."
경고창 하나 띄워 주시고 다시 로그인 페이지로 이동시켜 주세요.
*/
%>
<%
String id = request.getParameter("account");
String pw = request.getParameter("password");
String name = request.getParameter("name");
String nickname = request.getParameter("nickname");
if (UserRepository.getUser(id) != null) {
if (UserRepository.getUser(id).getPassword().equals(pw)){
session.setAttribute("login",UserRepository.getUser(id));
response.sendRedirect("login_welcome.jsp");
}
else { %>
<script>
alert("비밀번호가 일치하지 않습니다.");
// history.back();
location.href="login_form.jsp";
// sendRedirect()와 같은 기능
</script>
<%}
}
else{%>
<script>
alert("로그인에 실패했습니다.");
// history.back();
location.href="login_form.jsp";
// sendRedirect()와 같은 기능
</script>
<%}
%>
login_welcome
<%@page import="user.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%
User u = (User) session.getAttribute("login");
%>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2> <%= u.getName() %>님 로그인을 환영합니다!</h2>
<h3> 당신의 닉네임은 <%= u.getNickName() %>입니다.</h3>
</body>
</html>