JAVA
로그인아웃, session
docc
2021. 7. 26. 12:46
로그인
앞으로 jsp 의 <%@ %>: 디렉티브태그에 session="false" 를 넣자.
이 의미는 내가 만들기 전까지 session이 자동으로 만들어지는걸 방지하는 것이다.
>> 로그인준비.java
public class 로그인준비 implements IControl{
public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
mv.addObject("key", "value");
mv.setViewName("로그인창");
return mv;
}
}
>> 로그인창.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>로그인</h1>
<p>${msg}</p>
<form action="login.do" method="post" onsubmit="return 필수입력()">
id <input type="text" id="id" name="id"/>
password <input type="password" id="password" name="password"/>
<input type="submit" value="로그인"/>
</form>
</body>
</html>
<script>
function 필수입력(){
var id = document.querySelector("#id").value;
var password = document.querySelector("#password").value;
if(id==null || id==""){
alert("아이디를 입력하세요");
return false;
}
if(password==null || password==""){
alert("비밀번호를 입력하세요");
return false;
}
return true;
}
</script>
>> 로그인.java (MemberDAO 의 isin() 메서드 수정함// 밑에서 확인)
public class 로그인 implements IControl{
public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
//요청
String id = request.getParameter("id");
String password = request.getParameter("password");
MemberDAO dao = new MemberDAO();
Object[] NoAndName = dao.isin(id, password);
ModelAndView mv = new ModelAndView();
if(NoAndName==null) {
//여기서 조건을 따져 forward 로 보내며 msg 까지 설정하면 로그인준비 control 에서 다시 조건을 따져 request 로 값을 받고 view 넘기지 않아도
//이 값들이 request에 누적되어 view까지 넘어간다.
mv.addObject("msg", "id 또는 비밀번호가 일치하지 않습니다.");
mv.setViewName("forward:/prepare_login.do");
return mv;
}
// 로그인할 때만 session 을 만들고 로그인했으니 회원번호를 session에 저장하여 앞으로 나올 페이지들을 회원껄로 바꿔야한다.
HttpSession session = request.getSession();
session.setAttribute("no", NoAndName[0]); // 회원 번호 저장.
session.setAttribute("name", NoAndName[1]); // 회원 번호 저장.
session.setMaxInactiveInterval(60*30); // s(초) 단위. session이 존재하는 시간. 즉, 로그인 유지시간이다. web.xml 에서도 지정가능하며 거기는 분단위다.
mv.setViewName("로그인성공");//아직없는창
return mv;
}
}
>> MemberDAO.java ( name 만 나왔는데 이제 no, name 두개를 Object[] 에 담아서 나온다.)
public Object[] isin(String id, String password) {
Object[] NoAndName = null;
try {
Connection c = ConnectionUtil.getConnection();
PreparedStatement pre = c.prepareStatement("select no,name from member where id = ? and password = ?");
pre.setString(1, id);
pre.setString(2, password);
ResultSet set = pre.executeQuery();
if(set.next()) {
int no = set.getInt("no");
String name = set.getNString("name");
NoAndName = new Object[2];
NoAndName[0] = no;
NoAndName[1] = name;
}
set.close();
pre.close();
c.close();
} catch (Exception e) {
e.printStackTrace();
}
return NoAndName;
}
>> 로그인성공.jsp
<body>
${name} 님 환영합니다.
<a href="contents.do">내용</a>
</body>
>> 내용보이기.java
public class 내용보이기 implements IControl {
@Override
public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
mv.setViewName("내용창");
return mv;
}
>> 내용창.jsp
<body>
<jsp:include page="로그인상단.jsp"/>
<p>
Acknowledgements
To the Student
To the Teacher
</body>
>> 로그인상단.jsp
상단에서 먼저 session 이 null 이 아니지만 다른 값이고 로그인시 name 이 저장되어야 하는데 null인 경우 session을 null로 바꾼다.
그리고 하단에서 로그인여부(session존재여부) 를 따져 나올 내용을 정한다.
<%
HttpSession session= request.getSession(false);
if(session!=null&& session.getAttribute("name")==null){session=null;}
%>
<!DOCTYPE html>
<html>
<head>
<style>
</style>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% if(session!=null){ %>
<%=(String)session.getAttribute("name") %><img src="img/logined.png"/><button onclick="location.href='logout.do'">로그아웃</button>
<%}else{ %>
<button onclick="location.href='prepare_login.do'">로그인</button>
<%} %>
</body>
로그아웃
>> 로그아웃.java
@Override
public ModelAndView process(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession(false);
if(session != null) {
session.invalidate();
}
ModelAndView mv = new ModelAndView();
mv.setViewName("forward:/contents.do");
return mv;
}
Session
: 로그인, 로그아웃 시 필요
HttpSession session= request.getSession(false);
if(session!=null&& session.getAttribute("name")==null){session=null;}
session을 통해 로그인 여부 확인하기 (로그인시 session을 생성하고 또는 이미존재하는걸 가져오고, 회원의 이름을 저장해놓은 상태다) |
||
1. getSession(false) : session 이 없다면 null 로 설정하고 한다. session에 값이 있는지 확인하기위해 가져오기는 해야하니 getSession(false) 로 가져와 없으면 메서드의 매개변수(false)를 사용해 null 로 만든다. (if문을 수행하지 않아도 null이다.) |
||
2. 만약 존재한다면 그 session 에 회원이 로그인 했을 시 있을 회원이름이 존재하는지 확인한다. 만약 없고 null 이라면 session 을 null 로 바꿔 앞으로 로그인 여부확인 시 로그아웃상태임을 알린다. |
session.invalidate()
// session 값들 초기화
로그아웃 시 session 을 없애기 | ||
invalidate() 라는 메서드로 session 을 없앤다. |