微信后端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 lines
5.0 KiB

package com.ynxbd.wx.servlet.base;
import com.ynxbd.common.helper.common.HttpHelper;
import com.ynxbd.common.helper.common.JsonHelper;
import com.ynxbd.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.Map;
// servlet基类
@Slf4j
public abstract class BaseServlet extends HttpServlet {
@Override
public void init() {
}
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
MDC.remove("ip");
MDC.put("ip", HttpHelper.getIpAddress(req));
doPost(req, resp);
}
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
try {
// 响应数据处理
Result result = requestMapping(req, resp);
outResp(resp, result);
} catch (Exception e) {
e.printStackTrace();
outResp(resp, Result.error(e.getMessage()));
}
}
/**
* 处理请求内容
*
* @param req 请求
* @param resp 响应
* @return 响应内容
*/
protected abstract Result requestMapping(HttpServletRequest req, HttpServletResponse resp) throws Exception;
/**
* 是否打印请求参数
*
* @param request 请求对象
*/
protected static void logParams(HttpServletRequest request) {
Map<String, String[]> parameterMap = request.getParameterMap();
String p;
int cur = 0;
int size = parameterMap.size();
StringBuilder params = new StringBuilder();
for (Map.Entry<String, String[]> map : parameterMap.entrySet()) {
cur++;
String val = map.getValue()[0];
if (val.length() > 666) {
val = "参数过长,不进行打印";
}
p = map.getKey() + "=" + val;
if (cur != size) {
p += ", ";
}
params.append(p);
}
log.info(request.getServletPath() + "[请求参数:{{}}]", params);
}
/**
* 设置响应内容
*
* @param data 数据
* @param resp 响应流
*/
private static void outResp(HttpServletResponse resp, Object data) {
resp.setContentType("application/json;charset=utf-8");
/* 允许跨域的主机地址 */
resp.setHeader("Access-Control-Allow-Origin", "*");
/* 允许跨域的请求方法GET, POST, HEAD 等 */
resp.setHeader("Access-Control-Allow-Methods", "*");
/* 重新预检验跨域的缓存时间 (s) */
resp.setHeader("Access-Control-Max-Age", "3600");
/* 允许跨域的请求头 */
resp.setHeader("Access-Control-Allow-Headers", "*");
/* 是否携带cookie */
resp.setHeader("Access-Control-Allow-Credentials", "true");
try (PrintWriter pw = resp.getWriter()) {
pw.write(JsonHelper.toJsonString(data));
pw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取对象
*
* @param req 请求
* @param key 对象key
* @param clazz 类
* @param <T> T
* @return 对象
*/
protected static <T> T getMapObject(HttpServletRequest req, String key, Class<T> clazz) {
Map<String, String[]> map = req.getParameterMap();
T t = null;
for (Map.Entry<String, String[]> m : map.entrySet()) {
if (m.getKey().equals(key)) {
String val = m.getValue()[0];
if (val == null) return null;
try {
t = JsonHelper.parseObject(val, clazz);
} catch (Exception e) {
return null;
}
}
}
return t;
}
/**
* 获取对象
*
* @param req 请求
* @param key 对象key
* @param clazz 类
* @param <T> T
* @return 对象
*/
protected static <T> List<T> getMapList(HttpServletRequest req, String key, Class<T> clazz) {
Map<String, String[]> map = req.getParameterMap();
List<T> ts = null;
for (Map.Entry<String, String[]> m : map.entrySet()) {
if (m.getKey().equals(key)) {
String val = m.getValue()[0];
if (val == null) return null;
try {
ts = JsonHelper.parseArray(val, clazz);
} catch (Exception e) {
return null;
}
}
}
if (ts == null) return null;
return ts.size() > 0 ? ts : null;
}
}