자바 메 일 시스템 (2) - 로그 인 등록 모듈

여기 에는 아직도 케케묵은 문제 들 이 있다. CSS, 인증번호, SSL, Struts Validate 등 이다.하나씩 기록 하고 다시 이야기 하 자.
  • css

  • 마침내 페이지 레이아웃 에 대해 조금 알 게 되 었 습 니 다. 기본 적 인 head, 하나의 sidebar, 하나의 mainbody 의 구조:
    /*    */
    body {font:12px Tahoma;margin:0px;text-align:center;background:#FFF;}
    a:link,a:visited {font-size:12px;text-decoration:none;}
    a:hover{}
    
    /*     */
    #container {width:700px;margin:10px auto}
    
    /*    */
    #header {background:url(../img/logo.gif) no-repeat;height:59px;}
    #menu {}
    #menu ul {float:right;list-style:none;margin:0px;width:560px;height:16;background:#EAF3FF}
    #menu ul li {float:right;display:block;line-height:30px;margin:0 5px}
    #menu ul li a:link,#menu ul li a:visited {font-weight:bold;font-size:11px;color:#00A3FF}
    #menu ul li a:hover{}
    .menuDiv {width:1px;height:28px;background:#CCCCCC;}
    
    /*    */
    #pagebody {
        width:700px; /*    */
        margin:0px auto; /*  */
    }
    
    #sidebar {
    		background:#F5F8FC;
        width:320px; /*    */
        text-align:left; /*     */
        float:right; /*    */
        clear:right; /*         */
        overflow:hidden; /*        */
        border:1px solid #78A3D3;
    	height:400px
    } 
    #sidebar ul {float:right;list-style:none;width:320px;height:16;margin:20px;}
    #sidebar ul li {font-size:13px;margin:10px;}
    #sidebar ul li a:link,#sidebar ul li a:visited {font-size:11px;color:#78A3D3}
    #sidebar ul li a:hover{}
    .account,.password,.validate {
      border:1px solid #78A3D3; 
      line-height:100px;
      width: 120px;
      height: 20px;
    }
    .loginButton {
    BORDER-RIGHT: #7b9ebd 1px solid;
    PADDING-RIGHT: 2px;
    BORDER-TOP: #7b9ebd 1px solid;
    PADDING-LEFT: 2px;
    FONT-SIZE: 12px;
    FILTER: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#ffffff, EndColorStr=#cecfde);
    BORDER-LEFT: #7b9ebd 1px solid;
    CURSOR: hand;
    COLOR: black;
    PADDING-TOP: 2px;
    BORDER-BOTTOM: #7b9ebd 1px solid
    }
    .note {
    font-size: 11px;
    color: #868686;
    }
    .error {
    	margin:1px 20px;
    	width:120px;
    	color:ff0000;
    	font-size:12;
    }
    #mainbody {
        width:380px;
        text-align:left;
        float:left; /*    */
        clear:left; /*         */
        overflow:hidden;
    }
    #mainbody ul {float:right;list-style:none;width:320px;height:16;margin:20px;}
    #mainbody ul li {font-size:12px;margin:5px;}
    /*    */
    #footer {width:800px;margin:0 auto;height:50px;background:#00FFFF}

     그리고 괜 찮 은 등록 css 를 찾 았 습 니 다:
    .css
    body {
    	font-family: Arial, Helvetica, sans-serif;
    	font-size:12px;
    	color:#666666;
    	background:#fff;
    	text-align:center;
    
    }
    
    * {
    	margin:0;
    	padding:0;
    }
    
    a {
    	color:#1E7ACE;
    	text-decoration:none;	
    }
    
    a:hover {
    	color:#000;
    	text-decoration:underline;
    }
    h3 {
    	font-size:14px;
    	font-weight:bold;
    }
    
    pre,p {
    	color:#1E7ACE;
    	margin:4px;
    }
    input, select,textarea {
    	padding:1px;
    	margin:2px;
    	font-size:11px;
    }
    .buttom{
    	padding:1px 10px;
    	font-size:12px;
    	border:1px #1E7ACE solid;
    	background:#D0F0FF;
    }
    #formwrapper {
    	width:510px;
    	margin:15px auto;
    	padding:20px;
    	text-align:left;
    	border:1px #1E7ACE solid;
    }
    
    fieldset {
    	padding:10px;
    	margin-top:5px;
    	border:1px solid #1E7ACE;
    	background:#fff;
    }
    
    fieldset legend {
    	color:#1E7ACE;
    	font-weight:bold;
    	padding:3px 20px 3px 20px;
    	border:1px solid #1E7ACE;	
    	background:#fff;
    }
    
    fieldset label {
    	float:left;
    	width:120px;
    	text-align:right;
    	padding:4px;
    	margin:1px;
    }
    .error {
    	margin:1px 125px;
    	width:120px;
    	color:ff0000;
    }
    
    fieldset div {
    	clear:left;
    	margin-bottom:2px;
    }
    
    .enter{ text-align:center;}
    .clear {
    	clear:both;
    }
    

     
    .jsp
    <fieldset>
    		<legend>        </legend>
    		<div>
    			<label for="username">   </label>
    			<input type="text" name="username"  id="username" size="20" maxlength="30" onblur="getBackInfo();"/> @ymail.com*<input type="text" id="disCheckResult" size="50" readonly style="border:0;margin:0 80px;font-size=12;color=red"/><br />
    			<p class="error"><html:errors property="username"/></p>
    		</div>
    	</fieldset>
    	<br />
    	<fieldset>
    		<legend>         </legend>
    		<p><strong>                 ,        .</strong>                 .</p>
    	<div>	
    		<label for="password">  </label>
    		<input type="password" name="password" size="18"/> 
    		*(  8   )<br /><p class="error"><html:errors property="password"/></p>
    	</div>
    	<div>
    		<label for="password1">    </label>
    		<input type="password" name="password1" size="18"/> 
    		*<br /><p class="error"><html:errors property="password1"/></p>
    	</div>
    		<div>
    		<label for="question">      </label>
    		<select name="question" class="text" title="      ">
    
    			<option value=""  selected="selected">       </option>
    
    			<option value="            ?">            ?</option>			
    
    			<option value="            ?">            ?</option>
    
    			<option value="          ?">          ?</option>
    
    			<option value="          ?">          ?</option>
    
    			<option value="       ?">       ?</option>
    
    			<option value="       ?">       ?</option>			
    
    			<option value="        ?">        ?</option>
    
    			<option value="      ?">      ?</option>
    
    			<option value="      ?">      ?</option>
    
    			<option value="      ?">      ?</option>
    		</select> 
    		*<br /><p class="error"><html:errors property="question"/></p>
    	</div>
    		<div>
    		<label for="answer">    </label>
    		<input type="text" name="answer" size="18"/> 
    		*<br /><p class="error"><html:errors property="answer"/></p>
    	</div>
    	<div>
    		<label for="nickName">  </label>
    		<input type="text" name="nickName" size="18"/> 
    		*<br/><p class="error"><html:errors property="nickName"/></p>
    	</div>
    	<div>
    		<label for="sEmail">    </label>
    		<input type="text" name="sEmail"  value="" size="20" maxlength="150" />
    		               <p class="error"><html:errors property="sEmail"/></p>
    	</div>	
    		<div>
    		<label for="agreeToTerms">      </label>
     	   	<input type="checkbox" name="agreeToTerms"  value="1" /> 
     	   	<a href="#" title="         ">     ?</a> *	<br/>
     	   	<p class="error"><html:errors property="agreeToTerms"/></p></div>		
    		<div class="enter">
    	    <input name="create791" type="submit" class="buttom" value="  " />
    	    <input name="Submit" type="reset" class="buttom" value="  " />
    	</div>
    
    		<p><strong>*           ,                  .<br /> 
    	    *                    .</strong></p>	
    	</fieldset>
  •  vaidation 에 대하 여
  • js 와 struts validate 를 사용 할 수 있 습 니 다. 여기 두 가 지 를 모두 사 용 했 습 니 다. - -!!!
    먼저 틀 을 사용 하 는 것 을 말한다.
    1. 프로필:
         
    2. 인증 규칙 쓰기
    <form name="registerForm">
    			<field property="username" depends="required">
    				<msg name="required" key="error.required"/>
    				<arg0 key="error.username"/>
    			</field>
    			<field property="password" depends="required,minlength">
    				<msg name="required" key="error.required"/>
    				<arg0 key="error.password"/>
    				<msg name="minlength" key="error.minlength"/>
    				<arg0 key="error.password"/>
    				<arg1 key="${var:minlength}" name="minlength" resource="false"/>
    				<var>
    					<var-name>minlength</var-name>
    					<var-value>8</var-value>
    				</var>
    			</field>
    			<field property="password1" depends="validwhen">
                    <var>
                        <var-name>test</var-name>
                        <var-value>(password==*this*)</var-value>
                    </var>
                    <msg name="validwhen" key="error.password1"/>
                </field>
    			<field property="question" depends="required">
    				<msg name="required" key="error.required"/>
    				<arg0 key="error.question"/>
    			</field>
    		....
    		</form>

     3. properties 파일 쓰기
    4. 페이지 에 < html: errors property = "username" / > 를 추가 하 는 것 을 잊 지 마 세 요.
    사용자 이름 이 있 는 지 없 는 지 스스로 검증 규칙 을 써 서 판단 할 수 있 었 지만, Ajax 의 무 리 셋 검증 은 더욱 매력 적 으로 보 였 습 니 다. 그래서 Ajax 에 대해 아무것도 모 르 는 저 는 첫 번 째 시 도 를 했 습 니 다. 이해 하기 쉬 운 것 같 습 니 다. 즉, servlet 를 쓰 고 js 로 호출 하여 페이지 에 결 과 를 보 여 주 었 습 니 다.
    servlet:
    package servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.ymail.dbimpl.UsersImpl;
    
    
    public class UsernameValidator extends HttpServlet {
    
    
      /**
      * 
      */
     private static final long serialVersionUID = -9038308848332609445L;
    
      protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
       String username = request.getParameter("username");
      // System.out.print("asdfdsaf");
       try{
    	   UsersImpl usersImpl = new UsersImpl();
       boolean flag = usersImpl.usernameValidate(username);
       String msg = null;
       //System.out.print(flag);
       response.setContentType("text/html;charset=gb2312");
       PrintWriter out = response.getWriter();
    if (flag) {
        msg  = "   "+username+"    ";
       }
       else {
        msg = "   ,"+username+"    ";
       }
      out.println(msg);
       //System.out.print(msg);
             }catch(Exception ex){
            	 	ex.printStackTrace();
             }
    
      }
    
      @Override
      protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
       // TODO Auto-generated method stub
       doPost(request, response);
      }  
    
    }
    

     
    js:
    <script language="javascript" >
    var request;
    /**
                        httpRequest,    :
    1.      XMLHttpRequest()  ,                   
    2.      ,           ,              
    3.               ,         7.0    XMLHttpRequest()   
    4.               ,                         
        。
    */
    function createRequest()
    {
        try{
            request=new XMLHttpRequest();
        }catch(trymicrosoft)
        {
            try{
                request=new ActiveXObject("Msxml2.XMLHTTP");
            }catch(othermicrosoft)
            {
                try{
                    request=new ActiveXObject("Microsoft.XMLHTTP");
                }
                catch(failed)
                {
                    request=false;
                }
            }
        }
        if(!request)
        {
           alert("err Happend!");
           return null;
        }        
        return request;
    }
    /**
                      ,    onblur() ,       
           :
    1. HTML          ,    document.getElementById("")  。
    2.     URL, URL   FORM   method get    submit      
          
    3.         ,           ,          ,    
            ,
          GET,POST   POST,           ,        , 
           FireFox     ,
            URL,        。
               true,     false。true      ,       
         ,   AJAX   A, asynchronous;  false,          
              。
    4.       ,                ,             
      。            Javascript    ,  XMLHttpRequest     
                     。
    5.       ,     send()                 ,    
           ,               :
    name=value&anothername=othervalue&so=on,        ,     MIME  :
    httpRequest.setRequestHeader('Content-type','application/x-www-form-urnlencoded');
                  。
    */
    function getBackInfo()
    {
    	request = createRequest();
        var username=document.getElementById("username").value;
        var url='/ymail/usernameValidate?username='+username;
       // var xmlHttp = new ActiveXObject("MSXML2.XMLHTTP");
        //alert("      !");
        request.open("GET",url,"true");
        
        //             ,                    
        //onreadystatechange 5  :
        // 0:    
        // 1:   
        // 2:    
        // 3:     
        // 4:      
        //               onreadystatechange ,           
        //  disResult     ,     。
        request.onreadystatechange=disResult;//     
        request.send(null);
    }
    function disResult()
    {
    /**
    1.     readystate==4           ,         readystate==1 
         ,    readystate==2,readystate==3,readystate==4       ,  
       alert("")        。
    2.        ,            ,                ,  
          :
    200:    
    401:   
    403:  
    404:      
    */
        if(request.readystate==4)
        {
            if(request.status==200)
            {
                //   OK ,    Javascript          。
                document.getElementById("disCheckResult").value=request.responseText;
                //alert(request.responseText);
            }
            else
            {
                alert('Something Wrong has Happend!');
            }
        }
    }
    </script>

     
    페이지 에 오류 정 보 를 추가 하여 표시 할 위 치 를 기억 하 십시오:

     
  • 인증번호
  • 아무리 해도 qq 메 일 박스 의 그 효 과 를 낼 수 없습니다. 누가 저 에 게 어떻게 자바 2d 로 랜 덤 곡선 을 그 리 는 지 알려 줄 수 있 습 니까?자기가 만 든 것 이 비교적 보기 흉 하 다.
    package servlet;
    
    import java.awt.BasicStroke;
    import java.awt.Color; 
    import java.awt.Font; 
    import java.awt.Graphics2D; 
    import java.awt.image.BufferedImage; 
    import java.util.Random; 
    
    import javax.imageio.ImageIO; 
    import javax.servlet.ServletException; 
    import javax.servlet.ServletOutputStream; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 
    import javax.servlet.http.HttpSession; 
    
    /**
    *        
    * @author bitiliu
    *
    */
    public class ValidateCodeServlet extends HttpServlet 
    {
    
    private static final long serialVersionUID = 1L; 
    
    //        。
    private int width=30; 
    //        。
    private int height=15; 
    //       
    private int codeCount=3; 
    
    
    private int x=0; 
    //    
    private int fontHeight; 
    private int codeY; 
    
    char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
    'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
    'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; 
    
    /**
    *          
    */
    public void init() throws ServletException
    {
    // web.xml       
    //  
    String strWidth=this.getInitParameter("width"); 
    //  
    String strHeight=this.getInitParameter("height"); 
    //    
    String strCodeCount=this.getInitParameter("codeCount"); 
    
    //           
    try
    {
    if(strWidth!=null && strWidth.length()!=0)
    {
    width=Integer.parseInt(strWidth); 
    }
    if(strHeight!=null && strHeight.length()!=0)
    {
    height=Integer.parseInt(strHeight); 
    }
    if(strCodeCount!=null && strCodeCount.length()!=0)
    {
    codeCount=Integer.parseInt(strCodeCount); 
    }
    }
    catch(NumberFormatException e)
    {}
    
    x=width/(codeCount+1); 
    fontHeight=height; 
    codeY=height-2; 
    
    }
    
    protected void service(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, java.io.IOException {
    
    //    buffer
    BufferedImage buffImg = new BufferedImage(
    width, height,BufferedImage.TYPE_INT_RGB); 
    Graphics2D g = buffImg.createGraphics(); 
    
    //           
    Random random = new Random(); 
    
    //        
    g.setColor(new Color(230, 243, 255)); 
    g.fillRect(0, 0, width, height); 
    
    //    ,                。
    Font font = new Font("Arial", Font.ITALIC, 35); 
    //    。
    g.setFont(font); 
    
    //   。
    g.setColor(Color.BLACK); 
    g.drawRect(0, 0, width - 1, height - 1); 
    
    //    160    ,                  。
    g.setColor(Color.BLACK); 
    int red = 0, green = 0, blue = 0; 
    for(int i = 0; i < 20; i++) 
    {
    int x = random.nextInt(width); 
    int y = random.nextInt(height); 
    int xl = random.nextInt(30); 
    int yl = random.nextInt(30); 
    
    red = random.nextInt(255); 
    green = random.nextInt(255); 
    blue = random.nextInt(255); 
    
    //                  。
    g.setColor(new Color(red, green, blue));
    g.setStroke(new BasicStroke(3.0f));
    g.drawArc(x, y, xl, yl,random.nextInt(180),random.nextInt(180)); 
    }
    
    //randomCode            ,           。
    StringBuffer randomCode = new StringBuffer(); 
    
    
    //    codeCount      。
    for (int i = 0; i < codeCount; i++) {
    //            。
    String strRand = String.valueOf(codeSequence[random.nextInt(36)]); 
    
    
    g.setColor(new Color(red, green, blue)); 
    g.drawString(strRand, (i + 1) * x, codeY); 
    
    //              。
    randomCode.append(strRand); 
    }
    //             Session 。
    HttpSession session = req.getSession(); 
    session.setAttribute("validateCode", randomCode.toString()); 
    
    //       。
    resp.setHeader("Pragma", "no-cache"); 
    resp.setHeader("Cache-Control", "no-cache"); 
    resp.setDateHeader("Expires", 0); 
    
    resp.setContentType("image/jpeg"); 
    
    //      Servlet    。
    ServletOutputStream sos = resp.getOutputStream(); 
    ImageIO.write(buffImg, "jpeg", sos); 
    sos.close(); 
    }
    
    } 
    
    

     
    그리고 페이지 를 이 servlet 에 삽입 합 니 다:
    <img src="/ymail/validateCodeServlet" onclick="refresh(this);"/>
    <script>
    function refresh(e){
    e.src="validateCodeServlet";
    }
    </script>

     
  • SSL

  • 이것 을 언급 하면 단 방향 양 방향 은 진부 한 문제 입 니 다. 여 기 는 양 방향 을 사용 하지 않 기 때문에 서버 측의 검증 만 추 가 했 습 니 다.
    1. 키 스토어 를 만 드 는 것 은 간단 합 니 다. JDK 가 자체 적 으로 가지 고 있 는 키 툴 을 이용 하면 완성 할 수 있 습 니 다.명령 은 다음 과 같 습 니 다.
    wakan@wakan:~/tomcat2/bin> keytool -genkey -alias tomcat -keyalg RSA
      keystore  : ************
              ?
    [Unknown]: Wakan.Jiang
               ?
    [Unknown]: ZZNode
             ?
    [Unknown]: ZZNode
                  ?
    [Unknown]: BeiJing
                 ?
    [Unknown]: BeiJing
                  
    [Unknown]: CN
    CN=Wakan.Jiang, OU=ZZNode, O=ZZNode, L=BeiJing, ST=BeiJing, C=CN    ?
    [ ]:  
    
      <tomcat>    
            (    keystore     ,   ):

     특히 위 에 입력 한 "< tomcat > 의 주 비밀번호" 는 keystore 비밀번호 와 같 아야 합 니 다. 그렇지 않 으 면 TOMCAT 가 일어나 지 않 습 니 다.적어도 몇 번 은 해 봤 는데 안 돼.오 류 는 다음 과 같 습 니 다: 2007 - 3 - 26 17: 07: 01 org. apache. coyote. http 11. Http 11 BaseProtocol init 심각: Error initializing endpointjava. io. IOException: Cannot recover key        at org. apache. tomcat. util. net. jsse. JSSE 14 SocketFactory. init (JSSE 14 Socket Factory. java: 125) 2. server. xml 을 TOMCAT / conf / server. xml 에서 SSL 과 관련 된 부분 을 수정 합 니 다. 다음 과 같이 변경 하 겠 습 니 다.    keystore Pass 를 지정 합 니 다. 잘못 쓰 면 다음 오류 가 발생 합 니 다. 심각: Error initializing endpointjava. io. IOException: Keystore was tampered with, or password was incorrect        at sun. security. provider. JavaKeyStore. engineLoad (JavaKeyStore. java: 768) 3. Tomcat 를 시작 하 는 것 은 비교적 간단 하 므 로 더 이상 말 하지 않 겠 습 니 다.시작 이 완료 되면 브 라 우 저 에: https://localhost:8443 를 입력 하면 TOMCAT 홈 페이지 를 볼 수 있 습 니 다.
    <!-- Define a SSL HTTP/1.1 Connector on port 8443 -->
        <Connector port="8443" maxHttpHeaderSize="8192"
                   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                   enableLookups="false" disableUploadTimeout="true"
                   acceptCount="100" scheme="https" secure="true" keystorePass="******"
                   clientAuth="false" sslProtocol="TLS" />
    

    좋은 웹페이지 즐겨찾기