겉바속촉

[spring] 로그인 만들어주기 본문

IT일기(하반기)/SPRING

[spring] 로그인 만들어주기

겉바속촉 2020. 7. 7. 09:53
728x90
반응형

지난번 포스팅에 이어서 해보도록 하쥬

2020/07/06 - [취업일기/SPRING] - [spring] 사이트 만들기

[spring] 사이트 만들기

게시판을 하나 또 만들어볼게요:) 다음과 같이 표시해준 대로 필요한 것들 생성해볼까유 info.data 패키지 작성 후 InfoDao InfoDaoInter(인터페이스) InfoDto 3가지 생성해주기 webapp에서 index.jsp 만들어 주.

2-juhyun-2.tistory.com

 

2020/07/07 - [취업일기/SPRING] - [spring] db에 저장해주고 수정, 삭제까지

 

 

 

다음과 같이 필요한 패키지와 파일들 만들어주세요:)

 

 

 

 

 

MemberSql.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="member">

</mapper>

 

SqlMapConfig.xml 에 추가해서 다음 전체 코드

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTDConfig 3.0//EN" "HTTP://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <typeAliases>
    <typeAlias type="info.data.InfoDto" alias="idto"/>
    <typeAlias type="member.data.MemberDto" alias="mdto"/>
  </typeAliases>
  
  <mappers>
    <mapper resource="mybatis/setting/InfoSql.xml"/>
    <mapper resource="mybatis/setting/MemberSql.xml"/>
  </mappers>
</configuration>

 

menu.jsp에 다음 추가

<a href="${path }/member/insertform">회원가입</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="${path }/member/list">회원목록</a>&nbsp;&nbsp;&nbsp;&nbsp;

menu.jsp 전체 코드

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>

<!DOCTYPE html>
<html>
<head>
<c:set var="path" value="<%=request.getContextPath() %>"></c:set>
<meta charset="utf-8">
 <script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Insert title here</title>
</head>
<body>
<a href="${path }/home">Home </a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="${path }/info/insertform">입력폼</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="${path }/info/list">목록</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="${path }/member/insertform">회원가입</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="${path }/member/list">회원목록</a>&nbsp;&nbsp;&nbsp;&nbsp;

</body>
</html>

 

member2 테이블 생성

 

 

 

 

 

테이블에 값 하나 주입

 

 


 

MemberDto.java

package member.data;

import java.sql.Timestamp;

public class MemberDto {
	
	private String num;
	private String name;
	private String id;
	private String pass;
	private Timestamp gaipday;
	
	
	public String getNum() {
		return num;
	}
	public void setNum(String num) {
		this.num = num;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPass() {
		return pass;
	}
	public void setPass(String pass) {
		this.pass = pass;
	}
	public Timestamp getGaipday() {
		return gaipday;
	}
	public void setGaipday(Timestamp gaipday) {
		this.gaipday = gaipday;
	}
	

}

 

MemberDaoInter

package member.data;

import java.util.List;

public interface MemberDaoInter {
	
