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目下:
步骤二:编写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 进行测试,得到结果: