IT/웹프로그래밍

세션 이용하여 로그인 구현하기, 로그인이 필요한 데이터에 접근하기.

thesse 2019. 7. 31. 21:46
300x250
반응형

loginxml.jsp

<?xml version="1.0" encoding="UTF-8"?>
<%@ page contentType="text/xml; charset=utf-8"%>
<%@ page import="java.sql.*, javax.sql.*, java.io.*, java.net.*"%>

<%
	//로그인 체크
	String thispage = "02_loginxml.jsp";	//현재 페이지
	String login_url = "02_login.jsp?rtn_url="+thispage;	//로그인 페이지 +현재페이지(파라메터)
	String loginVal = (String) session.getAttribute("loginOK");	//세션에서 로그인여부 받아옴
	
	// 로그인 되어있지 않있면
	if(loginVal == null || !loginVal.equals("YES")){
		//로그인페이지로 보내기
		response.sendRedirect(login_url);
	}
%>

<%
	//로그인 성공하면 이하 보여줌
    
	Class.forName("com.mysql.jdbc.Driver");
	Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/db이름","id","pw");
	Statement stmt = conn.createStatement();
	
	ResultSet rset = stmt.executeQuery("select * from examtable;");
	
	out.print("<datas>");
	
	while(rset.next()){
		out.print("<data>");
		out.print("<name>"+rset.getString(1)+"</name>");
		out.print("<studentid>"+rset.getString(2)+"</studentid>");
		out.print("<kor>"+rset.getString(3)+"</kor>");
		out.print("<eng>"+rset.getString(4)+"</eng>");
		out.print("<mat>"+rset.getString(5)+"</mat>");
		out.print("</data>");
	}
	
	out.print("</datas>");
	
	rset.close();
	stmt.close();
	conn.close();
%>

loginxml.jsp 페이지로 접속하면 우선 세션값을 보고 로그인여부를 체크한다.

 

만약 로그인되어있지 않으면 login.jsp 페이지로 넘어가게 하는데,

이때 현재 자신의 주소(loginxml.jsp)를 rtn_url 매개변수로 넘겨준다.

그래야 login.jsp 페이지에서 로그인에 성공했을 때 다시 loginxml.jsp 페이지로 돌아올 수 있다.

 

로그인이 되어있다면 페이지 본문을 출력해준다.

이 파일은 db에서 데이터를 받아와 xml 형태로 출력해준다.

 

 

 

login.jsp

<!DOCTYPE html>
<meta charset="utf-8">
<%@ page contentType="text/html; charset=UTF-8"%>

<html>
	<head>
		<%
		
			String rtn_url = request.getParameter("rtn_url");	//loginxml.jsp에서 넘어오면서 받아옴
			String username = request.getParameter("username");		//아이디
			String userpasswd = request.getParameter("userpasswd");	//비밀번호
			String logincnt = request.getParameter("logincnt");		//지금까지 로그인 시도횟수
			
			if(rtn_url == null) rtn_url = "";
			if(username == null) username = "";
			if(userpasswd == null) userpasswd = "";
			if(logincnt == null) logincnt = "0";
			
			//앞서 로그인에서 받아온 id, pw값이 맞으면
			if(username.equals("admin") && userpasswd.equals("admin00")){	//login OK
				session.setAttribute("loginOK","YES");	//세션에 로그인됐다고 값 넘기고
				response.sendRedirect(rtn_url);	//loginxml.jsp로 다시 돌아감
			
			//로그인 실패했으면
			} else {
				logincnt = Integer.toString(Integer.parseInt(logincnt)+1); // 로그인 시도횟수 하나 더하기
			}
		%>
	</head>
	<body>
		<form method="post" action="login.jsp">
			이름 : <input type="text" name="username"><br>
			비밀번호 : <input type="password" name="userpasswd"><br>
			<input type="hidden" name="logincnt" value=<%=logincnt%>><br>
			<input type="hidden" name="rtn_url" value=<%=rtn_url%>><br>
			<input type="submit" value="전송"><br>
		</form>
		로그인 시도횟수 <%=logincnt%>회 입니다.<br>
		rtn_url <%=rtn_url%> 입니다.<br>
	</body>
</html>

 

로그인 폼의 action은 자기자신(login.jsp)으로 둔다.
로그인 실패하면 다시 로그인창이 뜨고,
로그인 성공하면 그제야 원하던 페이지(loginxml.jsp)로 넘어가게 한다.

 

로그인 체크시 비교할 id/pw값은 db에서 받아와서 비교하는게 맞지만, 일단은 하드코딩...

 

 

 

parsing.jsp

<!DOCTYPE html>
<meta charset="utf-8">

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>

<%@ page import= "org.apache.http.HttpEntity" %>
<%@ page import= "org.apache.http.HttpResponse" %>
<%@ page import= "org.apache.http.NameValuePair" %>
<%@ page import= "org.apache.http.ParseException" %>
<%@ page import= "org.apache.http.client.HttpClient" %>
<%@ page import= "org.apache.http.client.entity.UrlEncodedFormEntity" %>
<%@ page import= "org.apache.http.client.methods.HttpGet" %>
<%@ page import= "org.apache.http.client.methods.HttpPost" %>
<%@ page import= "org.apache.http.impl.client.DefaultHttpClient" %>
<%@ page import= "org.apache.http.message.BasicNameValuePair" %>
<%@ page import= "org.apache.http.params.HttpConnectionParams" %>
<%@ page import= "org.apache.http.util.EntityUtils" %>
<%@ page import= "org.apache.http.conn.ClientConnectionManager" %>
<%@ page import= "org.apache.http.params.HttpParams" %>
<%@ page import= "org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager" %>
<%@ page import="java.io.*" %>
<%@ page import="java.text.*,java.util.*,java.sql.*,javax.servlet.*,javax.sql.*,javax.naming.*" %>
<%@ page import = "javax.xml.parsers.*,org.w3c.dom.*" %>