	public List<MemberDto> getAllDatas();
	public void insertMember(MemberDto dto);

}

 

MemberSql

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="member">
	<select id="selectAllDataOfMember" resultType="mdto">
		select * from member2 order by num asc
	</select>
	<insert id="insertOfMember" parameterType="mdto">
		insert into member2 values(seq_mem.nextval, #{name},#{id},#{pass},sysdate)
	</insert>

</mapper>

 

MemberDao

1. extends적어주고 _ SqlSessionDaoSupport

2. implements 적어주고 _ MmeberDaoInter

3. @Repository

package member.data;

import java.util.List;

import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.stereotype.Repository;

@Repository
public class MemberDao extends SqlSessionDaoSupport implements MemberDaoInter {

	@Override
	public List<MemberDto> getAllDatas() {
		// TODO Auto-generated method stub
		return getSqlSession().selectList("selectAllDataOfMember");
	}

	@Override
	public void insertMember(MemberDto dto) {
		// TODO Auto-generated method stub
		getSqlSession().insert("insertOfMember", dto);
	}

}

 

MemberController

1. @Controller

2. @Autowired

3. get인지 post인지 파악 후 @GetMapping, @PostMapping

 

package spring.mvc.board;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;

import member.data.MemberDaoInter;
import member.data.MemberDto;

@Controller
public class MemberController {
	
	@Autowired
	MemberDaoInter dao;
	
	@GetMapping("/member/list")
	public ModelAndView list()
	{
		ModelAndView model=new ModelAndView();
		List<MemberDto>list=dao.getAllDatas();
		
		model.addObject("list", list);
		model.addObject("cnt", list.size());
		model.setViewName("/member/memberList"); //타일즈형식
		return model;
	}

}

 

 

memberList

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<c:set var="path" value="<%=request.getContextPath() %>"></c:set>
<meta charset="utf-8">
 <script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Insert title here</title>
</head>
<body>
<button type="button" class="btn btn-info"
style="width: 100px; margin-left: 500px;"
onclick="location.href=${path}/member/insertform">회원가입</button>

<br><br>
명단나올곳
</body>
</html>

 

실행시켜서 회원목록 클릭하면

테스트용으로 적어둔 명단나올 곳이 뜹니다

 

 

 

 

테스트용이 잘 뜨신다면

이제 list를 완성해보도록 하쥬:)

 

memberList

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<c:set var="path" value="<%=request.getContextPath() %>"></c:set>
<meta charset="utf-8">
 <script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Insert title here</title>
</head>
<body>
<button type="button" class="btn btn-info"
style="width: 100px; margin-left: 500px;"
onclick="location.href=${path}/member/insertform">회원가입</button>

<br><br>
<div class="container">
<table class="table table-bordered">
	<tr>
		<th>번호</th>
		<th>이름</th>
		<th>아이디</th>
		<th>비밀번호</th>
		<th>가입날짜</th>
		<th>편집</th>
	</tr>
	<c:forEach var="a" items="${list }" varStatus="i">
		<tr>
			<td>${i.count}</td>
			<td>${a.name}</td>
			<td>${a.id}</td>
			<td>${a.pass}</td>
			<td><fmt:formatDate value="${a.gaipday }"
				pattern="yyyy-MM-dd HH:mm"/></td>
			<td><a href="updateform?num=${a.num }">수정</a>/
				<a href="delete?num=${a.num }">삭제</a></td>	
		</tr>
	</c:forEach>
</table>
</div>
</body>
</html>

 

이제 새로고침 눌러볼까요?

 

 

 

MemberController에 다음 추가

//회원가입 누르면 폼 열리기
	@GetMapping("/member/insertform")
	public String memberform()
	{
		return "/member/memberForm";
	}
	

 

memberForm

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<c:set var="path" value="<%=request.getContextPath() %>"></c:set>
<meta charset="utf-8">
 <script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Insert title here</title>
</head>
<body>
<form action="${path }/member/insert" method="post">
	<table class="table table-hover" style="width: 400px;">
		<caption>[회원가입]</caption>
			<tr>
				<th>회원명</th>
				<td>
					<input type="text" size="10" name="name"
					autofocus="autofocus" required="required"
					class="form-cotrol">
				</td>	
			</tr>
			
			<tr>
				<th>아이디</th>
				<td>
					<input type="text" size="15" name="id"
					required="required"
					class="form-cotrol">
				</td>	
			</tr>
			
			<tr>
				<th>비밀번호</th>
				<td>
					<input type="password" size="15" name="pass"
					required="required"
					class="form-cotrol" >
				</td>	
			</tr>
			
			<tr>
				<td colspan="2" align="center">
					<input type="submit" value="회원가입"
					class="btn btn-info">
					<input type="button" value="회원목록"
					class="btn btn-info"
					onclick="location.href='${path }/member/list'">
				</td>	
			</tr>
			
	</table>
</form>
</body>
</html>

 

다시 실행시켜보면

 

 

 

회원목록을 누르면 list로 가는 지도 확인해주셔야됩니다!!

 

 

 


로그인 , 로그아웃

 

 

 

 

menu.jsp로 가서 로그인 부분 추가해주기

<a href="${path }/login/login">로그인</a>&nbsp;&nbsp;&nbsp;&nbsp;

