拦截器创建,监控所有请求存入日志表

本文介绍如何在Spring MVC中配置自定义拦截器,并详细解释了拦截器类的实现细节,包括请求处理前后的操作、日志记录、参数清理等,确保应用程序的安全性和功能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、ApplicationContext-mvc.xml中加入自定义拦截器

<!--自定义的拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--path 是/api/get也可以/api/get/* 这样就拦截了前缀是/api/get的Controller-->
            <mvc:mapping path="/**"/>
            <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->
            <bean class="com.msunsoft.bph_sp.auditlog.listener.AuditLogInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

2、拦截器类

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.msunsoft.bph_sp.auditlog.bean.AuditLogRecord;
import com.msunsoft.bph_sp.auditlog.service.AuditLogRecordService;
import com.msunsoft.loginandlogout.entity.BdOrganizeEmployee;

public class AuditLogInterceptor implements HandlerInterceptor {
    private static final String   TAG = AuditLogInterceptor.class.getSimpleName();
    @Autowired
    private xx xx;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        // 从 HTTP 头中取得 Referer 值
        //        String YuMing = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
        //        + request.getContextPath() + "/";
        System.out.println("getScheme:" + request.getScheme());
        //        System.out.println("getContextPath:"+request.getContextPath());
        //        System.out.println("getServerPort:"+request.getServerPort());
        System.out.println("getServerName:" + request.getServerName());
        String referer = request.getHeader("Referer");
        // 判断 Referer 是否以 bank.example 开头

        //        startWith(referer, YuMing);
        if (referer != null && !referer.trim().contains("login.action")) {
            if (!(referer.trim().contains(request.getServerName()))) {
                request.getRequestDispatcher("error.jsp").forward(request, response);
                return false;
            }
        }
        HttpSession session = request.getSession();
        if (session != null) {
            if (session.getAttribute("userObject") != null) {
                xx userObject = (xx) session
                        .getAttribute("xx");
                AuditLogRecord auditLogRecord = new AuditLogRecord();
                auditLogRecord.setId(UUID.randomUUID().toString().replace("-", ""));
                auditLogRecord.setUserName(userObject.getUserName());
                auditLogRecord.setOrgCode(userObject.getGbcode());
                auditLogRecord.setName(userObject.getName());
                SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                auditLogRecord.setExecutionTime(sf.format(new Date()));
                auditLogRecord.setExecutionMethod(request.getServletPath());
                auditLogRecord.setExecutionResult(String.valueOf(response.getStatus()));
                auditLogRecordService.insertAuditLogRecord(auditLogRecord);
            }
        }
        Enumeration<String> names = request.getParameterNames();
        while (names.hasMoreElements()) {
            String name = names.nextElement();
            String[] values = request.getParameterValues(name);
            for (String value : values) {
                value = clearXss(value);
            }
        }
        return true;
    }

    @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 startWith(String referer, String YuMing) {
        if (referer != null) {
            if (referer.trim().startsWith(YuMing)) {
                return true;
            } else {
                return false;
            }
        }
        return false;
    }

    /**
     * 处理字符转义
     *
     * @param value
     * @return
     */
    private String clearXss(String value) {
        if (value == null || "".equals(value)) {
            return value;
        }
        value = value.replaceAll("<", "<").replaceAll(">", ">");
        value = value.replaceAll("\\(", "(").replace("\\)", ")");
        value = value.replaceAll("'", "'");
        value = value.replaceAll("eval\\((.*)\\)", "");
        value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
        value = value.replace("script", "");
        return value;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值