微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SpringCloud中使用Filter进行记录获取用户请求行为日志

以下代码放在公共部分里,然后用其他模块去引用这个模块!!!

由于里面用到了数据库,在权限校验的情况下,不能进行验证,所以使用了原生jdbc的方式。

common-log:

maven:

<!--javax.servlet-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>

 

HttpRequestLogFilter: 

package cn.com.yusys.aiops.filter;

import cn.com.yusys.aiops.common.core.constant.CommonConstants;
import cn.com.yusys.aiops.jdbc.JdbcUtils;
import cn.com.yusys.aiops.upms.api.entity.HttpRequestLog;
import com.alibaba.fastjson.JSON;
import lombok.requiredArgsConstructor;
import org.springframework.core.Ordered;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.text.SimpleDateFormat;
import java.util.TimeZone;

/**
 * @author: wtl
 * @License: (C) copyright 2021, wtl Corporation Limited.
 * @Contact: 1050100468@qq.com
 * @Date: 2021/7/28 11:06
 * @Version: 1.0
 * @Description:
 */
@WebFilter(filterName="httpRequestLogFilter", urlPatterns="/*")
@requiredArgsConstructor
public class HttpRequestLogFilter implements Filter, Ordered {

    private final JdbcUtils jdbcUtils;

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, servletexception {
        try {
            ReWriteHttpServletRequestWrapper httpServletRequest = new ReWriteHttpServletRequestWrapper((HttpServletRequest) servletRequest);
            ReWriteHttpServletResponseWrapper httpServletResponse = new ReWriteHttpServletResponseWrapper((HttpServletResponse) servletResponse);
            filterChain.doFilter(httpServletRequest, httpServletResponse);

            if (!CommonConstants.REQUEST_LOG_SELF_URL_PATH.equalsIgnoreCase(httpServletRequest.getServletPath())){
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
                HttpRequestLog httpRequestLog = HttpRequestLog
                        .builder()
                        .ip(httpServletRequest.getRemoteAddr())
                        .module(httpServletRequest.getServletPath().split("/")[1])
                        .role(httpServletRequest.getRemoteUser())
                        .hostname(httpServletRequest.getRemoteHost())
                        .requestMethod(httpServletRequest.getmethod())
                        .queryParams(JSON.toJSONString(httpServletRequest.getParameterMap()))
                        .postBody(httpServletRequest.getBody())
                        .requestFullPath(httpServletRequest.getServletPath())
                        .httpRequestPath(httpServletRequest.getPathInfo())
                        .httpStatus(String.valueOf(httpServletResponse.getStatus()))
                        .responseBody(new String(httpServletResponse.getContent(), StandardCharsets.UTF_8))
                        .createDate(simpleDateFormat.format(System.currentTimeMillis()))
                        .build();

                //处理插入数据库
                Connection connection = jdbcUtils.getConnection();
                try {
                    PreparedStatement preparedStatement = connection.prepareStatement("insert into `HTTP_Request_log`(" +
                            "ip,module,role,hostname,request_method,query_params,post_body,request_full_path,HTTP_Request_path,http_status,response_body,create_date)  " +
                            " values (?,?,?,?,?,?,?,?,?,?,?,?)");

                    int index = 0;
                    preparedStatement.setString(++index,httpRequestLog.getIp());
                    preparedStatement.setString(++index,httpRequestLog.getModule());
                    preparedStatement.setString(++index,httpRequestLog.getRole());
                    preparedStatement.setString(++index,httpRequestLog.getHostname());
                    preparedStatement.setString(++index,httpRequestLog.getRequestMethod());
                    preparedStatement.setString(++index,httpRequestLog.getQueryParams());
                    preparedStatement.setString(++index,httpRequestLog.getPostBody());
                    preparedStatement.setString(++index,httpRequestLog.getRequestFullPath());
                    preparedStatement.setString(++index,httpRequestLog.getHttpRequestPath());
                    preparedStatement.setString(++index,httpRequestLog.getHttpStatus());
                    preparedStatement.setString(++index,httpRequestLog.getResponseBody());
                    preparedStatement.setString(++index,httpRequestLog.getCreateDate());

                    preparedStatement.execute();
                }
                catch (Exception exception){
                    throw exception;
                }
                finally {
                    jdbcUtils.closeConnection(connection);
                }
            }

            servletResponse.getoutputStream().write(httpServletResponse.getContent());
        }
        catch (Exception e){
            e.printstacktrace();
        }
    }

