springmvc拦截404错误

继承DispatcherServlet覆盖noHandlerFound方法

#### web.xml

 <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>com.peppa.crm.web.manage.common.CrmDispatchServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/mvc-dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

#### 代码

import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.peppa.crm.web.manage.controller.CommonController;
import com.peppa.crm.web.manage.viewmodel.Response;
import com.peppa.domain.dto.EmployeeDto;
import com.peppa.domain.enums.SystemNoticeTypeEnum;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @program: 404错误拦截并记录
 * @description:
 * @author: zhoupengfei
 * @create: 2019-05-28 16:17
 **/
public class CrmDispatchServlet extends DispatcherServlet {
    protected static final Logger logger = LoggerFactory.getLogger(CrmDispatchServlet.class);
    /**图片忽略**/
    public static final String[] ignoreUrl={"favicon.ico","unauthorized"};

    public static final String crmVersion="crmVersion";
    public static final String logout="logout";

    @Override
    public void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //忽略的url
        for(String ignore:ignoreUrl){
            if(request.getRequestURL().toString().contains(ignore)){
                super.noHandlerFound(request,response);
                return;
            }
        }
        //获取客户端版本
        int clientVersion=0;
        String v=getRequestVersion(request);
        if(StringUtils.isNotEmpty(v)){
            clientVersion=Integer.parseInt(v);
        }
        Subject subject = SecurityUtils.getSubject();
        Session session=subject.getSession();
        EmployeeDto employeeDto= (EmployeeDto) session.getAttribute("CurrentUser");
        if(clientVersion<CommonController.crmVersion){
            //版本判断
            if(employeeDto!=null){
                HashMap<String,Object> param=new HashMap<>(8);
                param.put("bizType", SystemNoticeTypeEnum.WS_GO_URL.getValue());
                List<Integer> userIdList=new ArrayList();
                userIdList.add(employeeDto.getId());
                param.put("ids", userIdList);
                if(CommonController.crmVersion-clientVersion>1){
                    //中间有多个版本暂时直接退出
                    param.put("msg",logout);
                }else{
                    param.put("msg",CommonController.versionAction);
                }
                HttpRequest.post("http://"+CommonController.wsServerUrl+"/pushMsgController/pushMsg")
                        .body(JSON.toJSONString(param))
                        .execute();
            }
        }
        StringBuffer log=new StringBuffer("资源不存在url="+request.getRequestURL());
        if(employeeDto!=null){
            log.append(",用户Id="+employeeDto.getId());
        }
        logger.error(log.toString());
        Response r=new Response();
        r.failure("您访问的资源不存在,url="+request.getRequestURL()+",请退出重新登录.").code(HttpStatus.NOT_FOUND.value());
        response.setContentType("application/json;charset=utf-8");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setContentType("application/json");
        response.getWriter().print(JSON.toJSONString(r));
    }

    /**
     * 获取请求的版本
     */
    private String getRequestVersion(HttpServletRequest httpRequest) {
        //从header中获取token
        String version = httpRequest.getHeader(crmVersion);

        //如果header中不存在token,则从参数中获取token
        if (StringUtils.isEmpty(version)) {
            version = httpRequest.getParameter(crmVersion);
        }
        if (StringUtils.isEmpty(version)) {
            //获取cookie数组
            Cookie[] cookies = httpRequest.getCookies();
            if (cookies == null) {
                return null;
            }
            //遍历cookie数组
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals(crmVersion)) {
                    version = cookie.getValue();
                    break;
                }
            }
        }
        return version;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值