springmvc--拦截器
拦截器是高级的过滤器。
拦截器是 中央调度器 在适配器获取到处理器对象之后,执行处理器方法之前,先执行拦截器的方法。
(执行链的内容是 拦截器的 preHandle ,处理器方法,拦截器的postHandle,拦截器的afterCompletion,只有拦截器为真,后面的才会继续执行)
拦截器可以做用户登陆验证,用户权限验证,记录日志等
package ins.platform.interceptor; import java.io.BufferedReader; import java.io.IOException; import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.springframework.util.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import ins.platform.common.utils.XmlUtils; import ins.platform.common.vo.Constant; import ins.platform.common.vo.TRiskClassParam; import ins.platform.common.web.listener.RedisCache; import ins.platform.common.xmlvo.newinfoimport.response.CommonInportResponseXmlVo; import ins.platform.common.xmlvo.newinfoimport.response.ResponseBody; import net.sf.json.JSONObject; public class CommonImportInterceptor implements HandlerInterceptor{ private Logger logger = Logger.getLogger(this.getClass()); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.info("进入拦截器CommonImportInterceptor!"); String user = getUser(request); Boolean isValid = getRiskClassParam(user); if(!isValid){ buildResponse(response,"user无效,请联系管理员!"); } return isValid; } public String getUser(HttpServletRequest request) throws IOException { BufferedReader br = request.getReader(); String line; StringBuffer xmlVoSb = new StringBuffer(); try { while ((line = br.readLine()) != null) { xmlVoSb.append(line); } String xmlStr = xmlVoSb.toString(); if(!StringUtils.isEmpty(xmlStr)){ xmlStr = xmlStr.substring(xmlStr.indexOf("<User>")+ 6, xmlStr.indexOf("</User>")); if(!StringUtils.isEmpty(xmlStr)){ xmlStr = xmlStr.trim(); } logger.info("拦截器CommonImportInterceptor获取到报文中的user为:"+xmlStr); return xmlStr; } return ""; } catch (IOException e) { logger.error("拦截器CommonImportInterceptorxml IO 异常!"); throw e; } /*finally { br.close(); }*/ } private void buildResponse(HttpServletResponse response,String errorMessage) { CommonInportResponseXmlVo reponseVo = new CommonInportResponseXmlVo(); ResponseBody responseBody = new ResponseBody(); responseBody.setErrorMessage(errorMessage); reponseVo.setResponseBody(responseBody); try { response.setHeader("Content-Type", "application/xml;charset=GBK"); response.setCharacterEncoding("GBK"); String xml = XmlUtils.obj2Xml(CommonInportResponseXmlVo.class, reponseVo); response.getWriter().print(xml); response.getWriter().flush(); } catch (Exception e) { logger.error("拦截器CommonImportInterceptorxml回传失败!"); } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } private Boolean getRiskClassParam(String user) { String riskClassStr = String.valueOf(RedisCache.getRedisValue(Constant.CLASS_PARAM, user, false)); if (riskClassStr == null || "".equals(riskClassStr)) { logger.error("获取riskClassStr 异常"); return false; } JSONObject json = JSONObject.fromObject(riskClassStr); TRiskClassParam riskClassParam = null; try { riskClassParam = (TRiskClassParam) json.toBean(json, TRiskClassParam.class); } catch (Exception e) { logger.error("获取riskClassParam异常",e); return false; } if(riskClassParam == null) { logger.error("获取riskClassParam异常"); return false; } if(!"1".equals(riskClassParam.getState())){ logger.error("当前user无效,请联系管理员!"); return false; } Date endDate = riskClassParam.getEnddate(); if(endDate!=null){ if(endDate.getTime()<= new Date().getTime()){ logger.error("当前user所对应的险种不再提供服务的有效期内,请联系管理员!"); return false; } } return true; } } <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/Common/importinfo"/> <bean class="ins.platform.interceptor.CommonImportInterceptor"/> </mvc:interceptor> </mvc:interceptors>