국비지원학원/HTML,JavaScript,jQ

92일차-JavaEE_암호화+이어서 비연결성 해결

초코맛 2019. 3. 26. 03:53
반응형
*암호화
  • Java.Security 패키지에서 제공
  • SHA(Secure Hash Algorizm)일방향 해쉬 알고리즘 : 처리된 데이터는 유일성을 가지며 절대로 원래 문자열로 돌아갈 수 없다.
    • MD2,MD5,SHA-1,SHA-128,SHA-512.plgp
    • ----------키가 점점 길어진다------------->(안전)
    • MD2,MD5=>MD2는 털렸고/MessageDigest
    • SHA=>Secure  Hash Algorithm
    • <<<레인보우 테이블(무식하게 때려넣어 규칙을 알아냄) 으로 털리기도....

    • MessageDigest)
    • MD2/MD5
    • SHA-1,224,256,384,512 

    • 사용법)
      • 1.알고리즘을 설정하여 객체를 얻는다.
        • MessageDigest md=MessageDigest.getInstance( Algorithm:MD2,MD5,SHA-1,SHA-224,,,,등 );
      • 2.평문(plain text)를 알고리즘에 해당하는 문자열로 변경
        • String text="아아아";
        • md.update(text.getBytes()); //이진수로 변경하는..
      • 3.변경된 문자열을 얻는다.
        • new String(md.digest() );
        • //나도 모르는 문자열이 나와 base64로 인코딩

  • 암호화(PKI) : 암호화된 문자열은 키를 가지고 복호화 할 수 있는 것.
    • DES,ACE
    • <<수학자가 만드는 것>>>
package kr.co.sist.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.tomcat.util.codec.binary.Base64;
public class ShaUtil {
     
     private static Base64 base64=new Base64();
     public static String shaEncoding(String plaintext) {
           String cipertext="";
           if(plaintext!=null||"".equals(plaintext)) {
                
                try {
                     //1.알고리즘을 사용할 수 있는 객체 얻기
                     MessageDigest  md=MessageDigest.getInstance("SHA-1");
                     //2.평문(plainText)를 암호문(cipherText)로  변환
                     md.update(plaintext.getBytes());
                     //일반형 해쉬는 키가 존재하지 않지만  암호화에만? 있다..?
                     //3.변환된 암호문(ciphertext)얻기
                     cipertext=new  String(base64.encode(md.digest()));
                     
                } catch (NoSuchAlgorithmException e) {//사용할  수 없는 알고리즘을 넣었을 때
                     e.printStackTrace();
                }//end catch
           }//end if
           return cipertext;
     }//shaEncoding
     
//   public static void main(String[] args) {
//         System.out.println(shaEncoding("1234567890"));
//   }//main
}//class
alter table web_member modify age varchar2(3);
package kr.co.sist.user.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import kr.co.sist.user.vo.WebMemberVO;
public class WebMemberDAO {
     
     private static WebMemberDAO wm_dao;
     
     public WebMemberDAO() {
           
     }//WebMemberDAO
     
     public static WebMemberDAO getInstance() {
           if(wm_dao==null) {
                wm_dao=new WebMemberDAO();
           }//end if
           return wm_dao;
     }//getInstance
     
     public Connection getConn() throws SQLException{
           Connection con=null;
           try {
                //1.JNDI 사용객체 생성
                Context ctx=new InitialContext();
                //2.DBCP에서 DataSource 얻기
                DataSource  ds=(DataSource)ctx.lookup("java:comp/env/jdbc/dbcp");
                //3.DataSource에서 Connection 얻기
                con=ds.getConnection();
           } catch (NamingException e) {
                e.printStackTrace();
           }//end catch
           
           return con;
     }//getConn
     
     /**
      * ID가 존재 하는지 중복 검사
      * @param id
      * @return
      * @throws SQLException
      */
     public boolean selectId(String id) throws SQLException{
           boolean flag=false;
           
           Connection con=null;
           PreparedStatement pstmt=null;
           ResultSet rs=null;
           
           try {
           //1.
           //2.
           //3.
                con=getConn();
           //4.
                String selectId="select id from web_member where  id=?";
                pstmt=con.prepareStatement(selectId);
                pstmt.setString(1, id);
           //5.
                rs=pstmt.executeQuery();
                flag=!rs.next();//있으면 true->반대로 false
                
           }finally {
           //6.
                if(rs!=null) {rs.close();}//end if
                if(pstmt!=null) {pstmt.close();}//end if
                if(con!=null) {con.close();}//end if
           }//end finally
           
           return flag;
     }//selectId
     