    @Override
    public int getorder() {
        return 520;
    }
}

ReWriteHttpServletRequestWrapper: 

package cn.com.yusys.aiops.filter;

import lombok.Data;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

/**
 * @author: wtl
 * @License: (C) copyright 2021, wtl Corporation Limited.
 * @Contact: 1050100468@qq.com
 * @Date: 2021/7/28 14:54
 * @Version: 1.0
 * @Description:
 */
public class ReWriteHttpServletRequestWrapper extends HttpServletRequestWrapper {
    private String body;
    public ReWriteHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream()));
            String line = null;
            StringBuilder bodyBuilder = new StringBuilder();
            while ((line = bufferedReader.readLine())!= null){
                bodyBuilder.append(line);
            }
            body = bodyBuilder.toString();
        }
        catch (Exception e){
            e.printstacktrace();
        }
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8));

        return new ServletInputStream() {
            @Override
            public int read() throws IOException {
                return byteArrayInputStream.read();
            }

            @Override
            public boolean isFinished() {
                return byteArrayInputStream.read() == -1;
            }

            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public void setReadListener(ReadListener readListener) {

            }
        };
    }

    public String getBody() {
        return body;
    }
}

 ReWriteHttpServletResponseWrapper :

package cn.com.yusys.aiops.filter;

import javax.servlet.ServletoutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class ReWriteHttpServletResponseWrapper extends HttpServletResponseWrapper {
    private ByteArrayOutputStream buffer;
    private ServletoutputStream out;

    public ReWriteHttpServletResponseWrapper(HttpServletResponse httpServletResponse) {
        super(httpServletResponse);
        buffer = new ByteArrayOutputStream();
        out = new WrapperOutputStream(buffer);
    }

    @Override
    public ServletoutputStream getoutputStream() throws IOException {
        return out;
    }

    @Override
    public void flushBuffer() throws IOException {
        if (out != null) {
            out.flush();
        }
    }

    public byte[] getContent() throws IOException {
        flushBuffer();
        return buffer.toByteArray();
    }

    public static class WrapperOutputStream extends ServletoutputStream {
        private ByteArrayOutputStream bos;

        public WrapperOutputStream(ByteArrayOutputStream bos) {
            this.bos = bos;
        }

        @Override
        public void write(int b) throws IOException {
            bos.write(b);
        }

        @Override
        public boolean isReady() {
            return false;
        }

        @Override
        public void setWriteListener(WriteListener arg0) {

        }
    }

}

 JdbcEntityConfiguration:

package cn.com.yusys.aiops.jdbc;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * @author: wtl
 * @License: (C) copyright 2021, wtl Corporation Limited.
 * @Contact: 1050100468@qq.com
 * @Date: 2021/7/30 10:04
 * @Version: 1.0
 * @Description:
 */
@Data
@Configuration
@ConfigurationProperties(prefix = "spring.datasource")
public class JdbcEntityConfiguration {
    private String url;
    private String username;
    private String password;
}

 JdbcUtils :

package cn.com.yusys.aiops.jdbc;

import cn.com.yusys.aiops.common.core.util.StringUtils;
import lombok.requiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Arrays;
import java.util.stream.Stream;

/**
 * @author: wtl
 * @License: (C) copyright 2021, wtl Corporation Limited.
 * @Contact: 1050100468@qq.com
 * @Date: 2021/7/30 10:03
 * @Version: 1.0
 * @Description:
 */
@Component
@requiredArgsConstructor
public class JdbcUtils {

    private final JdbcEntityConfiguration jdbcEntityConfiguration;

    public Connection getConnection() {
        String url = jdbcEntityConfiguration.getUrl();
        String[] splitArray = url.split("\\?");
        String[] splitSchemeArray = splitArray[0].split("/");
        StringBuilder schemeStringBuilder = new StringBuilder();
        for (int i=0;i<splitSchemeArray.length - 1;i++){
            schemeStringBuilder.append(splitSchemeArray[i]).append("/");
        }

        url = schemeStringBuilder.toString() + "yusys_aiops_upms" + "?" + splitArray[1];
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(
                    url,
                    jdbcEntityConfiguration.getUsername(),
                    jdbcEntityConfiguration.getpassword());
        }
        catch (Exception e){
            throw new RuntimeException("连接数据库异常.");
        }

        return connection;
    }

    public void closeConnection(Connection connection) {
        if (null != connection){
            try {
                connection.close();
            }
            catch (Exception e){
                throw new RuntimeException("数据库连接池关闭异常.");
            }
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