上一篇稳重中用了java servlet的过滤器Filter技术实现了(防止未登录访问的功能),在本篇文章中使用SpringMvc技术中的Springmvc的拦截器实现此功能:本文部分内容转自http://blog.csdn.net/tjcyjd/article/details/7498236
使用SpringMVC拦截器和Struts2一样,Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口。
HandlerInterceptor接口的代码如下:
package org.springframework.web.servlet;
import Javax.servlet.http.HttpServletRequest;
import Javax.servlet.http.HttpServletResponse;
public interface HandlerInterceptor {
// preHandle()方法在业务处理器处理请求之前被调用
boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler)
throws Exception;
// postHandle()方法在业务处理器处理请求之后被调用
void postHandle(
HttpServletRequest request, HttpServletResponse
response, Object
handler, ModelAndView modelAndView)
throws Exception;
// afterCompletion()方法在DispatcherServlet完全处理完请求后被调用
void afterCompletion(
HttpServletRequest request, HttpServletResponse
response, Object
handler, Exception ex)
throws Exception;
}
下面对代码中的三个方法进行解释。
preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回请求前被调用,在该方法中对用户请求request进行处理。
afterCompletion():这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
下面通过一个例子来说明如何使用SpringMVC框架的拦截器。
现在要编写一个拦截器,拦截所有不在工作时间的请求,把这些请求转发到一个特定的静态页面,而不对它们的请求进行处理。
java代码:package com.zh.util;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.zh.bean.admin.Admin;
public class SessionHandler extends HandlerInterceptorAdapter{
@Override
//重写preHandle()方法
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURI();
System.out.println(url);
boolean b1=!url.equals("/cpShop/admin/login.jsp");
boolean b2=url.substring(url.length()-3).equals(".do");
boolean b3=!url.substring(url.length()-13).equals("loginAdmin.do");
boolean b4=!url.substring(url.length()-4).equals(".jsp");
HttpSession session = request.getSession();
Admin admin = (Admin) session.getAttribute("admin");
if(b1&&b2&&b3&&b4){
if(admin == null){
System.out.println("8888888888");
response.sendRedirect("/cpShop/admin/login.jsp");
return false;
}else{
return true;
}
}else{
return true;
}
}
}
上面的代码重写了preHandle()
方法,该方法在业务处理器处理请求之前被调用。在该方法中,首先获得当前的时间,判断其是否在 openingTime和closingTime之间,如果在,返回true,这样才会调用业务控制器去处理该请求;否则直接转向一个页面,返回 false,这样该请求就不会被处理。
spring-mvc.xml配置文件:
<span style="color:#555555;"><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!-- 自动扫描controller包下的所有类,使其认为spring mvc的控制器 -->
<context:component-scan base-package="com.zh.controller" />
<!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" /><!-- json转换器 -->
</list>
</property>
</bean>
<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/" p:suffix=".jsp" />
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding">
<value>UTF-8</value>
</property>
<property name="maxUploadSize">
<value>104857600</value><!-- 上传文件大小限制为100M,100*1024*1024 -->
</property>
<property name="maxInMemorySize">
<value>4096</value>
</property>
</bean>
<!-- 自定义拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/admin/*"/>
</span><span style="color:#ffff99;"><bean class="com.zh.util.SessionHandler"></bean></span><span style="color:#555555;">
</mvc:interceptor>
</mvc:interceptors>
</beans></span>