키워드 : 로그인 세션, tab 로그인, DB에서 데이터를 가져와 비밀번호 비교, 로그아웃
login.jsp
로그인 화면
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//out.print 적용했을 때 null 출력이 될 경우(session) => 연산기호
HttpSession hs = request.getSession();
String mid = (String)hs.getAttribute("mid");
String mnm = (String)hs.getAttribute("mnm");
if(mid !=null||mnm != null){ //로그인이 되어있을 경우 다시 로그인 하는 것을 방지
out.print("<script>"
+"alert('이미 로그인하셨습니다.');"
+"location.href='./main.jsp';"
+"</script>");
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 로그인</title>
</head>
<body>
<form id="frm" method="post" action="./shop_loginok.do" onsubmit="return loginck()">
<p>회원 로그인</p>
<div>
<label> <!-- 라벨에 onclick 쓰면 더블이벤트 발생 절대 노노 -->
<input type="radio" name="spart" value="P" onclick="partcheck(this.value)" checked>일반회원
</label>
<label>
<input type="radio" name="spart" value="C" onclick="partcheck(this.value)">사업자회원
</label>
<br>
<input type="text" name="sid" placeholder="아이디를 입력하세요"><br>
<input type="password" name="spw" placeholder="패스워드를 입력하세요"><br>
<span id="snoview" style="display:none;">
<input type="text" name="sno" placeholder="사업자등록번호를 입력하세요"><br>
</span>
<input type="submit" value="로그인">
</div>
</form>
</body>
<script src="./login.js?v=1"></script>
</html>
- 사업자 등록 번호 입력란 label로 감싸 display 속성으로 보이게 안보이게 하기
login.js
function partcheck(part){
var snoview = document.getElementById("snoview");
if(part=="P"){
snoview.style.display = "none";
}else{
snoview.style.display = "block";
}
}
function loginck(){
if(frm.sid.value==""){
alert("아이디를 입력하세요");
return false;
}else if(frm.spw.value==""){
alert("패스워드를 입력하세요");
return false;
}else{
if(frm.spart[0].checked == true){ //일반회원 체크
//보내는 3가지 방법
//frm.submit();
//return true;
return;
}else if(frm.spart[1].checked == true){ //사업자회원 체크
if(frm.sno.value == ""){
alert("사업자 번호를 입력하세요");
return false;
}else if(frm.sno.value.length < 10){
alert("올바른 사업자 번호를 입력하세요");
return false;
}else{
return true;
}
}
}
}
- 일반회원, 사업자회원 구분하여 사업자 등록 번호 인풋 보이게 안보이게
- 입력란 비워져있는지 체크 //사업자번호는 개인 10자리 법인 13자리!
shop_loginok.java (servlet)
세션 생성, 아이디 패스워드 사업자번호 DB와 비교
package shop;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class shop_loginok extends HttpServlet {
private static final long serialVersionUID = 1L;
PrintWriter pw = null;
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
HttpSession session =null;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String spart = request.getParameter("spart");
String sid = request.getParameter("sid");
String spw = request.getParameter("spw"); //사용자가 입력한 비밀번호
m_dbinfo db = new m_dbinfo();
this.pw = response.getWriter();
try {
this.con = db.getConnection();
//사용자가 입력한 값을 암호화로 처리해야만 Database와 비교가 가능
spw = new m_md5().md5_code(spw);
String sql=""; //Database Query문
//Resultset의 값을 받기위한 변수
String id=""; //아이디
String pw=""; //패스워드
String nm=""; //사업자번호
String no=""; //고객명 또는 회사명
if(spart.equals("P")) { //개인회원
sql = "select sid,spw,snm from shop_member where sid=?";
this.ps = this.con.prepareStatement(sql);
this.ps.setString(1,sid);
this.rs = this.ps.executeQuery(); //결과를 가져옴
while(this.rs.next()) {
id = this.rs.getString("sid");
pw = this.rs.getString("spw");
nm = this.rs.getString("snm");
}
if(id.equals("")||nm.equals("")) { //조회된 내용이 없을 경우
this.pw.write("<script>"
+ "alert('해당 아이디를 확인할 수 없습니다.');"
+ "history.go(-1);"
+ "</script>");
}else{ //조회된 내용이 있을 경우
if(spw.equals(pw)) { //사용자가 입력한 패스워드 = DB에 저장된 패스워드
this.session = request.getSession(); //세션 생성
this.session.setAttribute("mid", id); //아이디를 세션 등록
this.session.setAttribute("mnm", nm); //고객명을 세션 등록
this.pw.write("<script>"
+ "alert('로그인하셨습니다.');"
+ "location.href='./main.jsp';"
+ "</script>");
}
}
}else { //사업자회원
String sno = request.getParameter("sno");
sql = "select sid,spw,snm,sno from shop_member where sid=? and sno=?";
this.ps = this.con.prepareStatement(sql);
this.ps.setString(1,sid);
this.ps.setString(2,sno);
this.rs = this.ps.executeQuery();
//처리방식
}
}catch (Exception e) {
}finally {
try {
this.con.close();
this.pw.close();
}catch (Exception e) {
}
}
}
}
- DB 연결
- 패스워드는 암호화해서 DB와 비교
- 개인회원일때
- 아이디로 select 쿼리문 작성
- 값을 가져와서 변수에 저장
- 조회된 내용이 없을 경우 : 로그인 실패 알림 출력
- 조회된 내용이 있을 경우
- 패스워드가 같을때
- 세션 생성 -> 아이디, 고객명을 세션에 등록
- 로그인 알림 출력
- 패스워드가 같을때
- 사업자회원일때
- + 사업자번호
main.jsp
쇼핑몰 메인화면, 세션을 이용해 고객정보 출력
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//out.print 적용했을 때 null 출력이 될 경우(session) => 연산기호
HttpSession hs = request.getSession();
String mid = (String)hs.getAttribute("mid");
String mnm = (String)hs.getAttribute("mnm");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쇼핑몰 메인 화면</title>
</head>
<body>
<% if(mid==null||mnm==null){ //session에 값이 없을 경우 %>
<input type="button" value="로그인">
<% }else { //Controller에서 정상적으로 로그인을 하여 session이 적용되었을 경우 %>
[<%=mid %>] <%=mnm %>님 환영합니다. <input type="button" value="로그아웃" onclick="logout()">
<% } %>
</body>
<script>
function logout(){
location.href='./logout.jsp';
}
</script>
</html>
- 세션에 값이 없을 때
- 로그인 버튼
- 로그인해서 session이 적용되었을때
- 고객 정보 출력
- 로그아웃 버튼
logout.jsp
로그아웃, 세션 종료
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
HttpSession hs = request.getSession();
hs.invalidate(); //모든 session 값을 삭제
out.print("<script>"
+"alert('로그아웃 되셨습니다.');"
+"location.href='./login.jsp';"
+"</script>");
%>