admin
2021-10-16 df244ea8697b42f6b48582be381ee8b6f4aca331
隐私投诉接口
5个文件已修改
3个文件已添加
225 ■■■■■ 已修改文件
src/main/java/com/yeshi/buwan/aspect/SignAspect.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/api/HelpController.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/parser/CommentParser.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/controller/parser/UserParser.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/filter/RequestFilter.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/env-dev/logback.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/WEB-INF/web.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/hxh/spring/test/log/LogTest.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/yeshi/buwan/aspect/SignAspect.java
@@ -9,8 +9,15 @@
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest;
import org.yeshi.utils.StringUtil;
import javax.annotation.Resource;
@@ -31,9 +38,9 @@
    //签名验证
    @Around("execution(public * com.yeshi.buwan.controller.api.*.*(..))")
    public Object verifySign(ProceedingJoinPoint joinPoint) throws Throwable {
        ServletRequestAttributes servletContainer = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = servletContainer.getRequest();
        HttpServletResponse response = servletContainer.getResponse();
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST);
        HttpServletResponse response = ((ServletRequestAttributes) requestAttributes).getResponse();
        PrintWriter out = null;
        AcceptData acceptData = null;
        Object[] args = joinPoint.getArgs();
@@ -50,14 +57,16 @@
        //布丸3.8.7之后调用新的签名方法
        if (acceptData != null && "android".equalsIgnoreCase(acceptData.getPlatform()) && acceptData.getVersion() >= 105) {
            Map<String, String[]> params = request.getParameterMap();
            //签名
            List<String> list = new ArrayList<>();
            //签名
            for (Iterator<String> its = params.keySet().iterator(); its.hasNext(); ) {
                String key = its.next();
                if ("sign".equalsIgnoreCase(key))
                    continue;
                list.add(key + "=" + params.get(key)[0]);
            }
            Collections.sort(list);
            String str = StringUtil.concat(list, "&");
            String sign = StringUtil.Md5(str + "8888B&*@-uWan88/',@@^");
src/main/java/com/yeshi/buwan/controller/api/HelpController.java
New file
@@ -0,0 +1,74 @@
package com.yeshi.buwan.controller.api;
import com.yeshi.buwan.controller.EmailController;
import com.yeshi.buwan.util.COSManager;
import com.yeshi.buwan.util.JsonUtilV2;
import com.yeshi.buwan.util.StringUtil;
import com.yeshi.buwan.util.TimeUtil;
import com.yeshi.buwan.util.email.MailSenderUtil;
import com.yeshi.buwan.vo.AcceptData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.yeshi.utils.annotation.RequestSerializableByKey;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Controller
@RequestMapping("api/v2/help")
public class HelpController {
    Logger logger = LoggerFactory.getLogger(HelpController.class);
    /**
     * @return java.lang.String
     * @author hxh
     * @description 隐私投诉
     * @date 19:14 2021/10/15
     * @param: acceptData
     * @param: loginUid
     **/
    @RequestSerializableByKey(key="#acceptData.device")
    @RequestMapping("privacyReport")
    @ResponseBody
    public String privacyReport(AcceptData acceptData, HttpServletRequest request, MultipartFile[] images) {
        String content = request.getParameter("content");
        logger.info("隐私投诉内容:" + content);
        String urlList = "";
        if (images != null && images.length > 0)
            for (MultipartFile f : images) {
                try {
                    String name = TimeUtil.getGernalTime(System.currentTimeMillis(), "yyyyMMddHHmmssSSS") + "_" + ((int) (Math.random() * 100000)) + ".jpg";
                    String result = COSManager.getInstance().uploadFile(f.getInputStream(), "privacy/report/" + name);
                    urlList += result + " , ";
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        String title = "隐私投诉:" + content;
        StringBuffer buffer = new StringBuffer();
        buffer.append("包名:"+acceptData.getPackageName());
        buffer.append("\n\r");
        buffer.append("UTDID:"+acceptData.getUtdId());
        buffer.append("\n\r");
        buffer.append("DEVICE:"+acceptData.getDevice());
        buffer.append("\n\r");
        buffer.append("投诉内容:");
        buffer.append(content);
        buffer.append("\n\r");
        buffer.append("提供的截图为:" + urlList);
        MailSenderUtil.sendEmail("yesbd@qq.com","buwanysdq@163.com", "weikou2014",title,buffer.toString());
        return JsonUtilV2.loadTrueJson("成功");
    }
}
src/main/java/com/yeshi/buwan/controller/parser/CommentParser.java
@@ -22,6 +22,8 @@
import com.yeshi.buwan.vo.AcceptData;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.yeshi.utils.entity.wx.WeiXinUser;
@@ -35,6 +37,9 @@
@Controller
public class CommentParser {
    Logger logger = LoggerFactory.getLogger(CommentParser.class);
    @Resource
    private SystemService systemService;
    @Resource
@@ -90,6 +95,7 @@
        }
        LoginInfoDto loginInfoDto = new LoginInfoDto();
        loginInfoDto.setIpInfo(IPUtil.getRemotIP(request) + ":" + request.getRemotePort());
        loginInfoDto.setSystemId(acceptData.getDetailSystem().getSystem().getId());
        int loginTypeInt = Integer.parseInt(loginType);
@@ -153,9 +159,13 @@
        }
        //通过code换取个人信息
        WeiXinUser weiXinUser = MyWXLoginUtil.getUserInfo(code, MyWXLoginUtil.WEIXIN_APPID, MyWXLoginUtil.WEIXIN_SECRET);
        try {
            logger.error("微信登录:" + new GsonBuilder().create().toJson(weiXinUser));
        } catch (Exception e) {
        }
        if (weiXinUser == null) {
            out.print(JsonUtil.loadFalseJson("获取授权信息失败"));
            out.print(JsonUtil.loadFalseJson("获取授权信息失败,请稍后再试"));
            return;
        }
@@ -163,6 +173,7 @@
        loginInfoDto.setSystemId(acceptData.getDetailSystem().getSystem().getId());
        loginInfoDto.setLoginType(LoginUser.LOGIN_TYPE_WX);
        loginInfoDto.setWeiXinUser(weiXinUser);
        loginInfoDto.setIpInfo(IPUtil.getRemotIP(request) + ":" + request.getRemotePort());
        try {
@@ -179,7 +190,14 @@
            if (e.getCode() == LoginUserException.CODE_NO_USER) {
                //注册
                try {
                    userService.register(loginInfoDto);
                    LoginUser lu = userService.register(loginInfoDto);
                    if (lu != null) {
                        JSONObject object = new JSONObject();
                        object.put("user", new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(lu));
                        out.print(JsonUtil.loadTrueJson(object.toString()));
                    } else {
                        out.print(JsonUtil.loadFalseJson("登录失败"));
                    }
                } catch (RegisterUserException e1) {
                    out.print(JsonUtil.loadFalseJson("登录失败"));
                }
src/main/java/com/yeshi/buwan/controller/parser/UserParser.java
@@ -1204,6 +1204,7 @@
        loginInfoDto.setSystemId(acceptData.getDetailSystem().getSystem().getId());
        loginInfoDto.setEmail(account);
        loginInfoDto.setPwd(StringUtil.Md5(pwd));
        loginInfoDto.setIpInfo(IPUtil.getRemotIP(request) + ":" + request.getRemotePort());
        try {
            LoginUser user = userService.login(loginInfoDto);
            out.print(JsonUtil.loadTrueJson(StringUtil.outPutResultJson(user)));
src/main/java/com/yeshi/buwan/filter/RequestFilter.java
New file
@@ -0,0 +1,40 @@
package com.yeshi.buwan.filter;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
 * @author hxh
 * @title: RequestFilter
 * @description: request过滤器
 * @date 2021/10/16 13:40
 */
public class RequestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
        String contentType = httpRequest.getContentType();
        if (contentType != null && contentType.contains("multipart/form-data")) {
            MultipartResolver resolver = new CommonsMultipartResolver(httpRequest.getSession().getServletContext());
            MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(httpRequest);
            // 将转化后的 request 放入过滤链中
            servletRequest = multipartRequest;
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }
    @Override
    public void destroy() {
    }
}
src/main/resources/env-dev/logback.xml
@@ -60,6 +60,27 @@
    </appender>
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.filePath}/debug/debug.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
            <maxHistory>${log.maxHistory}</maxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                ${log.pattern}
            </pattern>
        </layout>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- DEBUG -->
    <!--  客户端接口出错 -->
    <appender name="apiErrorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
@@ -149,8 +170,9 @@
    </logger>
    <logger name="com.yeshi.buwan" level="INFO" additivity="true">
    <logger name="com.yeshi.buwan" level="DEBUG" additivity="true">
        <appender-ref ref="ERROR_FILE"></appender-ref>
        <appender-ref ref="DEBUG_FILE"></appender-ref>
    </logger>
@@ -218,5 +240,7 @@
        <level value="INFO"/>
        <!--在控制台中输出所在层级对应level(以及大于level)的日志信息,因为这里并没有设置LevelFilter-->
        <appender-ref ref="STDOUT"></appender-ref>
        <appender-ref ref="DEBUG_FILE"></appender-ref>
    </root>
</configuration>
src/main/webapp/WEB-INF/web.xml
@@ -24,6 +24,18 @@
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter>
        <filter-name>RequestFilter</filter-name>
        <filter-class>com.yeshi.buwan.filter.RequestFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>RequestFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
src/test/java/com/hxh/spring/test/log/LogTest.java
New file
@@ -0,0 +1,33 @@
package com.hxh.spring.test.log;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
/**
 * @author Administrator
 * @title: LogTest
 * @description: TODO
 * @date 2021/10/11 14:46
 */
public class LogTest {
    @Test
    public void access() throws FileNotFoundException {
        Scanner scanner = new Scanner(new FileInputStream(new File("C:\\Users\\Administrator\\Downloads\\202110111057018682009979\\localhost_access_log.2021-10-11.txt")));
        while (scanner.hasNextLine()) {
            String content = scanner.nextLine();
            if (content.contains("comment")) {
                System.out.println(content);
            }
        }
        scanner.close();
    }
}