重定向请求
下面我们来构造一个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 阅读(3085)
评论(1) 编辑 收藏