     /**
      * 입력된 회원 정보를 가지고 DB에 추가하는 일
      * @param wn_vo
      * @throws SQLException
      */
     public void insertMember(WebMemberVO wm_vo)throws  SQLException{
           Connection con=null;
           PreparedStatement pstmt=null;
           
           try {
           //1.
           //2.
           //3.
                con=getConn();
           //4.
                StringBuilder insertMember=new StringBuilder();
                insertMember
                .append(" insert into web_member(")
                .append("  id,pass,name,ssn,gender,birth,age,marriage,marriage_date,zipcode,addr1,addr2,greeting,ip_address ")
                .append(" ) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)  ");
                
                pstmt=con.prepareStatement(insertMember.toString());
                
                pstmt.setString(1, wm_vo.getId());
                pstmt.setString(2, wm_vo.getPass());
                pstmt.setString(3, wm_vo.getName());
                pstmt.setString(4, wm_vo.getSsn());
                pstmt.setString(5, wm_vo.getGender());
                pstmt.setString(6, wm_vo.getBirth());
                pstmt.setString(7, wm_vo.getAge());
                pstmt.setString(8, wm_vo.getMarriage());
                pstmt.setString(9, wm_vo.getMarriage_date());
                pstmt.setString(10, wm_vo.getZipcode());
                pstmt.setString(11, wm_vo.getAddr1());
                pstmt.setString(12, wm_vo.getAddr2());
                pstmt.setString(13, wm_vo.getGreeting());
                pstmt.setString(14, wm_vo.getIp_address());
                pstmt.executeUpdate();
                
                String[] lang=wm_vo.getLang();
                if(lang !=null) {
                     pstmt.close();
                     String insertLang="insert into  web_lang(id,lang) values(?,?)";
                     //4.
                     pstmt=con.prepareStatement(insertLang);
                     for(int i=0; i<lang.length; i++) {
                           pstmt.setString(1, wm_vo.getId());
                           pstmt.setString(2, lang[i]);
                     //5.
                           pstmt.executeQuery();
                     }//end for
                }//end if
           }finally {
           //6.
                if(pstmt!=null) {pstmt.close();}//end if
                if(con!=null) {con.close();}//end if
           }//end finally
           
     }//insertMember
}//class
package kr.co.sist.user.vo;
import java.util.Arrays;
public class WebMemberVO {
     private String id, pass, name, ssn, gender, birth, age,  marriage, marriage_date, zipcode, addr1, addr2, greeting,
                ip_address;
     private String[] lang;
     public WebMemberVO(String id, String pass, String name,  String ssn, String gender, String birth, String age,
                String marriage, String marriage_date, String  zipcode, String addr1, String addr2, String greeting,
                String ip_address, String[] lang) {
           this.id = id;
           this.pass = pass;
           this.name = name;
           this.ssn = ssn;
           this.gender = gender;
           this.birth = birth;
           this.age = age;
           this.marriage = marriage;
           this.marriage_date = marriage_date;
           this.zipcode = zipcode;
           this.addr1 = addr1;
           this.addr2 = addr2;
           this.greeting = greeting;
           this.ip_address = ip_address;
           this.lang = lang;
     }// WebMemberVO
     public String getId() {
           return id;
     }
     public String getPass() {
           return pass;
     }
     public String getName() {
           return name;
     }
     public String getSsn() {
           return ssn;
     }
     public String getGender() {
           return gender;
     }
     public String getBirth() {
           return birth;
     }
     public String getAge() {
           return age;
     }
     public String getMarriage() {
           return marriage;
     }
     public String getMarriage_date() {
           return marriage_date;
     }
     public String getZipcode() {
           return zipcode;
     }
     public String getAddr1() {
           return addr1;
     }
     public String getAddr2() {
           return addr2;
     }
     public String getGreeting() {
           return greeting;
     }
     public String getIp_address() {
           return ip_address;
     }
     public String[] getLang() {
           return lang;
     }
     @Override
     public String toString() {
           return "WebMemberVO [id=" + id + ", pass=" + pass +  ", name=" + name + ", ssn=" + ssn + ", gender=" + gender
                     + ", birth=" + birth + ", age=" + age + ",  marriage=" + marriage + ", marriage_date=" + marriage_date
                     + ", zipcode=" + zipcode + ", addr1=" +  addr1 + ", addr2=" + addr2 + ", greeting=" + greeting
                     + ", ip_address=" + ip_address + ", lang="  + Arrays.toString(lang) + "]";
     }// toString
}// class
package kr.co.sist.user;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.co.sist.user.dao.WebMemberDAO;
import kr.co.sist.user.vo.WebMemberVO;
import kr.co.sist.util.ShaUtil;
@SuppressWarnings("serial")
public class WebMemberJoin extends HttpServlet {
     protected void doPost(HttpServletRequest request,  HttpServletResponse response) throws ServletException,  IOException {
           response.setContentType("text/html;charset=UTF-8");
           PrintWriter out=response.getWriter();
           
           //post방식일 때 한글 처리
           request.setCharacterEncoding("UTF-8");//사용자가  쓰고있는 형과같은!
           
           //사용자가 입력한 값 받기(HTML Form Control)  받기(getParameter)로
           String id=request.getParameter("id");
           String pass1=request.getParameter("pass1");
           String name=request.getParameter("name");
           String ssn1=request.getParameter("ssn1");
           String ssn2=request.getParameter("ssn2");
           String gender=request.getParameter("gender");
           String b_year=request.getParameter("b_year");
           String b_month=request.getParameter("b_month");
           String b_day=request.getParameter("b_day");
           String age=request.getParameter("age");
           String[]  interestlang=request.getParameterValues("interestlang");
           String  marrigeFlag=request.getParameter("marrigeFlag");
           String m_year=request.getParameter("m_year");
           String m_month=request.getParameter("m_month");
           String m_day=request.getParameter("m_day");
           String zipcode=request.getParameter("zipcode");
           String addr1=request.getParameter("addr1");
           String addr2=request.getParameter("addr2");
           String greetings=request.getParameter("greetings");
           
           //파라메터 값을 vo에 저장
           WebMemberVO wm_vo=new WebMemberVO(id,  ShaUtil.shaEncoding(pass1), name,  ShaUtil.shaEncoding(ssn1+"-"+ssn2),
                           gender, b_year+"-"+b_month+"-"+b_day,  age, marrigeFlag, m_year+"-"+m_month+"-"+m_day,
                           zipcode, addr1, addr2, greetings,  request.getRemoteAddr(), interestlang);
           
           
           out.write("<!DOCTYPE html>\r\n");
           out.write("<html>\r\n");
           out.write("<head>\r\n");
           out.write("<meta charset=\"UTF-8\">\r\n");
           out.write("<title>회원가입</title>\r\n");
           out.write("<link rel=\"stylesheet\"  type=\"text/css\"  href=\"http://localhost:8080/servlet_prj/common/css/main_v190130.css\"/>\r\n");
           out.write("<style type=\"text/css\">\r\n");
           out.write("\t#joinTitle{ font-weight: bold;  font-size: 20px;  }\r\n");
           out.write("\t.tdAlign{ text-align: center  }\r\n");
           out.write("\ttable{ margin: 0px auto }\r\n");
           out.write("\ttr{ height: 25px}\r\n");
           out.write("\t\r\n");
           out.write("\t#wrap{ width: 1007px; margin:0px auto  }\r\n");
           out.write("\t#joinHeader{ width: 1007px; height:  195px; \r\n");
           out.write("\t\t\t\t\tbackground: #FFFFFF  url(http://localhost:8080/servlet_prj/web_member/images/header.png) no-repeat; }\t\r\n");
           out.write("\t\t\t\t\t\r\n");
           out.write("\t.span{ color: #FF0000 }\r\n");
           out.write("\t#joinContent{ position:  relative;\r\n");
           out.write("\t\t\twidth:773px ; height:369px ;  background:#FFFFFF  url(http://localhost:8080/servlet_prj/web_member/images/welcome_background.png) no-repeat; }\r\n");
           out.write("\t#resultTitle{ position:  absolute;top:130px; left:320px}\r\n");
           out.write("\t#resultInput{ position:  absolute;top:150px; left:330px;}\r\n");
           out.write("</style>\r\n");
           out.write("<script type=\"text/javascript\">\r\n");
           out.write("\t\r\n");
           out.write("</script>\r\n");
           out.write("</head>\r\n");
           out.write("<body>\r\n");
           out.write("<div id=\"wrap\">\r\n");
           out.write("<div id=\"joinHeader\"></div>\r\n");
           out.write("<div id=\"joinContent\">\r\n");
           
           try {
          //비연결성을 해결하기 위해 추가 전에 아이디를 사용중인지  다시 재조회를 하여 처리한다.
            addWebMember(wm_vo);
           
           out.write("\t<div id=\"resultTitle\">\r\n");
           out.write("\t\t<span>");
           out.print(name);
           out.print("</span>님께서 입력하신 정보는 아래와  같습니다.\r\n");
           out.write("\t</div>\r\n");
           out.write("\t<div id=\"resultInput\">\r\n");
           out.write("\t\t<ul>\r\n");
           out.write("\t\t\t<li>아이디 : <strong>");
           out.print(id);
           out.print("</strong></li>\r\n");
           out.write("\t\t\t<li>성별 : <strong>");
           out.print(gender);
           out.print("</strong></li>\r\n");
           out.write("\t\t\t<li>생년월일 : <strong>");
           out.print(b_year+" "+b_month+" "+b_day);
           out.print("</strong></li>\r\n");
           out.write("\t\t\t<li>결혼여부 : <strong>");
           out.print(marrigeFlag);
           out.print("</strong></li>\r\n");
           out.write("\t\t\t<li>관심언어 : \r\n");
           
           if(interestlang!=null) {
            for(int i=0; i<interestlang.length; i++) {
                  out.write("\t\t\t\t\t<strong>");
                  out.print(interestlang[i]);
                  out.print(" </strong>\r\n");
            }//end for
           }else {
            out.write("\t\t\t\t\t<strong>관심언어  없음.</strong>\r\n");
           }//end else
           
           out.write("\t\t\t</li>\r\n");
           out.write("\t\t\t<li><a  href=\"#void\">로그인</a></li>\r\n");
           out.write("\t\t</ul>\r\n");
           out.write("\t</div>\r\n");
           }catch (RuntimeException re) {
            out.println("아이디가 이미 사용 중 입니다.<br/>");
            out.println("<a href='#void'  onclick='history.back();'>다시 입력</a><br/>");
            
           }catch (SQLException se) {
            se.printStackTrace();
            out.println("회원가입이 정상적으로 이루어지지  않았습니다.<br/>");
            out.println("서비스가 원활하지 못한점  뎨둉합니다...<br/>");
            out.println("정상적인 서비스를 위해서 저희 임직원들은  최선을 다하고 있습니다.<br/>");
            out.println("신속하게 복구하겠습니다. 사용 중  불편한점은 010-디잘잘에게 연락해 주세요.<br/>");
           }//end catch
           out.write("\t\t\r\n");
           out.write("\t</div>\r\n");
           out.write("</div>\r\n");
           out.write("</body>\r\n");
           out.write("</html>\r\n");
           
     }//doPost
     
