MVC用户认证web应用部分四

ControlServlet继承了HttpServlet,并对其dopost方法进行了重写。我们分析一下这个重写的dopost()方法。
首先login.jsp表单的结果是由CheckServlet来处理的,action用来存储处理的信息,我们可以知道如果该用户是非法的,那么action就会被赋值out,如果用户是合法的,我们通过对CheckServlet的了解知道,页面被重新定向到index.jsp,我们看一下index.jsp的代码,注意到有这么一段<c:if test="${!empty user.userName}">
   <p><b>${user.userName}</b> 用户,您好,您已经登陆本站!&nbsp;</p>
呵呵,可以知道此时的action的值为默认的null
那么可以很明白的知道下一步肯定就是对action值的判断,没错!
从ControlServlet的dopost方法可以看出,如果action的值是null那么页面转发至index.jsp页面即回到首页显示“用户,您好,您已经登陆本站!”;如果action的值是out那么页面转发至login.jsp要求用户重新登陆。

这样我们就基本上掌握了这个简单的MVC模式的用户认证实例了。

呵呵,或许还有朋友会问,我们设置的welcome-file是index.jsp啊,为什么事实上我们一开始进入的是login.jsp呢?
呵呵,很细心哪,其实我们还漏了一个很重要的东西!
对了,就是Filter(过滤器技术),这个可是Servlet2.3新增的功能哪!很重要的!千万别把它和servlet混为一谈哦!
它的作用是:在Request到达Servlet和JSP之前进行预处理,或者在离开Servlet或JSP时处理返回给客户端的Response。呵呵,很难懂?没事,通过下面的分析或许会有个感性的认识。

通过上面的理解我们知道这个应用的Request请求主要是"user",要知道电脑的速度是很快的,我们刚访问我们的应用的时候确实是先进入的index.jsp而且这个时候生成的request,在这个request被传递到servlet或Jsp之前的时候神奇的恶filter出现了,它拦截了Request,并通过getRequestURI()方法获取该Request将要传递的目的地,而且通过httpRequest.getSession().getAttribute("user")方法获得session变量的值,并将该值强制转换为UserBean的一个实例。下面就是判断过程了。
如果这个实例是空的话,分两种情况讨论:
1,若这个request的目的地与login.jsp或者checkservlet或者reg.jsp有关的话那么就让这个request该区哪儿去哪儿。否则的话就把它强制传递到login.jsp。想想也对,如果request中的user的值为空的话,那么就说明我们还没有登陆,下一步肯定是要去login.jsp的。
2,如果这个request中已经包含"user",根据我们上面的思路则认为已经合法登陆,所以filter也不会插手这个request,爱去哪儿就去哪儿。
而我们的实际情况是:我们第一访问这个应用的时候都是还没有登陆的。所以虽然我们设定的welcome-file是index.jsp可是我们还是要进入login.jsp进行登陆的。而filter就帮助我们解决了这个问题。因为计算机的速度问题,我们是察觉不到刚开始时的页面是index.jsp。除非我们的机器慢得像蜗牛一样!呵呵!所以呢,我们一下子就进入了login.jsp。这个就是filter的作用啦!

明白了吧?
呵呵我们给这个filter取名为:LoginFilter.java
----------------------------------------------------------
LoginFilter.java
----------------------------------------------------------
package com.teach.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import com.teach.bean.*;

/*
过滤器servlet 用于判断用户是否登陆成功
*/

public class LoginFilter extends HttpServlet implements Filter {

 private static final long serialVersionUID = 1L; //为保持版本兼容性附给对象的唯一标识符
 
 //private FilterConfig filterConfig;
   
 public void init(FilterConfig filterConfig) throws ServletException {
        //this.filterConfig = filterConfig;
    }
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain filterChain) {
          HttpServletRequest httpRequest=(HttpServletRequest)request;
                HttpServletResponse httpResponse=(HttpServletResponse)response;
                try
                {
                   request.setCharacterEncoding("GBK");
                   String url= httpRequest.getRequestURI();

                   UserBean ub=(UserBean)(httpRequest.getSession().getAttribute("user"));
                   if(ub==null)
                   {

                       if(url.indexOf("login.jsp")!=-1||url.indexOf("checkservlet")!=-1||url.indexOf("reg.jsp")!=-1||url.indexOf("regservlet")!=-1)
                       {
                           filterChain.doFilter(httpRequest, response);

                       }else
                       {
                            httpResponse.sendRedirect("login.jsp");
                       }
                   }else
                    filterChain.doFilter(httpRequest, httpResponse);
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }

    }
    public void destroy() {}
}

