这几天在学Spring MVC,于是也学了点Spring拦截器。本来想通过拦截器截取response对象中用户登录成功与否的状态。但发现response对象只做输出,所以得不到里面的值。于是就各种百度、GOOGLE。发现大多的方法都是放在Controller被调用之前,那样的确不错,但那样不符合我现在的情况。我需要的是仅仅在Controller调用之后。
然后自己调试了~~~发现应该很好取的。。没有网上讲的那么麻烦
直接看怎么做吧。。
CoyoteOutputStream os = (CoyoteOutputStream) response.getOutputStream();
先给出一个完整的代码
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.connector.CoyoteOutputStream;
import org.apache.catalina.connector.OutputBuffer;
import org.apache.tomcat.util.buf.ByteChunk;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class SecurityInterceptor implements HandlerInterceptor {
/**
* 方法执行成功之后回调的方法
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object obj, Exception exception)
throws Exception {
// 截取响应流
CoyoteOutputStream os = (CoyoteOutputStream) response.getOutputStream();
// 取到流对象对应的Class对象
Class<CoyoteOutputStream> c = CoyoteOutputStream.class;
// 取出流对象中的OutputBuffer对象,该对象记录响应到客户端的内容
Field fs = c.getDeclaredField("ob");
if (fs.getType().toString().endsWith("OutputBuffer")) {
fs.setAccessible(true);// 设置访问ob属性的权限
OutputBuffer ob = (OutputBuffer) fs.get(os);// 取出ob
Class<OutputBuffer> cc = OutputBuffer.class;
Field ff = cc.getDeclaredField("outputChunk");// 取到OutputBuffer中的输出流
ff.setAccessible(true);
if (ff.getType().toString().endsWith("ByteChunk")) {
ByteChunk bc = (ByteChunk) ff.get(ob);// 取到byte流
String val = new String(bc.getBytes(), "UTF-8");// 最终的值
System.out.println(val);
}
}
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object obj, ModelAndView mav)
throws Exception {
}
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object obj) throws Exception {
return true;
}
}
附:
要用到Tomcat中的包,我在Tomcat6.x中的libs目录找的。
tomcat-coyote.jar
catalina.jar
点击查看:org.apache.catalina.connector.CoyoteOutputStream
点击查看:org.apache.catalina.connector.OutputBuffer