 menu.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>

<!DOCTYPE html>
<html>
<head>
<c:set var="path" value="<%=request.getContextPath() %>"></c:set>
<meta charset="utf-8">
 <script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Insert title here</title>
</head>
<body>
<a href="${path }/home">Home </a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="${path }/info/insertform">입력폼</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="${path }/info/list">목록</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="${path }/member/insertform">회원가입</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="${path }/member/list">회원목록</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="${path }/login/login">로그인</a>&nbsp;&nbsp;&nbsp;&nbsp;
</body>
</html>

 

loginController

package spring.mvc.board;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class LoginController {
	
	@GetMapping("/login/login")
	public String loginform()
	{
		return "/login/loginForm";
	}

}

 

 

 

loginForm

 

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<c:set var="path" value="<%=request.getContextPath() %>"></c:set>
<meta charset="utf-8">
 <script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Insert title here</title>
</head>
<body>
<div class="container">
	<form action="loginproc" method="post">
		<table class="table table-hover" style="width: 400px;">
			<caption>세션로그인</caption>
			<tr>
				<th>아이디</th>
				<td>
					<input type="text" name="id" size="10"
					placeholder="아이디" required="required"
					class="form-control">&nbsp;&nbsp;
					<input type="checkbox" name="idsave">아이디저장
				</td>
			</tr>
			
			<tr>
				<th>비밀번호</th>
				<td>
					<input type="password" name="pass" size="10"
					placeholder="비밀번호" required="required">					
				</td>
			</tr>
			<tr>				
				<td colspan="2" align="center">
					<input type="submit" value="로그인">
					<input type="button" value="회원가입"
					onclick="location.href='${path}/member/insertform'">
				</td>
			</tr>
			
		</table>
	</form>
	
</div>
</body>
</html>

 

 

 

 

 

 

MemberSql

 

<!-- 아이디 비번 일치하면 로그인 -->
	<select id="loginSuccess" parameterType="HashMap" resultType="int">
		select count(*) from member2 where id=#{id} and pass=#{pass}	
	</select>

 

<!-- 이름 얻는 것 id받아서 name 얻는 것 -->
	<select id="nameByMember" parameterType="String" resultType="String">
		 select name from member2 where id=#{id}
	</select>

 

 

MemberDaoInter

 

	//아이디비번체크
	public boolean isLogin(String id, String pass);
	
	//네임얻기
	public String getName(String id);
	

 

 

 

MemberDao

 

@Override
	public boolean isLogin(String id, String pass) {
		// TODO Auto-generated method stub
		
		HashMap<String, String>map=new HashMap<String, String>();
		map.put("id", id);
		map.put("pass", pass);
		
		int n=getSqlSession().selectOne("loginSuccess", map);
		return n==1?true:false;
	}

	@Override
	public String getName(String id) {
		// TODO Auto-generated method stub
		String name=getSqlSession().selectOne("nameByMember",id);
		return name;
	}

 

LoginController

 

다음처럼 주입시켜주고

@Autowired
	MemberDao dao;

 

 

//로그인처리 부분에서 value값 넣어주기

-> 이유는 @RequestParam이 true이므로 아이디 저장상태가 아닐땐 로그인 에러가 발생하기 때문이쥬

 

//로그인처리
	@PostMapping("/login/loginproc")
	public String loginproc(HttpSession session,
			@RequestParam String id,
			@RequestParam String pass,
			@RequestParam(value="idsave",required = false) String idsave)
	//@RequestParam이 true이므로 아이디 저장상태가 아닐땐 로그인 에러 발생
	{		
    	//아이디 저장 체크 안해도 에러 안나게 처리해준 것 
		return "redirect:login";
	}

 

그리고 그 안에서 계속 추가 작성

	//로그인처리
	@PostMapping("/login/loginproc")
	public String loginproc(HttpSession session,
			@RequestParam String id,
			@RequestParam String pass,
			@RequestParam(value="idsave",required = false) String idsave)
	//@RequestParam이 true이므로 아이디 저장상태가 아닐땐 로그인 에러 발생
	{		
		//아이디 저장 체크 안해도 에러 안나게 처리해준 것 
		boolean sw=dao.isLogin(id, pass);
		
		//맞으면 세션에 3가지 저장
		if(sw)
		{
			session.setMaxInactiveInterval(60*60*8); 
			//8시간 동안 세션상태유지 생략하면 30분 유지
			
			session.setAttribute("loginok", "yes");
			session.setAttribute("idok", id);
			
			//아이디저장에 체크안하면 null값이므로
			if(idsave==null)		
				session.setAttribute("saveok", "no");
			else
				session.setAttribute("saveok", "yes");
			
		}
		
		//아이디와 비번이 맞으면 세션저장후 로그아웃폼으로 가야한다
		//맞지않으면 경고메세지 출력후 다시 로그인 
		if(sw)
			return "redirect:login";
		else
		return "/login/passFail";
	}
	

 

 

비밀번호가 맞는 경우:)

 

 

 

 

 