     private void addWebMember(WebMemberVO wm_vo) throws  SQLException,RuntimeException{
           
           WebMemberDAO wm_dao=WebMemberDAO.getInstance();
           
           //추가전에 동일 아이디가 존재하는지 다시 검색하여 처리(비연결성의 처리)
           if(wm_dao.selectId(wm_vo.getId())){
                throw new RuntimeException();//내려가지 않고  RuntimeException으로 날라간다.
           }//end if
           
           wm_dao.insertMember(wm_vo);
           
     }//addWebMember
}//class
package kr.co.sist.user;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.co.sist.user.dao.WebMemberDAO;
/**
* Web Browser에서 커서를 가질 수 있는 HTML Form Control이 하나인  경우
* 엔터를 치면 JavaScript의 유효성 검증과(동작을 하기는 하지만)  상관 없이 submit이 된다.
* ""의 처리를 BackEnd에서 반드시 해주어야 한다.!!!!!!!!
* @author owner
*/
@SuppressWarnings("serial")
public class IdDuplication extends HttpServlet {
     protected void doGet(HttpServletRequest request,  HttpServletResponse response) throws ServletException,  IOException {
           response.setContentType("text/html;charset=UTF-8");
           PrintWriter out=response.getWriter();
           
           out.write("<!DOCTYPE html>\r\n");
           out.write("<html>\r\n");
           out.write("<head>\r\n");
           out.write("<meta charset=\"UTF-8\">\r\n");
           out.write("<title>Insert title here</title>\r\n");
           out.write("<link rel=\"stylesheet\"  type=\"text/css\"  href=\"http://localhost:8080/servlet_prj/common/css/main_v190130.css\"/>\r\n");
           out.write("<style type=\"text/css\">\r\n");
           out.write("#idWrap{ width :502px ;  height:303px;\r\n");
           out.write("\t\t\t background: #FFFFFF  url(http://localhost:8080/servlet_prj/web_member/images/id_background.png) no-repeat;\r\n");
           out.write("\t\t\t margin: 0px auto; position:  relative; }\r\n");
           out.write("#idContainer{ position: absolute;top:  110px; left:80px;position: relative; }\r\n");
           out.write("#resultId{ position:  absolute;top:100px;left:40px }\r\n");
           out.write("#idPossible{ color :#4A8AF4; font-weight:  bold }\r\n");
           out.write("#idImpossible{ color :#DD5246  ;font-weight: bold} \r\n");
           out.write("#viewId{ color :#121446 ;font-size:15px;  font-weight: bold} \r\n");
           out.write("</style>\r\n");
           out.write("</head>\r\n");
           out.write("<script type=\"text/javascript\">\r\n");
           out.write("window.onload=function(){\r\n");
            out.write("\tdocument.getElementById(\"sendId\").addEventListener(\"click\",sendId);\r\n");
            out.write("\tdocument.getElementById(\"useId\").addEventListener(\"click\",sendOpener);\r\n");
            out.write("\tdocument.getElementById(\"id\").addEventListener(\"keydown\",keyCheck);\r\n");
           out.write("}//function\r\n");
           out.write("function keyCheck(){\r\n");
           out.write("\tif(window.event.keyCode==13){\r\n");
           out.write("\t\tsendOpener();\r\n");
           out.write("\t}//end if\t\r\n");
           out.write("}//keyCheck\r\n");
           out.write("function sendId(){\r\n");
           out.write("\r\n");
           out.write("\t//1. 자식창에서 전송할 값 받기\r\n");
           out.write("\tvar idObj=document.cFrm.id;\r\n");
           out.write("\tif(idObj.value == \"\"){\r\n");
           out.write("\t\talert(\"전송할  id입력\");\r\n");
           out.write("\t\tidObj.focus();\r\n");
           out.write("\t\treturn;\r\n");
           out.write("\t}//end if\r\n");
           out.write("\t\r\n");
           out.write("\tdocument.cFrm.submit();\r\n");
           out.write("}//sendId\r\n");
           out.write("function sendOpener(){\r\n");
           out.write("\t//2. 부모창으로 값 넘기기\r\n");
           out.write("\tvar idValue=  document.getElementById(\"hidId\").value;\r\n");
            out.write("\topener.window.document.joinFrm.id.value=  idValue;\r\n");
           out.write("\t\r\n");
           out.write("\t//3.자식창 닫기\r\n");
           out.write("\tself.close();\r\n");
           out.write("}//sendOpener\r\n");
           out.write("</script>\r\n");
           out.write("<body>\r\n");
           out.write("<div id=\"idWrap\">\r\n");
           out.write("<div id=\"idContainer\">\r\n");
           out.write("\t<form name=\"cFrm\">\r\n");
           out.write("\t\t<label>아이디</label>\r\n");
           out.write("\t\t<input type=\"text\" name=\"id\"  id=\"id\" class=\"inputBox\" autofocus=\"autofocus\"/>\r\n");
           out.write("\t\t<input type=\"button\"  value=\"중복검사\" class=\"btn\" id=\"sendId\"/>\r\n");
           out.write("\t</form>\r\n");
           out.write("\t\r\n");
           
           String id=request.getParameter("id");
           
           if(id!=null && !"".equals(id)) {//파라메터가 있는  경우 && 아이디가 ""가 아닌 경우
            boolean flag=idChk(id);
            out.write("\t<div id=\"resultId\"> 입력하신 [ <span  id=\"viewId\">");
            out.print(id);
            out.println("</span> ] 아이디는 \r\n");
            if(flag) {
                      out.write("\t\t\t<div  id=\"idPossible\">사용가능합니다.\r\n");
                      out.write("\t\t\t\t\t<input  type=\"hidden\" name=\"hidId\" id=\"hidId\" value=\"");
                      out.print(id);
                      out.println("\"/>\r\n");
                      out.write("\t\t\t\t\t<a href=\"#void\"  id=\"useId\" >사용</a>\t\r\n");
                      out.write("\t\t\t</div>\r\n");
            }else {
                  out.write("\t\t\t<div id=\"idImpossible\">사용  불가능 합니다. </div>\r\n");
                  out.write("\t </div>\r\n");
            }//end else
           }//end if
           
           out.write("</div>\r\n");
           out.write("</div>\r\n");
           out.write("</body>\r\n");
           out.write("</html>\r\n");
           
     }//doGet
     
