SpringMVC Interceptor 配置由简单到复杂及相关异常解决办法,记录用户操作日志

来源:互联网 发布:luajit mac 编辑:程序博客网 时间:2024/06/01 08:58
SpringMVC 配置Interceptor主要是配置spring-mvc.xml配置文件
首先说一下,Interceptor简单的使用,要是不做什么复杂的事情,Interceptor使用确实很简单。
定义一个类如下:
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class LogInterceptor implements HandlerInterceptor {
private static final Logger logger = Logger.getLogger(LogInterceptor.class);


public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HandlerMethod method = (HandlerMethod) handler; 
logger.error("请求方法开始:" + method.getMethod().getName());
// logger.error("请求方法开始:");
return true;
}

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.error("请求方法结束");
}

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

}
}

在spring-mvc.xml配置文件中添加
这就Ok了,这是比较简单的。
你看到我的类名叫LogInterceptor所有说我想做用户操作的日志记录,接下来说点常用又复杂的,
我是通过注解反射的方式做日志记录的例如
@RequestMapping(params = "login",method = RequestMethod.POST)
@ResponseBody
@Action(description="登录系统")
public Json login(String userName, String pwd, HttpSession session, HttpServletRequest request){
做一些业务处理...省略
}

在interceptor中获得请求的方法的Method的对象,通过反射就可以获得@Action(description="登录系统")中描述信息"登陆系统",在将信息插入到数据库 ,这几实现了用户操作的日志记录,
那么和拦截器有什么关系呢,下面来介绍,
在拦截器中有两种方式获得Method的对象
方式一:通过request获得请求的方法method,在获得请求的Controller类,通过类获得Method[]数组,遍历数据与获得的请求方法method进行比较,判断是否相等,如果相等在通过反射,做上面记录日志的操作。这种方法比较麻烦,而且影响性能。
方法二:那就是通过interceptor中handler直接获得Method对象。

第二种方式是非常实用的,我就着重说明第二种方式的说明
我的LogInterceptor中已经进行的强制类型转换的操作(我的配置文件已经配置好了,你们没有配置的话话,会出现异常),如果没有配置spring-mvc.xml会出现
com.surpass.business.usermanager.controller.UserController cannot be cast to org.springframework.web.method.HandlerMethod
异常中UserController是我请求的目标类。
不要担心,解决办法马上奉上,配置文件spring-mvc.xml中添加
运行,成功了...不要开心的太早,好戏还在后面,
如果的Controller中有@ResponseBody的响应数据的方式,并且返回的是Json格式的对象或是你的配置文件中有如下的配置
text/html;charset=UTF-8
这两个的配置就是将@ResponseBody响应的对象转为Json的格式的字符串对象在给前台。
如果有上述两种配置,那么会出现有的请求没有响应,前后台不报错、或是interceptor的postHandle方法不执行,在填上一条配置
       
   
此配置,保证Object转为Json格式字符串时,出现异常会打印到控制台,但是我解决这个问题时,是通过fireDebug我请求后发现没有响应,于是我看了一下响应的数据,原本应该是Json格式的数据却变成了

HTTP Status 406 -


type Status report

message

description
The resource identified by this request is only capable of generating responses with characteristics not a
cceptable according to the request "accept" headers.<</font>
/p>

Apache Tomcat/7.0.53

不要看他有多长,其实有用的部分就是黑色的部分(这个异常其实就是spring mvc 406 not acceptable,网上相关文章挺多的)。
去网上一查,找到了解决的办法,就是在配置文件中添加
我的配置文件中原来没有此配置,这就完全搞定了。
一切就运行的通常无阻了!!!!!

上面说的比较散  主要是为了方便理解
下面是spring-mvc.xml完成的配置,解决Spring Interceptor Json 相关问题的配置。只要你的SpringMVC没哟使用什么特殊的类,监听器或是其他的工具,这套配置基本上都满足!
    
<?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">


<!-- 配置1: 自动扫描controller包下的所有类,使其认为spring mvc的控制器 
<context:component-scan base-package="com.surpass" resource-pattern="com.surpass..controller.*Controller" />
-->
<context:component-scan base-package="com.surpass" >
   <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository" />
  </context:component-scan> 


<!-- 配置2: 避免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>
 
<!-- 配置3: 保证interceptor中通过handler获得请求的method对象  -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" p:ignoreDefaultModelOnRedirect="true">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" />
</list>
</property>
</bean>  



<!-- 配:5:对模型视图名称的解析,即在模型视图名称添加前后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/" p:suffix=".jsp" />


<!-- 配置6: 配置Spring自带文件上传操作类 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding">
<value>UTF-8</value>
</property>
<property name="maxUploadSize">
<value>32505856</value><!-- 上传文件大小限制为31M,31*1024*1024 -->
</property>
<property name="maxInMemorySize">
<value>4096</value>
</property>
</bean>

<!-- 配置7:拦截器  -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*.do" />
<bean class="com.surpass.system.interceptors.LogInterceptor" />
</mvc:interceptor>
</mvc:interceptors>


</beans>
0 0
原创粉丝点击