一个全局控制的监听器

来源:互联网 发布:不成乎名 编辑:程序博客网 时间:2024/05/01 21:10

一个全局控制的监听器

       是否曾经想过要实现这样的网站功能:只有用户成功登陆系统以后,才可以访问网站的各个页面,如果用户通过输入网页的url直接访问网站的页面,则跳转到一个公共的错误页面,在这个页面中,提示用户这种访问操作是非法的。

要实现这个功能,你只需要在用户登录以后,将用户的用户名和密码保存到session中。当用户打开任何一个页面的时候,你只需要判断是否曾经保存过用户名和密码,如果曾经保存过,则说明用户是合法登陆用户,否则用户是非法访问用户。要是这么处理的话,虽然原理比较简单,但是操作起来有一定的难度,如果网站中有成百上千个网页,我们需要在每个网页中嵌入判断session中是否有用户名和密码的代码。则无疑增加了编程的复杂性,也加大了维护程序的复杂性。我们如果能够通过一个监听器来处理的话,问题就会变得简单的多。这个案例相对来说不是很简单,我们只是在下面简单的说明一下编程步骤和方法,具体描述略。

第一步,添加若干页面:

n         index.jsp:网站首页,提供用户登录的页面,需要有包含用户名和密码的表单。

n         检查用户名和密码是否合法的servlet,取名为checklogin

n         main.jsp:用户登录成功以后,要显示的主页面,其中包含连接到子板块:文章板块(wenzhang.jsp)和论坛板块(bbs.jsp)的超链接

n         wenzhang.jspbbs.jsp

第二步:编写封装用户类的JavaBean(userName,password)User.java

第三步,访问数据库,验证用户合法性的代码db.java

package test;

import java.sql.*;

import java.util.*;

 

public class db {

  Connection conn=null;

  public db(String dbName) throws Exception

  {

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //设置数据库连接字符串

    String strCon = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=" +

        dbName;

    //直接连接方式,连接数据库

     conn = java.sql.DriverManager.getConnection(strCon, "", "");

  }

  public boolean isUserOK(User u) throws Exception {

    String sql="select count(*) from 用户表 where 用户名=? and 密码=?";

    PreparedStatement ps=conn.prepareStatement(sql);

    ps.setString(1,u.getUserName());

    ps.setString(2,u.getUserName());

    ResultSet rs=ps.executeQuery();

    rs.next();

    int i=rs.getInt(1);

    rs.close();

    ps.close();

    if(i>0)

      return true;

    else

      return false;

  }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第四步,编写servlet,验证用户,实现跳转:

  public void doGet(HttpServletRequest request, HttpServletResponse response) throws

      ServletException, IOException {

    PrintWriter out=response.getWriter();

    String name=request.getParameter("name");

    String pwd=request.getParameter("pwd");

    User u=new User();

    u.setUserName(name);

    u.setPassword(pwd);

    String dbName=this.getServletContext().getRealPath("goods.mdb");

    HttpSession session=request.getSession();

    try {

      db d1 = new db(dbName);

      if(d1.isUserOK(u))

      {

        session.setAttribute("Name",name);

        session.setAttribute("Password",pwd);

      }

      response.sendRedirect("main.jsp");

    }

    catch (Exception ex) {

      out.println(ex.getMessage());

    }

  }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第五步:编写listener,防止用户非法访问网页,见mylistener.java

 

public void doFilter(ServletRequest request, ServletResponse response,

                       FilterChain filterChain) {

    try {

      HttpServletRequest req=(HttpServletRequest)request;

      HttpSession session=req.getSession();

      if(session.getAttribute("Name")==null | session.getAttribute("Password")==null)

      {

        //继续判断是否是首页,因为刚进首页的时候,session中一定没有保存用户名和密码信息

        //另外在checklogin之前,session中也没有用户名和密码信息

        String url=req.getRequestURL().toString();

        if(!(url.endsWith("index.jsp")|url.endsWith("checklogin")|url.endsWith("/")|url.endsWith("error.jsp")))

        {

          System.out.println(url);

          ((HttpServletResponse)response).sendRedirect("error.jsp");

          return;

        }

      }

 

      filterChain.doFilter(request, response);

    }

    catch (ServletException sx) {

      filterConfig.getServletContext().log(sx.getMessage());

    }

    catch (IOException iox) {

      filterConfig.getServletContext().log(iox.getMessage());

    }

  }

原创粉丝点击