     private boolean idChk(String id) {
           boolean idFlag=false;
           WebMemberDAO wm_dao=WebMemberDAO.getInstance();
           
           try {
                idFlag=wm_dao.selectId(id);
           } catch (SQLException e) {
                e.printStackTrace();
           }//end catch
           
           return idFlag;
     }//idChk
}//class
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회 원 가 입</title>
<link rel="stylesheet" type="text/css"  href="http://localhost:8080/servlet_prj/common/css/main_v190130.css"/>
<style type="text/css">
     #joinTitle{font-weight: bold; font-size: 20px;}
     .tdalign{text-align: center}
     table{margin: 0px auto}
     tr{height:25px}
     
     #wrap{width:1007px; margin: 0px auto;}
     #joinHeader{width:1007px; height:195px;
                     background: #FFFFFF url(images/header.png)  no-repeat;}
     .span{color:#FF0000;}
</style>
<script type="text/javascript">
     window.onload=function(){
           //옵션 생성
           //년
           //var b_year=document.getElementById("b_year");
           var obj=document.joinFrm;
           var b_year=obj.b_year;//1.select 얻기
           
           var date=new Date();
           var year_idx=0;
           //20살의 나이를 가진 년도에 selected
           var flag_year=date.getFullYear()-20+1;
           
           for(var i=1950; i<date.getFullYear()+1; i++){
                //2.select의 옵션 생성 Option(보여질값,  value값(넘겨줄값))
                b_year.options[year_idx]=new Option(i,i);
                if(flag_year==i){
                     b_year.selectedIndex=year_idx;
                }//end if;
                year_idx++;
           }//end for
           //b_year.options[50].selected = true;
          //b_year.options[50].setAttribute("selected","selected");
           
           //월 설정 1-12
           var b_month=obj.b_month;
           var month_idx=0;
           for(var i=1; i<13; i++){
                b_month.options[month_idx]=new Option(i,i);
                month_idx++;
           }//end for
           
           //일 설정 1-31
           var b_day=obj.b_day;
           var day_idx=0;
           for(var i=1; i<32; i++){
                b_day.options[day_idx]=new Option(i,i);
                day_idx++;
           }//end for
           
           //////////////////////////////////이벤트  등록/////////////////////////////////////////
          document.getElementById("idDup").addEventListener("click",popupCenter);
          document.getElementById("daumZip").addEventListener("click",execPostcode);
          document.getElementById("btnJoin").addEventListener("click",nullCheck);
           
          document.getElementById("pass2").addEventListener("blur",chkPass);
           
          document.getElementById("ssn1").addEventListener("keyup",moveSsn2);
          document.getElementById("ssn2").addEventListener("keyup",chkSsn);
           
     }//function-onload
     
     function moveSsn2(){
           //주민번호 앞자리에서 6글자가 입력되면 커서를 ssn2로  이동
/*         if(document.getElementById("ssn1").value.length==6){
                document.joinFrm.ssn2.focus();
           }//end if나나!! */
           var obj=document.joinFrm;
           if(obj.ssn1.value.length==6){
                obj.ssn2.focus();
           }//end if
           
           if(obj.ssn1.value.replace(/[0-9]/g,"")!=""){
                alert("주민번호는 숫자로만 구성됩니다.");
                obj.ssn1.value="";
                obj.ssn1.focus();
                return;
           }//end if
     }//moveSsn2
     
     function chkSsn(){
           //입력한 주민번호의 유효성 검증
           //주민 번호의 끝자리가 7자리인지
           var obj=document.joinFrm;
           if(obj.ssn2.value.length==7){
                //주민 번호 첫번째 자리가 숫자로 구성되어있는지?
                if(obj.ssn1.value.replace(/[0-9]/g,"")!=""){
                     alert("주민번호 첫번쨰 칸자리는 숫자로만  구성됩니다.");
                     obj.ssn1.value="";
                     obj.ssn1.fucus();
                     return;
                }//end if
                
                //주민 번호 두번째 자리가 숫자로 구성되어있는지?
                if(obj.ssn2.value.replace(/[0-9]/g,"")!=""){
                     alert("주민번호는 두번째칸 자리는 숫자로만  구성됩니다.");
                     obj.ssn2.value="";
                     obj.ssn2.fucus();
                     return;
                }//end if
                
                var ssn=obj.ssn1.value+obj.ssn2.value;
                /*
                //alert(ssn);
                var flagNum=[2,3,4,5,6,7,8,9,2,3,4,5];
                
                //주민번호의 각자리에 2,3,4,5,6,7,8,9,2,3,4,5 를  곱한 값의 결과를 모두 더해서 변수에 할당
                var temp=0;
                for(var i=0; i<flagNum.length; i++){
                     temp +=ssn.charAt(i)*flagNum[i];
                }//end for
                
                //위에서 계산된 값을 11로 나눈 나머지를 11에서  빼고 그 결과를 10으로 나눈 나머지를 구한다.
                temp=(11-(temp%11))%10;
                */
                //위에서 계산된 결과가 주민번호의 가장마지막  자리와 일치한다면 유효, 그렇지 않다면 무효
                //if(temp==ssn.charAt(12)){
                     //alert("유효");
                     //성별 체크
                     var genderFlag=ssn.charAt(6);
                     if(genderFlag%2==0){
                           //여자
                           obj.gender[1].checked=true;
                     }else{
                           obj.gender[0].checked=true;
                     }//end else
                           
                     //생년월일
                     var ssn_year=parseInt(ssn.substring(0,  2));
                     var ssn_month=parseInt(ssn.substring(2,  4));//01->1
                     var ssn_day=parseInt(ssn.substring(4,  6));//01->1
                     if(genderFlag<=2){//1,2=>1900
                           ssn_year=1900+ssn_year;
                     }else if(genderFlag<=4){//=>2000
                           ssn_year=2000+ssn_year;
                     }//end else
                           
                     //생년월일 체크되게 하기
                     var b_flag=false;
                     for(var i=0; i<obj.b_year.length; i++){
                           if(obj.b_year[i].value==ssn_year){
                                obj.b_year[i].selected=true;
                                b_flag=true;
                                break;
                           }//end if
                     }///end for
                     
                     if(!b_flag){//준비된 생년이 없을 때
                           //옵션을 생성하여 추가하고
                          obj.b_year.options[obj.b_year.length]=new  Option(ssn_year,ssn_year);
                           //추가된 옵션을 선택해 준다.
                          obj.b_year[obj.b_year.length-1].selected=true;
                     }//end if
                     
                     //월 설정
                     obj.b_month[ssn_month-1].selected=true;
                     //일 설정
                     obj.b_day[ssn_day-1].selected=true;
                           
                     //나이
                     var date=new Date();
                     obj.age.value=date.getFullYear()-ssn_year+1;
                           
                //}else{
                //   alert("잘못된 주민 번호 입니다.");
                //}//end else
                
                
           }//end if
     }//chkSsn
     
     //미혼일때 결혼기념일 체크 안되게
     
     function nullCheck(){
           //필수 입력값 체크
           var obj=document.joinFrm;
           
           if(obj.id.value==""){
                alert("아이디는 필수 입력!!");
                return;
           }//end if
           
           if(obj.pass1.value==""){
                alert("비밀번호는  필수 입력!!");
                obj.pass1.focus();
                return;
           }//end if
           if(obj.pass2.value==""){
                alert("비밀번호 확인은  필수 입력!!");
                obj.pass2.focus();
                return;
           }//end if
           
           if(obj.name.value==""){
                alert("이름은  필수 입력!!");
                obj.name.focus();
                return;
           }//end if
           
           if(obj.ssn1.value==""){
                alert("주민번호  앞칸은 필수 입력!!");
                obj.ssn1.focus();
                return;
           }//end if
           if(obj.ssn2.value==""){
                alert("주민번호 뒷칸은  필수 입력!!");
                obj.ssn2.focus();
                return;
           }//end if
           
           if(obj.zipcode.value==""||obj.addr1.value==""){
                alert("주소를 검색해 주세요!!");
                return;
           }//end if
           
           if(obj.addr2.value==""){
                alert("상세주소는  필수 입력!!");
                obj.addr2.focus();
                return;
           }//end if
           
           //입력값이 모두 입력되었으므로 서버로 전송
           obj.submit();//get방식이라 중요정보가 다 주소로  넘어가게된다!-> post로 바뀌어야 한다.
           
     }//nullCheck
     
     function chkPass(){
           //비밀번호가 일치 하는지 체크
           var obj=document.joinFrm;
           if(obj.pass1.value != obj.pass2.value){
                alert("비밀번호가 틀립니다.");
                obj.pass1.value="";
                obj.pass2.value="";
                obj.pass1.focus();
                return;
           }//end if
     }//chkPass
     
     function popupCenter(){
          window.open("../id_dup","idDup","width=502,height=303");           
     }//popupCenter
</script>
<style type="text/css">
</style>
<!-- script를 body에 넣었을때 에러가 발생하면 사용자는  에러메세지를 계속 클릭한 이후 제공하는 서비스를 볼 수 있다.
     script를 head에 넣었다면 에러가 발생하더라도 body는  에러메세지 없이 그대로 제공된다. -->
<script  src="http://dmaps.daum.net/map_js_init/postcode.v2.js"></script>
<script>
    //본 예제에서는 도로명 주소 표기 방식에 대한 법령에 따라,  내려오는 데이터를 조합하여 올바른 주소를 구성하는 방법을  설명합니다.
    function execPostcode() {
        new daum.Postcode({
            oncomplete: function(data) {
                // 팝업에서 검색결과 항목을 클릭했을때 실행할  코드를 작성하는 부분.
                // 도로명 주소의 노출 규칙에 따라 주소를 표시한다.
                // 내려오는 변수가 값이 없는 경우엔 공백('')값을  가지므로, 이를 참고하여 분기 한다.
                var roadAddr = data.roadAddress; // 도로명 주소  변수
                var extraRoadAddr = ''; // 참고 항목 변수
                // 법정동명이 있을 경우 추가한다. (법정리는 제외)
                // 법정동의 경우 마지막 문자가 "동/로/가"로  끝난다.
                if(data.bname !== '' &&  /[동|로|가]$/g.test(data.bname)){
                    extraRoadAddr += data.bname;
                }
                // 건물명이 있고, 공동주택일 경우 추가한다.
                if(data.buildingName !== '' && data.apartment  === 'Y'){
                   extraRoadAddr += (extraRoadAddr !== '' ? ', '  + data.buildingName : data.buildingName);
                }
                // 표시할 참고항목이 있을 경우, 괄호까지 추가한  최종 문자열을 만든다.
                if(extraRoadAddr !== ''){
                    extraRoadAddr = ' (' + extraRoadAddr + ')';
                }
                // 우편번호와 주소 정보를 해당 필드에 넣는다.
                document.getElementById('zipcode').value =  data.zonecode;
                document.getElementById("roadAddr").value =  roadAddr;
                //document.getElementById("jibunAddr").value =  data.jibunAddress;
                
                // 참고항목 문자열이 있을 경우 해당 필드에 넣는다.
                if(roadAddr !== ''){
                    document.getElementById("extraAddr").value =  extraRoadAddr;
                } else {
                    document.getElementById("extraAddr").value =  '';
                }
/*                 var guideTextBox =  document.getElementById("guide");
                // 사용자가 '선택 안함'을 클릭한 경우, 예상  주소라는 표시를 해준다.
                if(data.autoRoadAddress) {
                    var expRoadAddr = data.autoRoadAddress +  extraRoadAddr;
                    guideTextBox.innerHTML = '(예상 도로명 주소  : ' + expRoadAddr + ')';
                    guideTextBox.style.display = 'block';
                } else if(data.autoJibunAddress) {
                    var expJibunAddr = data.autoJibunAddress;
                    guideTextBox.innerHTML = '(예상 지번 주소 :  ' + expJibunAddr + ')';
                    guideTextBox.style.display = 'block';
                } else {
                    guideTextBox.innerHTML = '';
                    guideTextBox.style.display = 'none';
                } */
            }
        }).open();
    }
</script>
</head>
<body>
<div id="wrap">
<div id="joinHeader"></div>
<div id="joinContent">
     <form action="../web_member_join" name="joinFrm"  method="post">
           <table>
                <tr>
                     <td class="tdalign" colspan="2"><span  id="joinTitle">회원가입</span></td>
                </tr>
                
                <tr>
                     <td><span class="span">*</span>아이디</td>
                     <td>
                           <input type="text" class="inputBox"  name="id" readonly="readonly" style="width:100px">
                           <button type="button" class="btn"  id="idDup">중복확인</button>
                     </td>
                </tr>
                
                <tr>
                     <td><span  class="span">*</span>비밀번호</td>
                     <td><input type="password"  class="inputBox" name="pass1" style="width:120px"></td>
                </tr>
                
                <tr>
                     <td><span class="span">*</span>비밀번호  확인</td>
                     <td><input type="password"  class="inputBox" id="pass2" name="pass2"  style="width:120px"></td>
                </tr>
                
                <tr>
                     <td><span class="span">*</span>이름</td>
                     <td><input type="text" class="inputBox"  name="name" style="width:120px"></td>
                </tr>
                
                <tr>
                     <td><span  class="span">*</span>주민번호</td>
                     <td><input type="text" class="inputBox"  name="ssn1" id="ssn1" style="width:60px" maxlength="6">
                           <label> - </label>
                           <input type="password"  class="inputBox" name="ssn2" id="ssn2" style="width:70px"  maxlength="7"></td>
                </tr>
                
                <tr>
                     <td>&nbsp;성별</td>
                     <td><input type="radio" value="남자"  name="gender" name="pass">남자
                           <input type="radio" value="여자"  name="gender">여자</td>
                </tr>
                
                <tr>
                     <td>&nbsp;생년월일</td>
                     <td>
                           <select name="b_year"  class="inputBox">
                           </select>
                           <label>년</label>                          
                           
                           <select name="b_month"  class="inputBox">
                           </select>
                           <label>월</label>    
                           
                           <select name="b_day"  class="inputBox">
                           </select>                  
                           <label>일</label>                          
                     </td>
                </tr>
                
                <tr>
                     <td>&nbsp;나이</td>
                     <td><input type="text" name="age"  class="inputBox" style="width:30px"></td>
                </tr>
                
                <tr>
                     <td>&nbsp;관심언어</td>
                     <td>
                     <input type="checkbox" value="Java"  name="interestlang">Java
                     <input type="checkbox" value="C/C++"  name="interestlang">C/C++
                     <input type="checkbox" value="Python"  name="interestlang">Python
                     <input type="checkbox" value="VB"  name="interestlang">VB
                     
                     <input type="checkbox" value="JSP"  name="interestlang">JSP
                     <input type="checkbox" value="Servlet"  name="interestlang">Servlet
                     <input type="checkbox" value="ASP"  name="interestlang">ASP
                     <input type="checkbox" value="php"  name="interestlang">php
                     </td>
                </tr>
                
                <tr>
                     <td>&nbsp;결혼여부</td>
                     <td><input type="radio" value="미혼"  name="marrigeFlag" checked="checked">미혼
                           <input type="radio" value="기혼"  name="marrigeFlag">기혼</td>
                </tr>
                
                <tr>
                     <td>&nbsp;결혼기념일</td>
                     <td><input type="text" maxlength="4"  name="m_year" class="inputBox" style="width:40px">년&nbsp;
                     <input type="text"  maxlength="2"  name="m_month" class="inputBox" style="width:20px">월&nbsp;
                     <input type="text"  maxlength="2"  name="m_day" class="inputBox" style="width:20px">일</td>
                </tr>
                
                <tr>
                     <td><span  class="span">*</span>우편번호</td>
                     <td><input type="text" readonly="readonly"  name="zipcode" id="zipcode" class="inputBox" style="width:50px">
                           &nbsp;<button type="button"  class="btn" id="daumZip">우편번호검색</button></td>
                </tr>
                <tr>
                     <td><span class="span">*</span>주소</td>
                     <td>
                     <input type="text" readonly="readonly"  name="addr1" id="roadAddr" class="inputBox" style="width:200px">
                     참고 주소 : <input type="text"  id="extraAddr" class="inputBox"/>
                     </td>
                </tr>
                <tr >
                     <td><span  class="span">*</span>상세주소</td>
                     <td><input type="text" class="inputBox"  name="addr2" style="width:200px"></td>
                </tr>
                
                <tr valign="middle">
                     <td>&nbsp;가입인사</td>
                     <td><textarea name="greetings"  class="inputBox" style="width:250px;  height:100px"></textarea></td>
                </tr>
                <tr>
                     <td colspan="2" class="tdalign">
                     <button type="button" class="btn"  id="btnJoin" onclick="">가입</button>&nbsp;
                     <button type="reset"  class="btn">초기화</button>
                     </td>
                </tr>
                <tr>
                     <td colspan="2"><span class="span">*는 필수  입력 사항입니다.</span></td>
                </tr>
           </table>
     </form>
     </div>
</div>
</body>
</html>



  • 모니터링 : TCP/IP 이클립스에서 제공하는 기능
  • 켜져있는 탐캣 서버에 우클릭>Monitoring>둘다 키면 TCP/IP Monitor 가 뜨고 어떤 값이 넘어가는지 알 수 있다.

  • 사용후엔 잘 종료해 준다!!꼭!!(구동시 문제발생 위험)


  • 웹은 비연결성에 대한 문제 : 자원이 한정적일떄->누가 이 자원을 가져가게될지 아무도 모른다.
  • 경쟁이 붙을만 하다면 select에 예외가 발생하지 않도록 insert전에 select를 한번더 해서 해결하도록 하자

servlet끗
반응형