Web登陆模块的常见解决方案及一些注意事项

来源:互联网 发布:上海少儿编程培训班 编辑:程序博客网 时间:2024/05/17 11:59

1。总体结构

JSP页面显示输入页面,Servlet(或者JSP)处理出入(服务器端验证)并设置Session以及设置跳转。

2。登陆页面(JSP),实现客户端基础验证(JS),并进行安全设置:

2.1 图片代替提交按钮:

<a href="javascript:fnLogin(); " onMouseover="javascript: window.status='Login to ...'; return true" onMouseout="javascript: window.status='';return true"><img src="images/go.jpg" width="23" height="23" border="0" name="Image1" ></a>

2.2 输入完密码后回车代替提交

<input type="password" id="password" name="password" size="10" maxlength="20" onKeyPress="keyDown()">

这里,keyDown()的内容是:

function keyDown()
 {
         {var Key=event.keyCode; var nKey=0}
  
        if (Key==13)   
        {   
           fnLogin();                        
        }   
}

2.3 fnLogin()

fnLogin往往是用JS作Form Check之后的,设置Action(这个必须,因为上面是用图片链接作按钮的),然后提交的过程,如:

function fnLogin()
{
    if(fnValidate()==0)     return;
    document.logonForm.action="commonlogin.jsp";
    document.logonForm.submit();
}

而fnValidate()就是表单验证的函数了。

2.4 安全设置(错误转向以及Catch设置)

<%@page errorPage="error.jsp"%><% //Forward when exception %>
<%
response.setHeader("Cache-Control","no-store"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server
%>

 2.5 其他小技巧:

i. DB violation:

if(str.indexOf("'")!=-1)
            throw new Exception();
 

ii. 设置光标位置:

<script language="JavaScript" type="text/javascript">
  <!--
    document.forms["logonForm"].elements["login"].focus();
    -->

iii. 返回上一页面

 

<A HREF="javascript:history.go(-1)" target="">Go Back</A>

 3。服务器端验证以及设置标签

3.1 通常设置一个Bean存放用户信息(与DB对应),如UserProfile,包括id, name ,role_type, pass 等等

3.2 关于密码:通常在数据库里的密码是加密过的。因此密码的验证有两种方式:一种是将用户输入的密码加密后,得到的密文与数据库里的密文直接比较;还有一种是将数据库里的密文解密后与用户输入作比较。我认为前者应该好一些。。

3.3 对输入的密码错误的(登陆失败),可以采用抛出异常的方式处理。这种方式的优点是在函数调用时,异常是可传递的(可传递的意思是说函数A调用B,B调用C,C抛出的异常在A里也会被捕捉,不知道这样说对不对。。。)。比如在主程序里有:

user =(UserProfile)userManager.doLogin(name, password);

对于登陆失败,doLogin函数只要简单地:

throw new Exception();

在主程序里,可以这样:

try
 {
 //check if valid login and password using doLogin() function
 }catch(Exception e)
  {
   System.out.println("catch called in commonlogin.jsp");
                 out.println(e.getMessage());
   // to display error message or dispatch for invalid login       }

 这种方法代替了返回boolean值的方法,我记得在一本书上看到过,这样的方法对效率是有好处的。

3.4 关于登陆成功/失败的标签

在上面主程序的例子中,catch的程序内容可以这么写:

System.out.println("catch called in commonlogin.jsp");
                 out.println(e.getMessage());
   // to display error message for invalid login
            out.println("<HTML>");
            out.println("<BODY>");
            out.println("<FORM name='passback' method='post' action='login.jsp' >");
            out.println("<input type='hidden' name='flag' value='true'>");
            out.println("<script language=javascript>  document.passback.submit();</script>");
            out.println("</BODY>");
            out.println("</HTML>");

这样写的特点是在设置标签(flag)时,用了表单形式,并且提交形式也比较特殊,很少见。好坏不知。

基于上面的说法,在登陆页面中如下类似的代码:

try{       
if(request.getParameter("flag") !=null)
{      
   catchFlag = request.getParameter("flag");
  if(catchFlag.equals("true"))
   {
  %>
   <script>alert("Invalid login.Try again");</script>
   <%
    }
  catchFlag = "false";
 }
}
catch(Exception e)
{
 System.out.println("the error is:" +e);
}

 其中,由于设置了<@page errorPage =".."%>,一旦发生异常,页面将自动跳转

 

 吃饭了,以后再写