SpringMVC 拦截器HandlerInterceptorAdapter

<!-- 测试公共校验拦截器 -->
<mvc:interceptors>
	<mvc:interceptor>
		<mvc:mapping path="/crm/**"/>
		<mvc:exclude-mapping path="*/crm/resource/download,*/crm/home/homeInit"/>
		<bean class="com.test.interceptor.DemoInterceptor"/>
	</mvc:interceptor>
</mvc:interceptors>



import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.alibaba.fastjson.JSONObject;
import com.test.exception.DemoValidateException;
import com.test.common.PublicResponse;
import com.test.bean.UserInfo;
import com.test.service.CrmService;
/**
 * 测试公共校验拦截器
 */
public class DemoInterceptor extends HandlerInterceptorAdapter {
	private static final Log logger = LogFactory.getLog(DemoInterceptor.class);
    @Autowired
    private CrmService crmService;
	/**
	 * 在业务处理器处理请求之前被调用 
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		PrintWriter out=null;
		String logStr="DemoInterceptor.preHandle...";
		logger.info(logStr+"拦截器preHandle方法");
		try{
			UserInfo userInfo=crmService.validateMethod(request);
			logger.info(logStr+String.format("拦截校验通过:token=%s, servletPath=%s, uri=%s, url=%s", request.getHeader("TOKEN_KEY_NAME_DEMO"),request.getServletPath(),request.getRequestURI(),request.getRequestURL()));
			/*
			打印结果:
			 token=CEEADEC1C6591A84E08DCE54136608BC3, 
			 servletPath=,  //取不到
			 uri=/crm/stu/init, 
			 url=http://192.168.12.100:9898/crm/stu/init
			*/
			request.setAttribute("CRM_REQUEST_USERINFO_DEMO", userInfo);
			return true;
		}catch(DemoValidateException e){
    		logger.error(logStr+"公共校验异常");
    		PublicResponse rsp=new PublicResponse();
    		rsp.setRspCode(e.getCode());
    		rsp.setRspMsg(e.getMessage());
            response.setContentType("application/json");
            response.setCharacterEncoding("UTF-8");
    		out =  response.getWriter();
    		out.print(JSONObject.toJSONString(rsp));
    		logger.info(logStr+String.format("拦截校验未通过:token=%s, rsp=%s", request.getHeader("TOKEN_KEY_NAME_DEMO"),JSONObject.toJSONString(rsp)));
    		out.flush();
    	}finally {
			if(null!=out){
				out.close();
			}
		}
		return false;
	}

	/**
	 * 在业务处理器处理请求完成之后,生成视图之前执行 
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		String logStr="DemoInterceptor.postHandle...";
		logger.info(logStr+"拦截器postHandle方法");
		super.postHandle(request, response, handler, modelAndView);
	}
	/**
	 * 在DispatcherServlet完全处理完请求之后被调用,可用于清理资源
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		super.afterCompletion(request, response, handler, ex);
	}
	/**
	 * 处理异步请求(当Controller中有异步请求方法的时候会触发该方法)
	 */
	@Override
	public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		super.afterConcurrentHandlingStarted(request, response, handler);
	}

}


@RequestMapping(value = "/stu/init", method = RequestMethod.GET)
@ResponseBody
public PublicResponse testControllerMethod(final HttpServletRequest request, final HttpServletResponse response){
	PublicResponse rsp=new PublicResponse();
	//add code here
	try{
//从拦截器过来的request中获取UserInfo 
		UserInfo stu=(UserInfo)request.getAttribute("CRM_REQUEST_USERINFO_DEMO");
		logger.info(logStr+"测试stu="+stu.toString());
	}catch(Exception e){
		e.printStackTrace();
		logger.error("接口异常");
	}
	logger.info("接口响应rsp="+rsp.toString());
	return rsp;
}


参考博客:
-- SpringMvc中使用Interceptor与Filter的注意点
https://www.cnblogs.com/FlyHeLanMan/p/6640941.html

猜你喜欢

转载自franciswmf.iteye.com/blog/2409801