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
반응형
'IT > 웹프로그래밍' 카테고리의 다른 글
ajax 사용하여 비동기 데이터 받아오기 (0) | 2019.08.08 |
---|---|
Open API로 json 데이터 받아서 파싱하기 (json-simple 라이브러리) (0) | 2019.08.02 |
HttpClient 라이브러리 사용하기 (0) | 2019.07.31 |
xml 기초 2. xml파일 파싱하기 (0) | 2019.07.30 |
xml 기초 1. DataBase 내용을 xml로 만들기 (0) | 2019.07.30 |