spring mvc基础篇(六):Spring mvc之拦截器

6.1简介

拦截器:为了为某些特殊请求提供特殊功能,spring mvc为映射处理器提供了拦截器支持。它的配置文件很简单:一是把拦截器类纳入spring容器管理,二是在映射处理器引入配置的拦截器bean。

 

6.2 开发环境

开发工具:myeclipse8.6.1

数据库:mysql5.5.23

服务器: tomcat6.0.37

框架版本: spring3.2.2

 

6.3 案例开发步骤

案例说明:假定某*网站,只在早上八点和下午六点时间段内开放登录,其它时间不开放登录。

步骤一:在myeclipse8.6中新建web工程springmvc06,拷贝如下包到lib目下:

 spring mvc基础篇(六):Spring mvc之拦截器

步骤二:编写web.xml 配置文件,代码如下:

=================================web.xml========================

<?xmlversion="1.0" encoding="UTF-8"?>

<web-appversion="2.4" 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">

 

<!-- 配置spring的字符集过滤 -->

  <filter>

    <filter-name>encode</filter-name>

    <filter-class>org.springframework.web.filter

.CharacterEncodingFilter</filter-class>

    <init-param>

      <param-name>encoding</param-name>

      <param-value>UTF-8</param-value>

    </init-param>

    <init-param>

         <param-name>forceEncoding</param-name>

         <param-value>true</param-value>

    </init-param>

  </filter>

  <filter-mapping>

    <filter-name>encode</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

<servlet>

<servlet-name>springmvc</servlet-name>

<servlet-class>

org.springframework.web.servlet.DispatcherServlet

</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>springmvc</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

</web-app>

================================================================

 

步骤三:建立Login.jsp,如下所示:

=========================Login.jsp==============================

<body>

<div id="show">

<c:if test="${not empty requestScope.msg}">

    <h2>请注意:${requestScope.msg}</h2>

</c:if>

<form action="Login.do"method="post">

    <table border="1px" cellpadding="0">

       <tr><td>请输入用户名:</td><td><input type="text"name="userName" /></td></tr>

       <tr><td>请输入密码:</td><td><input type="password"name="passWord" /></td></tr>

       <tr><td colspan="2"><input type="submit" value="提交" /></td></tr>

    </table>

</form>

</div>

</body>

=====================================================================

 

步骤四:在com.wx.controls包下面编写控制器LoginControl.java,如下:

==========================LoginControl.java==========================

public class LoginControlimplements Controller{

    public ModelAndView handleRequest(HttpServletRequest request,

           HttpServletResponseresponse) throws Exception {

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

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

       ModelAndView mov=null;

       if(userName.equals("jack") &&passWord.equals("123")){

           mov=new ModelAndView("index");

       }else{

           mov=new ModelAndView("Login");

       }

       mov.addObject("userName", userName);

       mov.addObject("passWord", passWord);

       return mov;

    }

}

==================================================================

 

步骤五:在com.wx.interceptors包下面编写拦截器LoginTimeInterceptor.java,

如下:

==================LoginTimeInterceptor.java======================

public class LoginTimeInterceptor extends HandlerInterceptorAdapter {

    private int startTime;

    private int endTime;

    //依赖注入,请看配置文件

    public void setStartTime(int startTime) {

       this.startTime = startTime;

    }

 

    public void setEndTime(int endTime) {

       this.endTime = endTime;

    }

    //在控制器执行前调用

    public boolean preHandle(HttpServletRequest request,

           HttpServletResponse response, Object handler) throws Exception {

       System.out.println("执行preHandle方法-->01");

       Calendar cal = Calendar.getInstance();

       //获得当前时间对应的小时数,例如:12:05-->12,13:15-->13

       int hour = cal.get(Calendar.HOUR_OF_DAY);

       if (startTime <= hour && hour < endTime) {

           return true//通过拦截器,继续执行请求

       } else {//给定的时间之外禁止登录

           request.setAttribute("msg", "非登录时段");

           request.getRequestDispatcher("Login.jsp").forward(request,response);

           return false//没有通过拦截器,返回登录页面

       }

    }

    //在后端控制器执行后调用

    public void postHandle(HttpServletRequest request,

           HttpServletResponse response, Object handler,

           ModelAndView modelAndView)throws Exception {

       System.out.println("执行postHandle方法-->02");

       super.postHandle(request, response, handler, modelAndView);

    }

    //整个请求执行完成后调用

    public void afterCompletion(HttpServletRequest request,

           HttpServletResponse response, Object handler, Exceptionex)

           throws Exception {

       System.out.println("执行afterCompletion方法-->03");

       super.afterCompletion(request, response, handler, ex);

    }

   

}

==================================================================

知识讲解:此拦截器作用:如果用户没有在8-18点登录,则重定向到登录页面。注意:

(1)拦截器必须继承HandlerInterceptorAdapter类

(2)preHandle方法在后端控制器执行前被调用,postHandle方法在后端

控制器执行后被调用;afterCompletion方法在整个请求处理完成后被调用。

(3) preHandle方法:返回true,映射处理器执行链将继续执行;当返回false时,DispatcherServlet处理器认为拦截器已经处理完了请求,而不

继续执行执行链中的其它拦截器和处理器。它的API文档解释如下:true if the execution chainshould proceed with the next interceptor or the handler itself. Else,DispatcherServlet assumes that this interceptor has already dealt with theresponse itself.

(4)这三个方法都是相同的参数,Object handler参数可以转化成一个后端控制器对象,比如这里可以转换成LoginControl对象。

 

步骤六:在核心配置文件springmvc-servlet.xml里面完善如下配置

======================== springmvc-servlet.xml=======================

<beans>

    <!-- 给由控制器返回的视图名加前缀和后缀 -->

    <bean id="resourceView"

       class="org.springframework.web.servlet.view.InternalResourceViewResolver">

       <property name="prefix" value="/"></property>

       <property name="suffix"value=".jsp"></property>

    </bean>

    <bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

       <property name="interceptors">

           <list>

              <ref bean="workTimeInterceptor"/>

           </list>

       </property>

       <property name="mappings">

           <props>

              <prop key="/Login.do">loginControl</prop>

           </props>

       </property>

    </bean>

   

    <bean id="loginControl" class="com.wx.controls.LoginControl"></bean>

    <bean id="workTimeInterceptor" class="com.wx.interceptors.LoginTimeInterceptor">

       <property name="startTime" value="8"></property>

       <property name="endTime"value="18"></property>

    </bean>

</beans> ====================================================================

知识讲解:注意这段代码【<property name="interceptors">是为了给【/Login.do】请求添加拦截器。然后【<ref bean="workTimeInterceptor"/>】表示要引用下面的拦截器bean。

 

步骤七:在webroot目录下建立index.jsp

================================index.jsp=======================

<body>

<h1>登录成功,欢迎您:${requestScope.userName }</h1>

</body>

==================================================================

步骤八: 启动tomcat,发布项目,在地址栏输入 http://localhost:8080/springmvc06/Login.jsp 进行测试,得到结果:

 spring mvc基础篇(六):Spring mvc之拦截器