<html>
	<head>
		<%!
			DefaultHttpClient client;
			
			// HttpClient 재사용 관련 서버 통신시 세션을 유지하기 위함
			// 마치 브라우저로 조회하여 세션이 유지되는 효과를 얻음
			public DefaultHttpClient getThreadSafeClient(){
				if(client != null) return client;
				
				client = new DefaultHttpClient();
				ClientConnectionManager mgr = client.getConnectionManager();
				HttpParams params = client.getParams();
				client = new DefaultHttpClient(new ThreadSafeClientConnManager(params, mgr.getSchemeRegistry()), params);
				
				return client;				
			}
			
			
			public String goLogin(){
				return goXML("http://서버주소/login.jsp", true);
			}
			
			
			public String goXML(String getURL){
				return goXML(getURL, false);
			}
			
			
			public String goXML(String getURL, Boolean loginFlag){
				String Result = null;
				
				// 세션 유지 체크
				HttpClient client = getThreadSafeClient();
				
				HttpConnectionParams.setConnectionTimeout(client.getParams(), 100000);
				HttpConnectionParams.setSoTimeout(client.getParams(), 100000);
				HttpPost post = new HttpPost(getURL);
				
				List <NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
				if (loginFlag){	// 여기가 post/get 파라메터를 전달하는 곳
					nameValuePairs.add(new BasicNameValuePair("username", "admin"));
					nameValuePairs.add(new BasicNameValuePair("userpasswd", "admin00"));
				}
				
				try{
					post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
					HttpResponse responsePost = null;
					
					responsePost = client.execute(post);
					HttpEntity resEntity = responsePost.getEntity();
					
					if(resEntity != null){
						Result = EntityUtils.toString(resEntity).trim();
					}
				} catch(Exception e){
					e.printStackTrace();
				} finally{
					
				}
				
				return Result;
			}
			
		%>
	</head>
	<body>
		<h1>성적 조회</h1>
		<%
		
			//로그인 후 xml을 조회한다. 내부소스에 이미 세션을 유지하도록 설계되어 있다.
			String ret = goLogin();
			ret = goXML("http://서버주소/loginxml.jsp");
			//out.println(ret);
			
			try{
				
				// DocumentBuilderFactory 객체 생성
				DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
				// DocumentBuilder 객체 생성
				DocumentBuilder builder = factory.newDocumentBuilder();
				
				ByteArrayInputStream is = new ByteArrayInputStream(ret.getBytes("utf-8"));
				// builder를 이용하여 XML 파싱하여 Document 객체 생성
				Document doc = builder.parse(is);
				
				// 생성된 document에서 각 요소들을 접근하여 데이터를 저장함
				Element root = doc.getDocumentElement();
				NodeList tag_name = doc.getElementsByTagName("name");	//xml name tag
				NodeList tag_studentid = doc.getElementsByTagName("studentid");	//xml studentid tag
				NodeList tag_kor = doc.getElementsByTagName("kor");	//xml kor tag
				NodeList tag_eng = doc.getElementsByTagName("eng");	//xml eng tag
				NodeList tag_mat = doc.getElementsByTagName("mat");	//xml mat tag
		%>
		
		<table cellspacing=1 width=500 border=1>
			<tr>
				<td width=100>이름</td>
				<td width=100>학번</td>
				<td width=100>국어</td>
				<td width=100>영어</td>
				<td width=100>수학</td>
			</tr>
		
		<%	
				
				for(int i=0; i<tag_name.getLength(); i++){
					out.print("<tr>");
					out.print("<td>"+tag_name.item(i).getFirstChild().getNodeValue()+"</td>");
					out.print("<td>"+tag_studentid.item(i).getFirstChild().getNodeValue()+"</td>");
					out.print("<td>"+tag_kor.item(i).getFirstChild().getNodeValue()+"</td>");
					out.print("<td>"+tag_eng.item(i).getFirstChild().getNodeValue()+"</td>");
					out.print("<td>"+tag_mat.item(i).getFirstChild().getNodeValue()+"</td>");
					out.print("</tr>");
				}
		%>
			</table>
		<%
				
			}catch(Exception e){
				out.print(e);
				e.printStackTrace();
			}
		%>
	</body>
</html>

parsing.jsp 페이지는 loginxml.jsp 페이지에 접근하여 xml 값을 얻어온다.

그리고 얻어온 xml값을 파싱하여 원하는 형태로(테이블) 가공하여 보여준다.

 

이 페이지에 접속하면 별도의 로그인 과정을 거치지 않아도 된다.

코드 내부에서 이미 로그인 가능한 id/pw값을 가지고 login.jsp에 접근하여 세션에서 로그인값을 얻었고,

이 세션을 유지하여 loginxml.jsp 파일에 접근하기 때문이다.

 

 

300x250
반응형