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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值