----------------------------------------------------------
大家觉得这个filter是不是很酷呢!
呵呵!


如果我们是这个web应用的管理员或者说是开发者,我们很想知道用户每次对我们的页面进行访问请求时的情况,比如说请求的地址,请求的时间,请求被执行的时间,和关于这次请求的报告。这对于开发者或者管理者是很重要的!

呵呵,这个时候我们可爱的filter又起作用了
我们可以编写一个日志Filter。来记录我们这个用户认证应用的访问情况。命名为:LogFilter.java
----------------------------------------------------------
LogFilter.java
----------------------------------------------------------
package com.teach.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.Date;

public class LogFilter  extends HttpServlet implements Filter {

 private static final long serialVersionUID = 1L; //为保持版本兼容性附给对象的唯一标识符

 FilterConfig filterConfig;
 public void setFilterConfig(FilterConfig filterConfig) {
  this.filterConfig = filterConfig;
 }
 public FilterConfig getFilterConfig() {
  return filterConfig;
 }
 public void init(FilterConfig filterConfig) throws ServletException  //初始化
 {
  setFilterConfig(filterConfig);
 }
 
 
// 日志过滤器的doFilter方法
 public void doFilter(ServletRequest request, ServletResponse response,
                          FilterChain filterChain)throws ServletException,IOException
 {
  HttpServletRequest httpRequest=(HttpServletRequest)request; //获得HTTP请求的对象
  ServletContext context = getFilterConfig().getServletContext(); //获得过滤器配置环境
  String filterName = getFilterConfig().getFilterName();  //获得过滤器的名字
  long bef = System.currentTimeMillis();
  filterChain.doFilter(request,response);
  long aft = System.currentTimeMillis();
  context.log(httpRequest.getRemoteHost() +"请求地址"
   +httpRequest.getRequestURL() +"在" + new Date() + ",执行时间:" +(aft-bef)
   +" (" +filterName + "报告.)");
 }

}
----------------------------------------------------------

至此我们的MVC用户认证的简单应用就算是告一段落了!
是不是觉得这个实例确实用到了很多东西呢?
呵呵,麻雀虽小五脏俱全!
哦,忘了,我把这个应用的web.xml方出来吧。因为eclipse好像是不支持<filter>和</filter-mapping>标签的,所以用我的那套运行环境的话,eclipse自己写的web.xml是不含有<filter>和</filter-mapping>标签的。
----------------------------------------------------------
web.xml
----------------------------------------------------------
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"  version="2.4">
 <description>teach</description>
 
  <filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.teach.servlet.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
 <filter-name>Logger</filter-name>
 <filter-class>com.teach.servlet.LogFilter</filter-class>
  </filter>
  <filter-mapping>
 <filter-name>Logger</filter-name>
 <url-pattern>/*</url-pattern>
  </filter-mapping>
   
   <servlet>
      <servlet-name>CheckServlet</servlet-name>
      <servlet-class>com.teach.servlet.CheckServlet</servlet-class>
   </servlet>
  <servlet>
    <servlet-name>PageControl</servlet-name>
    <servlet-class>com.teach.servlet.ControlServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>CheckServlet</servlet-name>
    <url-pattern>/checkservlet</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>PageControl</servlet-name>
    <url-pattern>/pagecontrol</url-pattern>
  </servlet-mapping>

    <welcome-file-list>
 <welcome-file>
     index.jsp
 </welcome-file>
    </welcome-file-list>
</web-app>
----------------------------------------------------------
这样的话,运行就应该没问题了,虽然在我的运行环境下tomcat服务器仍然会报严重的异常不过,这个好像是服务器的问题,程序应该是没问题的,至于异常的解决办法以后明白了会给大家写出来的。如果大家没有我这样的运行环境的话,也没关系,我已经把这个应用打包成了islan5.war文件包。只要大家电脑上有tomcat5.5版本的服务器(其他版本的我还没试验过),只要把这个包放在webapps文件夹下,启动tomcat服务器输入http://localhost:8080/island5/
就可以运行了,当然,前面的建立数据库仍然是必要的!呵呵!
这个包可以去我的个人空间的资源里下载。

http://download.csdn.net/source/243827#

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值