posts - 23,comments - 12,trackbacks - 0
重定向请求

  下面我们来构造一个AuthenticationFilter过滤器,它的功能是截获对Controller Servlet的请求,然后验证用户的身份。按照前面介绍的步骤用向导创建过滤器时,向导提供了定义初始化参数、过滤器的URL和Servlet映射等参数。如果不设置这类参数,缺省情况下向导用过滤器本身的名称创建一个URL映射,我们将在下面用编辑web.xml文件的方式定义映射,因此现在先认可缺省值。注意,如果你想在链中使用一个以上的过滤器,那就必须手工编辑web.xml。

  在向导中点击“完成”按钮后,WSAD立即构造出过滤器的骨架代码。对于本例来说,接下来我们唯一的任务就是将代码插入doFilter()方法,如Listing 1所示。

// Listing 1: AuthenticationFilter.java

    public void doFilter(
        ServletRequest req,
        ServletResponse resp,
        FilterChain chain)
        throws ServletException, IOException {

        String nextPage;
        RequestDispatcher rd = null;
        //检查用户名称和密码
        if (req.getParameter("userid") != null) {
            if (!((req.getParameter("password").equals("password"))
                && (req.getParameter("userid").equals("user")))) {
                ArrayList actionreport = newArrayList();
                actionreport.add("登录失败。。。");
                (((HttpServletRequest) req).getSession()).setAttribute(
                    "actionreport", actionreport);

                nextPage = "failure.jsp";
                System.out.println("获得了来自过滤器的应答。");
                // 将请求直接传递给下一个页面(而不是Controller Servlet)
                rd = req.getRequestDispatcher(nextPage);
                rd.forward(req, resp);
            } else {
                req.setAttribute("login", "loginsuccess");
                // 将请求传递给Controller Servlet
                chain.doFilter(req, resp);
                System.out.println("获得了来自过滤器的应答。");
            }
        } else {
            rd = req.getRequestDispatcher("Welcome.jsp");
            rd.forward(req, resp);
        }
    }


  从上面的代码可以看出,在过滤器中验证用户身份的方式仍和平常的一样。在此过程中,为了获得session对象,我们把ServletRequest定型(cast)成了HttpServletRequest。如果用户未能通过身份验证,我们不再把请求传递给Controller Servlet,而是通过RequestDispatcher把请求传递给报告页面(failure.jsp)。

  如果用户通过了身份验证,则我们调用chain.doFilter(),允许应答进入Controller——这是因为调用chain.doFilter()时,链里面已经没有其他过滤器,所以控制将以POST方式转入作为Controller的Servlet,实际上,chain.doFilter()将调用Controller.doPost()方法。

  发送请求给Controller之前,我们可以根据用户获得的身份证书来设置请求的属性,这些信息将帮助Controller及其辅助类处理请求。作为一个例子,我们设置了请求的login属性,然后在Controller中检查该属性,Controller把应答返回给success.jsp(如Listing 2所示)。

// Listing 2: controller.java

protected final void doPost(
    HttpServletRequest request,
    HttpServletResponse response) {

    // begining codes
    //--用户已通过身份验证
    if (((String) request.getAttribute("login")).equals
       ("login success")) {
        ArrayList actionreport = new ArrayList();
        actionreport.add("Correct Password");
        session.setAttribute("actionreport", actionreport);
        nextPage = "success.jsp";
    }
    if (dispatch) {
        RequestDispatcher rd =
            getServletContext().getRequestDispatcher(nextPage);
        rd.forward(request, response);
    } else {

        session.invalidate();

    }
    // ending codes
}
posted on 2005-09-12 16:27 my java 阅读(3063) 评论(1)  编辑  收藏

FeedBack:
# re: AuthenticationFilter过滤器[未登录]
2014-11-10 17:27 | dd
ddddddddddddddd  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: