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>
原文地址:https://www.cnblogs.com/llq1214/p/11593568.html