本帖最后由 java2000_net 于 2008-08-05 17:10:52 编辑

解决方案 »

  1.   

    login.jsp:<%@ page contentType="text/html;charset=gb2312" %><html>
      <head>   
        <title>登陆页面</title>
      </head>
      
      <body> 
        <form action="login.jsp?action=login" method="post">
          <table>
            <tr>
              <td>用户名:</td>
              <td><input type="text" name="name"></td>
            </tr>
            <tr>
              <td>密码:</td>
              <td><input type="password" name="password"></td>
            </tr>
            <tr>
              <td>
                <input type="hidden" name="origin_uri" value="${requestScope.origin_uri}">
              </td>
            </tr>
            <tr>
              <td><input type="reset" value="重填"></td>
              <td><input type="submit" value="提交"></td>
            </tr>
          </table>
        </form
      </body>
    </html>
    我是用一个过滤器来处理!import java.io.IOException;
    import java.io.PrintWriter;
    import java.sql.SQLException;import javax.naming.NamingException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;public class LoginFilter implements Filter
    {
    private static final String LOGIN_URI="login_uri";
    private static final String HOME_URI="home_uri";

    private String login_page;
    private String home_page;

    public void init(FilterConfig filterConfig) throws ServletException
    {
    //从部署描述符中获取登陆页面和首页的URI
    login_page=filterConfig.getInitParameter(LOGIN_URI);
    home_page=filterConfig.getInitParameter(HOME_URI);

    if(null==login_page || null==home_page)
    throw new ServletException("没有指定登陆页面或主页!");
    }

    public void doFilter(ServletRequest request, ServletResponse response, 
    FilterChain chain) throws IOException, ServletException
    {
    //将请求对象和相应对象的类型转换为HttpServletRequest和HttpServletResponse
    HttpServletRequest httpReq=(HttpServletRequest)request;
    HttpServletResponse httpResp=(HttpServletResponse)response;
    HttpSession session=httpReq.getSession();

    //得到用户请求的uri
    String request_uri=httpReq.getRequestURI();
    //得到web应用程序的上下文路径
    String ctxPath=httpReq.getContextPath();
    //去除上下文路径,得到剩余部分的路径
    String uri=request_uri.substring(ctxPath.length());

    //判断用户访问的是否是登陆页面
    if(login_page.equals(uri))
    {
    //如果是登陆页面,则通过查看是否有附加的查询参数,来判断用户是访问登陆页面,还是提交登录信息
    String strLogin=httpReq.getParameter("action");

    if("login".equals(strLogin))
    {
    //如果是提交登录信息,则对用户进行验证
    String name=httpReq.getParameter("name");
    String password=httpReq.getParameter("password");
    UserBean user=new UserBean(name,password);
    UserCheckBean uc=new UserCheckBean(user);

    //返回true 说明在数据库中验证成功
    if(uc.validate())
    {
    //验证通过后,在Session对象中设置isLogin属性为true
    session.setAttribute("isLogin","true");
    //在session对象中保存用户名
    session.setAttribute("user",name);

    //从请求对象中取出用户先前访问页面的URI
    String origin_uri=httpReq.getParameter("origin_uri");
    if(null!=origin_uri && !"".equals(origin_uri))
      httpResp.sendRedirect(origin_uri);  //重定向到用户先前访问页面
    else
      httpResp.sendRedirect(ctxPath+home_page);  //重定向到首页
    return;
    }
    else
    {
    //验证失败,则从请求中获取用户先前访问页面的URI
    //如果该URI存在,则再次将它作为origin_uri属性的值保存到请求对象中
    String origin_uri=httpReq.getParameter("origin_uri");
    if(null!=origin_uri && !"".equals(origin_uri))
    {
    httpReq.setAttribute("origin_uri",origin_uri);
    }
    httpResp.setContentType("text/html;charset=gb2312");
    PrintWriter out=httpResp.getWriter();
    out.println("<h2>用户名或密码错误,请重新输入</h2>");
    RequestDispatcher rd=httpReq.getRequestDispatcher(login_page);
    rd.include(httpReq,httpResp);
    return;
    }
    }
    else
    {
    //不是提交登录信息
    chain.doFilter(request,response);
    return;
    }
    }
    else
    {
    //如果访问的不是登陆页面,则判断用户是否已经登陆
    String isLogin=(String)session.getAttribute("isLogin");
    if("true".equals(isLogin))
    {
    chain.doFilter(request,response);
    return;
    }
    else
    {
    //若用户没有登录,则将用户的请求URI作为origin_uri属性的值,保存到请求对象中去
    String strQuery=httpReq.getQueryString();
    if(null!=strQuery)
    {
    request_uri=request_uri+"?"+strQuery;
    }
    httpReq.setAttribute("origin_uri",request_uri);

    RequestDispatcher rd=httpReq.getRequestDispatcher(login_page);
    rd.forward(httpReq,httpResp);
    return;
    }
    }
    }

    public void destroy() {}
    }
    import java.sql.SQLException;import javax.naming.NamingException;import com.db.DBBean;public class UserCheckBean 
    {
    protected UserBean user;

    public UserCheckBean(UserBean user)
    {
    this.user=user;
    }

    public UserBean getUser()
    {
    return user;
    }

    public void setUser()
    {
    this.user=user;
    }

    public boolean validate()
    {
    String name=user.getName();
    String password=user.getPassword();
    boolean b=false;
    try
    {
    DBBean db=new DBBean();
    UserBean ub=db.getUser(name, password);
    if(null==ub)
    b=false;
    else
    b=true;
    }
    catch(Exception e)
    {
    e.printStackTrace();
    }
    return b;
    }
    }
      

  2.   

    顺便把UserBean也发出来:
    import java.io.*;public class UserBean implements Serializable
    {
    private String name;
    private String password;

    public UserBean(String name,String password)
    {
    this.name=name;
    this.password=password;
    }

    public String getName()
    {
    return name;
    }

    public void setName(String name)
    {
    this.name=name;
    }

    public String getPassword()
    {
    return password;
    }

    public void setPassword(String password)
    {
    this.password=password;
    }
    }
      

  3.   

    首先一点:ResultSet index是从0开始,而非1,所以 rs.getString(1),rs.getString(2) 似乎不正确。当然如果弄不清楚到底是从0开始还是从1开始,或者到底第一个是name 还是password,可以使用 rs.getString("name"),rs.getString("password")嘿嘿,如果正确别忘记给分哦。
      

  4.   

    不行啊~~~~~~
    改了还是不行~~~~而且~~~我将UserCheckBean.java中的validate()方法改成了如下~~~~~~就会抛出一个空指针异常!    public boolean validate()
        {
            String name=user.getName();
            String password=user.getPassword();
            boolean b=false;
            try
            {
                DBBean db=new DBBean();
                UserBean ub=db.getUser(name, password);
                if(name.equals(ub.getName()) && password.equals(ub.getPassword()))  //这里会抛出空指针异常
                    b=true;
                else
                    b=false;
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            return b;
        }
      

  5.   

      rs=pstmt.executeQuery();  //请问结果集对象rs中,保存的第一个是name,第二个是passowrd么?
                UserBean user=null;
                if(rs.next())
                {
                    user=new UserBean(rs.getString(1),rs.getString(2));
                                    /*UserBean就是一个简单的javaBean,下面是它的构造函数
                                      public UserBean(String name,String password)
                                  {
                                   this.name=name;
                                   this.password=password;
                                  }
                                    */
                }对结果集数据的读取需要进行循环迭代。if只是判断结果集是否为空,取值应该使用while循环。
    修改如下:while(rs.next()){
     user=new UserBean(rs.getString(1),rs.getString(2));
                                    /*UserBean就是一个简单的javaBean,下面是它的构造函数
                                      public UserBean(String name,String password)
                                  {
                                   this.name=name;
                                   this.password=password;
                                  }
                                    */
    }从结果集中取值 与从集合Iterator中一样。
    例如: Iterator it=(new ArrayList()).iterator();
    while(it.hasNext()){
        Object obj=(Object )it.next();
          **********
    }
      

  6.   

    我没仔细看代码,但我遇到过这种问题,1.中文乱码问题处理;2.就是我从数据库里读取一条记录,也是登陆,判断是否正确,正确就进入welcome.jsp页,否则进入错误页.我的记录是先得:name,pass,email,开始我用不着name,用了pass和email,用完之后,我直接输出name的值就是null了,你试着第一次在接收数据库记录的值时,就用变量把它们各自都赋过去,然后再用这些变量.
      

  7.   

    8 楼的我解释下
    1.。的意思是说数据提交的时候在过滤器里面取出的时候就有可能变成乱码不是中文,和数据库比较的时候就不对了。
    2.。。的意思的resultset的值只能循环一次,先用后面的前面的就变成null了。这点好像关系不大。
      

  8.   

    看了你的servlet 中处理的过程,好象是没有做中文转化处理.页面你输入了  "员工"这个中文,servlet 没做中文处理,
    给你个中文处理类,你调用下应该就可以了.
    public class Dbconver {
    public String cvert(String s){
    try{
    return new String (s.getBytes("ISO-8859-1"),"GB2312");
    }catch(Exception e){
    return null;
    }
    }
    }
      

  9.   

    //如果是提交登录信息,则对用户进行验证
    String name=httpReq.getParameter("name");
    String password=httpReq.getParameter("password");
    估計是这里出现乱码,你答应这两个参数出来看看是否有乱码
      

  10.   

    我用的是MYSQL6.0啊~~~~~~在my.ini中default-character-set=gbk就直接是这样的!还会有中文问题么?
    而且我把数据库内容改成英文后,输入数据库中保存的name和password时,
    IE会报错:HTTP Status 404 - /workProject/${requestScope.origin_uri}请问这是怎么回事?
    EL表达式也能产生这样的问题?
      

  11.   

    和数据库没关系.不是数据库里的做中文转化.而是前台输入的text.
    是你前台输入的中文  as 数据库中的中文  比较 
    前台中文在后台得到的时候要做下中文转换,然后再比较.
    这网站上关于这个问题的人都很多的.
      

  12.   


    index 是从 1 开始的  不是从0开始
      
     LZ你把数据库操作完的来的值打印出来看看,看是否查询成功了!!  还有你的select 语句,看看有没有问题!!  我估计是  ‘员工’是中文 传进去后变成乱码了!!
      

  13.   

     if("login".equals(strLogin))
                {
                    //如果是提交登录信息,则对用户进行验证
                    String name=httpReq.getParameter("name");
                    String password=httpReq.getParameter("password");
                    UserBean user=new UserBean(name,password);
                    UserCheckBean uc=new UserCheckBean(user);
    其中
     String name=httpReq.getParameter("name");
    改为
     String name=new String(httpReq.getParameter("name").getBytes("ISO-8859-1"),"GB2312");
    试下看看
     
    还有你把数据库的'员工'改为不是中文 登陆下 看看行不行!
      

  14.   

    应该就是中文问题~~~~~~请看15楼~~~~~
    HTTP Status 404 - /workProject/${requestScope.origin_uri} 请问这是怎么回事? 
    EL表达式也能产生这样的问题?输入数据库中内容,会产生以上IE错误~~~~~找不到EL表达式!一般都是什么原因啊?谢谢!
      

  15.   

    请把登陆的JSP页面代码 发上!!!
      

  16.   

    大概看了下   像了应该是你的用户名是中文的吧    可能有问题  你该成 yuangong  123 登陆试一下!
      

  17.   

    <input type="hidden" name="origin_uri" value="${requestScope.origin_uri}">
    origin_uri 刚定义的变量没有值,怎么把没值的赋值? 
      

  18.   

    再看了下你的代码,楼主 你是把origin_uri值从后台传前台的,可是第一次打开登陆界面的时候,origin_uri的值是没有的,所以EL就会报错!
      

  19.   


    if(uc.validate())
    {
         //验证通过后,在Session对象中设置isLogin属性为true
         session.setAttribute("isLogin","true");
         //在session对象中保存用户名
          session.setAttribute("user",name);
                        
         //从请求对象中取出用户先前访问页面的URI
         String origin_uri=httpReq.getParameter("origin_uri");
         if(null!=origin_uri && !"".equals(origin_uri))
             httpResp.sendRedirect(origin_uri);  //重定向到用户先前访问页面
          else
             httpResp.sendRedirect(ctxPath+home_page);  //重定向到首页
              return;
    }
    这段代码代码不是进行判断了么?逻辑是:
    第一次登录origin_uri为空,提交后判断他为空,则进行跳转到其他页面啊!
      

  20.   

    跟终一下看看能不能从数据数里读邮信息来要是可以就作比较然后用response.sendRedirect("")传到你想要传的页面!
      

  21.   

    问题已经解决~~~~~~谢谢各位帮助~~~~~~数据库读不出来的问题各位已经帮我搞定了~~~~在这里谢谢大家!!!而HTTP Status 404 - /workProject/${requestScope.origin_uri} 
    报错问题是因为JSP不识别EL表达式的关系~~~~~
    在这里再次谢谢各位~~~~~马上结贴~~~~