비밀번호가 맞지 않는 경우:)

 

 

 

 

그리고 윗 부분으로 올라가서 다음 부분은 주석처리

	@GetMapping("/login/login") public String loginform() 
    { 
    return "/login/loginForm"; 
    }
	

다음과 같이 작성

@GetMapping("/login/login")
	public ModelAndView loginform(HttpSession session)
	{
		ModelAndView model=new ModelAndView();
		String loginok=(String)session.getAttribute("loginok");
		String id=(String)session.getAttribute("idok");
		String save=(String)session.getAttribute("saveok");
		
		if(loginok==null)
		{
			model.addObject("id", id==null?"":id);
			//처음 세션 사용했을 때 널값이면 대비하기 위해서 
			model.addObject("save",save==null || save.equals("no")?"no":"yes");
			model.setViewName("/login/loginForm");
		}
		else //로그인 성공
		{
			String name=dao.getName(id);
			model.addObject("name", name);
			model.addObject("/login/logoutForm");
		}
		return model;
	}

그리고 로그아웃한 상태를 추가로 작성해주어야 합니다:)

		//로그아웃한 상태...로그아웃누르면 loginok는 지우고 idok는 남겨놓는다
	@GetMapping("/login/logout")	
	public String logout(HttpSession session)
		{
			session.removeAttribute("loginok");  //로그인을삭제
			return "redirect:login";

		}

 

 

 

logoutForm

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<c:set var="path" value="<%=request.getContextPath() %>"></c:set>
<meta charset="utf-8">
 <script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Insert title here</title>
</head>
<body>
<div style="position: absolute; left: 200px; top: 150px;">
${name}님이 로그인 중입니다 &nbsp;&nbsp;&nbsp;&nbsp;
<input type="button" value="로그아웃"
onclick="location.href='${path }/login/logout'">
</div>
<img alt="" src="${path }/image/b7.png">
</body>
</html>

 

이제 우리의 보완할점은

아이디 저장을 안눌렀는데도 로그아웃후 id가 남아있다는 점을 고쳐주어야 합니다:)

 

loginform

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<c:set var="path" value="<%=request.getContextPath() %>"></c:set>
<meta charset="utf-8">
 <script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Insert title here</title>
</head>
<body>
<div class="container">
	<form action="loginproc" method="post">
		<table class="table table-hover" style="width: 400px;">
			<caption>세션로그인</caption>
			<tr>
				<th>아이디</th>
				<td>
				<c:if test="${save=='yes' }">
					<input type="text" name="id" size="10"
					placeholder="아이디" required="required"
					class="form-control" value="${id }"></c:if>
					
					<c:if test="${save=='no' }">
					<input type="text" name="id" size="10"
					placeholder="아이디" required="required"
					class="form-control"></c:if>&nbsp;					
					<input type="checkbox" name="idsave" ${save=='yes'?"checked":"" }>아이디저장
				</td>
			</tr>
			
			<tr>
				<th>비밀번호</th>
				<td>
					<input type="password" name="pass" size="10"
					placeholder="비밀번호" required="required">					
				</td>
			</tr>
			<tr>				
				<td colspan="2" align="center">
					<input type="submit" value="로그인">
					<input type="button" value="회원가입"
					onclick="location.href='${path}/member/insertform'">
				</td>
			</tr>
			
		</table>
	</form>
	
</div>
</body>
</html>

 

 

 

 

 

 

 

 

 

 

이제 메뉴를 보완해봅시다:)

다음과 같이 만들어주시면 okay

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>

<!DOCTYPE html>
<html>
<head>
<c:set var="path" value="<%=request.getContextPath() %>"></c:set>
<meta charset="utf-8">
 <script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Insert title here</title>
</head>
<body>
<a href="${path }/home">Home </a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="${path }/info/insertform">입력폼</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="${path }/info/list">목록</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="${path }/member/insertform">회원가입</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="${path }/member/list">회원목록</a>&nbsp;&nbsp;&nbsp;&nbsp;
<a href="${path }/login/login">
	<c:if test="${sessionScope.loginok==null }">로그인</c:if>
	<c:if test="${sessionScope.loginok==null }">로그아웃</c:if>
</a>&nbsp;&nbsp;&nbsp;&nbsp;
<c:if test="${sessionScope.loginok!=null }">
  <b style="color: red;">${sessionScope.idok}</b>님이 로그인중
</c:if>
</body>
</html>

 

 

 

 

728x90
반응형