功能开发,并删除多余文件

This commit is contained in:
lvshaohua 2023-06-16 11:06:56 +08:00
parent 7f32dcd9bd
commit bc254cd522
22 changed files with 51 additions and 727 deletions

View File

@ -11,7 +11,7 @@ import lombok.Getter;
*/
@Getter
@AllArgsConstructor
public enum ErrorCode implements IProjectRespCode {
public enum BpmErrorCode implements IProjectRespCode {
// ========== 流程模型 1-009-002-000 ==========

View File

@ -1,14 +1,8 @@
package cn.axzo.server.common.enums;
import com.google.common.collect.Maps;
import org.flowable.bpmn.model.ExclusiveGateway;
import org.flowable.bpmn.model.ParallelGateway;
import org.flowable.bpmn.model.ServiceTask;
import org.flowable.bpmn.model.UserTask;
import java.util.Map;
public enum FlowNodeType {
public enum BpmFlowNodeType {
//0 发起人 1审批 2抄送 3条件 4路由
NODE_STARTER("NODE_STARTER",UserTask.class, "发起人节点"),
@ -19,7 +13,7 @@ public enum FlowNodeType {
private String desc;
private Class<?> typeClass;
FlowNodeType(String type, Class<?> typeClass, String desc) {
BpmFlowNodeType(String type, Class<?> typeClass, String desc) {
this.type = type;
this.typeClass = typeClass;
this.desc = desc;

View File

@ -1,88 +0,0 @@
package cn.axzo.server.common.enums;
/**
* @Author: liyong.tian
* @Date: 2022/9/5
* @Description:
*/
public enum ResultCode {
/**
* 成功 [GET]
*/
SUCCESS(200),
/**
* [POST/PUT/PATCH] 用户新建或修改数据成功
*/
CREATED(201),
/**
* [*] 标识一个请求已经进入后台排队 (异步任务)
*/
ACCEPTED(202),
/**
* [DELETE]: 用户删除数据成功
*/
NO_CONTENT(204),
/**
* [POST/PUT/PATCH] 用户发出的请求有错误, 服务器没有进行新建或修改数据的操作, 该操作是幂等的.
*/
FAIL(400),
/**
* [*] 标识没有权限 (令牌用户名密码错误)
*/
UNAUTHORIZED(401),
/**
* [*] 标识用户得到授权(与401错误相对), 但是访问是被禁止的
*/
FORBIDDEN(403),
/**
* [*] 用户发出的请求针对的是不存在的记录, 服务器没有进行操作
*/
NOT_FOUND(404),
/**
* [GET] 用户请求的格式不可得 (比如用户请求JSON格式, 但是只有XML格式)
*/
NOT_ACCEPTABLE(406),
/**
* [GET] 用户请求的资源被永久删除, 且不会再得到
*/
GONE(410),
/**
* [POST/PUT/PATCH] 当创建一个对象时, 发生一个验证错误646
*/
UNPROCESSABLE_ENTITY(422),
/**
* 服务器内部错误
*/
INTERNAL_SERVER_ERROR(9999),
/**
* 通用业务异常
*/
SERVICE_EXCEPTION_ERROR(9998),
/**
* ####业务的响应码####
* 按业务依次划分 :
* 一共6位, 第6位是业务代码 第1-5位响应码, 按业务不同码不同
* #100000 全局级别
*/
/**
* 100001 当前用户被强制下线
*/
CUSTOM_100001(100001),
/**
* 确认弹窗响应码
*/
CUSTOM_100002(100002);
public int code;
ResultCode(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}

View File

@ -1 +0,0 @@
package cn.axzo.server.common.util;

View File

@ -1,259 +0,0 @@
package cn.axzo.server.config.filter;
import cn.azxo.framework.common.constatns.Constants;
import cn.azxo.framework.common.utils.LogUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;
import com.google.common.base.Strings;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.slf4j.MDC;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.ContentCachingRequestWrapper;
import org.springframework.web.util.ContentCachingResponseWrapper;
import org.springframework.web.util.WebUtils;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.*;
/**
* @Author: liyong.tian
* @Date: 2022/12/6 14:48
* @Description: Http接口日志记录
*/
@Slf4j
@Component
public class HttpTraceLogFilter extends OncePerRequestFilter implements Ordered {
private static final String X_REQUEST_ID = "x-request-id";
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE - 10;
}
@Override
@Trace(operationName = "HttpTraceLogFilter")
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
String uri = request.getRequestURI();
String contextPath = request.getContextPath();
String url = uri.substring(contextPath.length());
//swagger 跳过
if (url.contains("api-docs") || url.contains("swagger") || url.contains("checkDeath")) {
filterChain.doFilter(request, response);
return;
}
//静态资源 跳过
if (url.contains(".")) {
filterChain.doFilter(request, response);
return;
}
if (!(request instanceof ContentCachingRequestWrapper)) {
request = new ContentCachingRequestWrapper(request);
}
if (!(response instanceof ContentCachingResponseWrapper)) {
response = new ContentCachingResponseWrapper(response);
}
String requestId = request.getHeader(X_REQUEST_ID);
if (Strings.isNullOrEmpty(requestId)) {
MDC.put(X_REQUEST_ID, getTraceId());
} else {
MDC.put(X_REQUEST_ID, requestId);
}
String ctxLogId = request.getHeader(Constants.CTX_LOG_ID_MDC);
if (Strings.isNullOrEmpty(ctxLogId)) {
MDC.put(Constants.CTX_LOG_ID_MDC, getTraceId());
} else {
MDC.put(Constants.CTX_LOG_ID_MDC, ctxLogId);
}
// 获取请求参数
String parameter = null;
String requestContentType = request.getHeader(HttpHeaders.CONTENT_TYPE);
if (requestContentType != null) {
if (requestContentType.startsWith(MediaType.APPLICATION_JSON_VALUE)) {
//Json
WrappedHttpServletRequest requestWrapper = new WrappedHttpServletRequest(request);
parameter = getRequestBody(requestWrapper);
request = requestWrapper;
} else if (requestContentType.startsWith(MediaType.APPLICATION_FORM_URLENCODED_VALUE)) {
//普通表单提交
parameter = JSON.toJSONString(request.getParameterMap());
} else if (requestContentType.startsWith(MediaType.MULTIPART_FORM_DATA_VALUE)) {
//文件表单提交
parameter = JSON.toJSONString("文件类型");
}
} else if (url.startsWith("/api")) {
if ("GET".equals(request.getMethod())) {
parameter = JSON.toJSONString(request.getParameterMap());
} else if ("POST".equals(request.getMethod())) {
WrappedHttpServletRequest requestWrapper = new WrappedHttpServletRequest(request);
parameter = getRequestBody(requestWrapper);
request = requestWrapper;
}
} else if ("GET".equals(request.getMethod())) {
parameter = JSON.toJSONString(request.getParameterMap());
}
long requestTime = System.currentTimeMillis();
try {
filterChain.doFilter(request, response);
} finally {
response.setHeader(Constants.CTX_LOG_ID_MDC, MDC.get(Constants.CTX_LOG_ID_MDC));
response.setHeader(X_REQUEST_ID, MDC.get(Constants.CTX_LOG_ID_MDC));
long latency = System.currentTimeMillis() - requestTime;
String responseBody = null;
int responseStatus = response.getStatus();
String responseContentType = response.getContentType();
//Json
if (responseContentType != null && responseContentType
.startsWith(MediaType.APPLICATION_JSON_VALUE)) {
responseBody = getResponseBody(response);
}
//记录日志
HttpTraceLog traceLog = new HttpTraceLog();
traceLog.setRequestContentType(requestContentType);
traceLog.setPath(url);
traceLog.setMethod(request.getMethod());
traceLog.setTimeTaken(latency);
traceLog.setParameter(parameter);
traceLog.setResponseContentType(responseContentType);
traceLog.setStatus(responseStatus);
traceLog.setResponseBody(responseBody);
traceLog.setRequestHeaders(getRequestHeader(request));
if (traceLog.getResponseCode() != null && traceLog.getResponseCode().equals(9999)) {
LogUtil.error(LogUtil.ErrorLevel.P0, LogUtil.ErrorType.ERROR_BUSINESS, JSON.toJSONString(traceLog));
} else if (traceLog.getResponseCode() != null && traceLog.getResponseCode().equals(9998)) {
log.warn(JSON.toJSONString(traceLog));
} else {
log.info(JSON.toJSONString(traceLog));
}
updateResponse(response);
// 清理链路id
MDC.clear();
}
}
private String getTraceId() {
String contextTraceId = TraceContext.traceId();
return Strings.isNullOrEmpty(contextTraceId)
? UUID.randomUUID().toString().replaceAll("-", "") : contextTraceId;
}
private String getRequestBody(WrappedHttpServletRequest request) throws IOException {
// 获取请求参数
return request.getRequestParams();
}
@Trace(operationName = "HttpTraceLogFilter#getResponseBody")
private String getResponseBody(HttpServletResponse response) {
String responseBody = null;
ContentCachingResponseWrapper wrapper = WebUtils
.getNativeResponse(response, ContentCachingResponseWrapper.class);
if (wrapper != null) {
responseBody = new String(wrapper.getContentAsByteArray(), StandardCharsets.UTF_8);
}
return responseBody;
}
public Map<String, String> getRequestHeader(HttpServletRequest request) {
Map<String, String> ret = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
ret.put(headerName, request.getHeader(headerName));
}
return ret;
}
@Trace(operationName = "HttpTraceLogFilter#updateResponse")
private void updateResponse(HttpServletResponse response) throws IOException {
ContentCachingResponseWrapper responseWrapper = WebUtils
.getNativeResponse(response, ContentCachingResponseWrapper.class);
Objects.requireNonNull(responseWrapper).copyBodyToResponse();
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
private static class HttpTraceLog {
/**
* 路径
*/
private String path;
/**
* 参数
*/
@JSONField(jsonDirect = true)
private String parameter;
private String requestContentType;
private String responseContentType;
private String method;
private Long timeTaken;
private Integer status;
/**
* 业务Code
*/
private Integer responseCode;//业务返回码
/**
* 响应参数
*/
@JSONField(jsonDirect = true)
private String responseBody;
@JSONField(jsonDirect = true)
private Map<String, String> requestHeaders;
public String getParameter() {
if (parameter == null) {
return parameter;
} else {
return parameter.replaceAll("\n", "").replaceAll("\t", "").replaceAll("\r", "");
}
}
public String getResponseBody() {
if (responseBody == null) {
return responseBody;
} else {
return responseBody.replaceAll("\n", "").replaceAll("\t", "").replaceAll("\r", "");
}
}
public void setResponseBody(String responseBody) {
if (StringUtils.isBlank(responseBody)) {
return;
}
this.responseBody = responseBody;
JSONObject responseJson = null;
try {
responseJson = JSONObject.parseObject(responseBody);
this.responseCode = responseJson.getInteger("code");
} catch (JSONException e) {
log.debug("ResponseBody非JSON返回", e);
}
}
}
}

View File

@ -1,91 +0,0 @@
package cn.axzo.server.config.filter;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.io.IOUtils;
/**
* @Author: liyong.tian
* @Date: 2022/12/6 14:56
* @Description:
*/
public class WrappedHttpServletRequest extends HttpServletRequestWrapper {
private byte[] bytes;
private WrappedServletInputStream wrappedServletInputStream;
public WrappedHttpServletRequest(HttpServletRequest request) throws IOException {
super(request);
// 读取输入流里的请求参数并保存到bytes里
bytes = IOUtils.toByteArray(request.getInputStream());
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
this.wrappedServletInputStream = new WrappedServletInputStream(byteArrayInputStream);
// 很重要把post参数重新写入请求流
reWriteInputStream();
}
/**
* 把参数重新写进请求里
*/
public void reWriteInputStream() {
wrappedServletInputStream
.setStream(new ByteArrayInputStream(bytes != null ? bytes : new byte[0]));
}
@Override
public ServletInputStream getInputStream() throws IOException {
return wrappedServletInputStream;
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(wrappedServletInputStream));
}
/**
* 获取post参数可以自己再转为相应格式
*/
public String getRequestParams() throws IOException {
return new String(bytes, this.getCharacterEncoding());
}
private class WrappedServletInputStream extends ServletInputStream {
private InputStream stream;
public WrappedServletInputStream(InputStream stream) {
this.stream = stream;
}
public void setStream(InputStream stream) {
this.stream = stream;
}
@Override
public int read() throws IOException {
return stream.read();
}
@Override
public boolean isFinished() {
return true;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener readListener) {
}
}
}

View File

@ -1 +0,0 @@
package cn.axzo.server.config;

View File

@ -1 +0,0 @@
package cn.axzo.server.consumer;

View File

@ -1,22 +0,0 @@
package cn.axzo.server.controller;
import cn.axzo.framework.web.http.ApiResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: liyong.tian
* @Date: 2022/11/25 18:00
* @Description: 健康检查接口
*/
@RestController
public class HealthCheckController {
/**
* 探活
*/
@GetMapping("/checkDeath")
public ApiResponse<String> checkDeath() {
return ApiResponse.ok("ok");
}
}

View File

@ -1 +0,0 @@
package cn.axzo.server.controller.app;

View File

@ -1 +0,0 @@
package cn.axzo.server.job;

View File

@ -1 +0,0 @@
package cn.axzo.server.repository.dataobject;

View File

@ -1,6 +1,7 @@
package cn.axzo.server.repository.dto;
import java.util.ArrayList;
import cn.axzo.server.common.enums.BpmFlowNodeType;
import java.util.List;
public class BpmJsonNode {
@ -12,7 +13,7 @@ public class BpmJsonNode {
private String id;
private String parentId;
/**
* {@link cn.axzo.server.common.enums.FlowNodeType}
* {@link BpmFlowNodeType}
* */
private String type; // task, branch,
private String name;

View File

@ -1,15 +0,0 @@
package cn.axzo.server.service.converter;
import java.util.List;
/**
* @Author: liyong.tian
* @Date: 2022/9/5
* @Description:
*/
public interface EntityConverter<V, E>{
V toVo(E var);
List<V> toVo(List<E> var);
}

View File

@ -0,0 +1,35 @@
package cn.axzo.server.service.engine;
import cn.axzo.server.listener.BpmTaskEventListener;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.delegate.TaskListener;
import org.flowable.task.service.delegate.DelegateTask;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
@Slf4j
public class EngineTaskEventListener implements TaskListener {
@Resource
@Lazy
BpmTaskEventListener taskEventListener;
@Override
public void notify(DelegateTask delegateTask) {
if (delegateTask.getEventName().equals(TaskListener.EVENTNAME_CREATE)) {
taskEventListener.created(delegateTask);
// 审批创建
} else if (delegateTask.getEventName().equals(TaskListener.EVENTNAME_ASSIGNMENT)) {
taskEventListener.assigned(delegateTask);
} else if (delegateTask.getEventName().equals(TaskListener.EVENTNAME_COMPLETE)) {
//审批完成
taskEventListener.completed(delegateTask);
} else if (delegateTask.getEventName().equals(TaskListener.EVENTNAME_DELETE)) {
// 审批删除
taskEventListener.deleted(delegateTask);
}
}
}

View File

@ -1,7 +1,7 @@
package cn.axzo.server.service.impl;
import cn.axzo.framework.domain.ServiceException;
import cn.axzo.server.common.enums.ErrorCode;
import cn.axzo.server.common.enums.BpmErrorCode;
import cn.axzo.server.service.BpmModelService;
import cn.axzo.server.service.converter.BpmModelConverter;
import cn.axzo.server.service.dto.request.model.BpmModelCreateDTO;
@ -90,12 +90,12 @@ public class BpmModelServiceImpl implements BpmModelService {
public void deployBpmModelById(String modelId) {
Model model = this.repositoryService.getModel(modelId);
if (org.springframework.util.ObjectUtils.isEmpty(model)) {
throw new ServiceException(ErrorCode.MODEL_NOT_EXISTS);
throw new ServiceException(BpmErrorCode.MODEL_NOT_EXISTS);
}
byte[] bpmnBytes = this.repositoryService.getModelEditorSource(model.getId());
if (bpmnBytes == null) {
throw new ServiceException(ErrorCode.MODEL_NOT_EXISTS);
throw new ServiceException(BpmErrorCode.MODEL_NOT_EXISTS);
}
processDefinitionServiceImpl.createProcessDeinition(model, bpmnBytes);

View File

@ -1,7 +1,6 @@
package cn.axzo.server.service.impl;
import cn.axzo.framework.domain.ServiceException;
import cn.axzo.server.common.enums.ErrorCode;
import cn.axzo.server.service.BpmProcessDefinitionService;
import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.impl.db.SuspensionState;
@ -14,8 +13,8 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Objects;
import static cn.axzo.server.common.enums.ErrorCode.PROCESS_DEFINITION_KEY_NOT_MATCH;
import static cn.axzo.server.common.enums.ErrorCode.PROCESS_DEFINITION_NAME_NOT_MATCH;
import static cn.axzo.server.common.enums.BpmErrorCode.PROCESS_DEFINITION_KEY_NOT_MATCH;
import static cn.axzo.server.common.enums.BpmErrorCode.PROCESS_DEFINITION_NAME_NOT_MATCH;
@Service
@Slf4j

View File

@ -1,22 +1,5 @@
package cn.axzo.server.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.flowable.engine.*;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.engine.runtime.ProcessInstanceQuery;
import org.flowable.task.api.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.*;
import static cn.axzo.server.common.enums.ErrorCode.PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS;
public class BpmProcessInstanceServiceImpl {
// @Autowired

View File

@ -1 +0,0 @@
package cn.axzo.server.service.manager;

View File

@ -2,12 +2,11 @@ package cn.axzo.server.service.utils;
import cn.axzo.framework.domain.ServiceException;
import cn.axzo.server.common.WorkflowConstants;
import cn.axzo.server.common.enums.FlowNodeType;
import cn.axzo.server.common.enums.BpmFlowNodeType;
import cn.axzo.server.repository.dto.BpmJsonNode;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.flowable.bpmn.BpmnAutoLayout;
import org.flowable.bpmn.converter.BpmnXMLConverter;
@ -19,9 +18,8 @@ import org.springframework.util.CollectionUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
import java.util.stream.Collectors;
import static cn.axzo.server.common.enums.ErrorCode.BPM_META_DATA_FORMAT_ERROR;
import static cn.axzo.server.common.enums.BpmErrorCode.BPM_META_DATA_FORMAT_ERROR;
import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION;
public class BpmTransformUtil {
@ -95,7 +93,7 @@ public class BpmTransformUtil {
private static String create(String fromId, JSONObject flowNode, BpmnModel model, Process process, List<SequenceFlow> sequenceFlows) throws InvocationTargetException, IllegalAccessException {
String nodeType = flowNode.getString("type");
if (FlowNodeType.NODE_STARTER.name().equals(nodeType)) {
if (BpmFlowNodeType.NODE_STARTER.name().equals(nodeType)) {
// flowNode.put("incoming", Collections.singletonList(fromId));
String id = fromId;
@ -108,7 +106,7 @@ public class BpmTransformUtil {
return id;
}
}
else if (FlowNodeType.NODE_TASK.name().equals(nodeType)) {
else if (BpmFlowNodeType.NODE_TASK.name().equals(nodeType)) {
flowNode.put("incoming", Collections.singletonList(fromId));
String id = createTask(flowNode,process,sequenceFlows);
@ -212,7 +210,7 @@ public class BpmTransformUtil {
userTask.setName(flowNode.getString("nodeName"));
userTask.setId(id);
process.addFlowElement(userTask);
if(FlowNodeType.NODE_STARTER.name().equals(flowNode.getString("type"))){
if(BpmFlowNodeType.NODE_STARTER.name().equals(flowNode.getString("type"))){
id = WorkflowConstants.START_EVENT_ID;
}
else{

View File

@ -1 +0,0 @@
package cn.axzo.server.service.validator;

View File

@ -1,203 +0,0 @@
package cn.axzo.server.utils;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import lombok.Cleanup;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
*/
public class ServletUtil {
/**
* 获取ServletPath
*/
public static String getServletPath() {
return ServletUtil.getRequest().getServletPath();
}
/**
* 获取Request Payload
*/
public static String getPayload() {
try {
@Cleanup ServletInputStream is = ServletUtil.getRequest().getInputStream();
int nRead = 1;
int nTotalRead = 0;
byte[] bytes = new byte[10240 * 20];
while (nRead > 0) {
nRead = is.read(bytes, nTotalRead, bytes.length - nTotalRead);
if (nRead > 0) {
nTotalRead = nTotalRead + nRead;
}
}
String str = new String(bytes, 0, nTotalRead, Constants.UTF_8);
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
/**
* 获取User-Agent
*/
public static String getUserAgent() {
return ServletUtil.getHeader("User-Agent");
}
/**
* 判断是否是手机端登陆
*/
public static boolean getIsMobileDevice() {
return isMobileDevice(ServletUtil.getUserAgent());
}
/**
* 获取HTTP头信息
*/
public static String getHeader(String name) {
if(getRequest()!=null){
return getRequest().getHeader(name);
}
return null;
}
/**
* 获取表单参数
*/
public static String getParameter(String name) {
return getRequest().getParameter(name);
}
/**
* 获取request
*/
public static HttpServletRequest getRequest() {
if(getRequestAttributes()!=null){
return getRequestAttributes().getRequest();
}
return null;
}
/**
* 获取response
*/
public static HttpServletResponse getResponse() {
return getRequestAttributes().getResponse();
}
/**
* 获取session
*/
public static HttpSession getSession() {
return getRequest().getSession();
}
public static ServletRequestAttributes getRequestAttributes() {
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
return (ServletRequestAttributes) attributes;
}
/**
* 将字符串渲染到客户端
*
* @param response 渲染对象
* @param string 待渲染的字符串
* @return null
*/
public static String renderString(HttpServletResponse response, String string) {
try {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Cache-Control","no-cache");
response.setContentType("application/json");
response.setCharacterEncoding(Constants.UTF_8);
response.getWriter().print(string);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 是否是Ajax异步请求
*
* @param request
*/
public static boolean isAjaxRequest(HttpServletRequest request) {
String accept = request.getHeader("accept");
if (accept != null && accept.indexOf("application/json") != -1) {
return true;
}
String xRequestedWith = request.getHeader("X-Requested-With");
if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1) {
return true;
}
String uri = request.getRequestURI();
if (inStringIgnoreCase(uri, ".json", ".xml")) {
return true;
}
String ajax = request.getParameter("__ajax");
if (inStringIgnoreCase(ajax, "json", "xml")) {
return true;
}
return false;
}
/**
* 是否包含字符串
*
* @param str 验证字符串
* @param strs 字符串组
* @return 包含返回true
*/
public static boolean inStringIgnoreCase(String str, String... strs) {
if (str != null && strs != null) {
for (String s : strs) {
if (str.equalsIgnoreCase((s.trim()))) {
return true;
}
}
}
return false;
}
/**
* 返回JSONObject对象
*/
public static JSONObject getJsonObject() throws Exception{
String builder = ServletUtil.getPayload();
return JSONObject.parseObject(builder);
}
/**
* 判断是否是移动设备
* @param requestHeader
* @return
*/
public static boolean isMobileDevice(String requestHeader) {
String[] deviceArray = new String[]{"android", "windows phone", "iphone", "ios", "ipad" ,"mqqbrowser"};
if (requestHeader == null) {
return false;
}
requestHeader = requestHeader.toLowerCase();
for (int i = 0; i < deviceArray.length; i++) {
if (requestHeader.indexOf(deviceArray[i]) > 0) {
return true;
}
}
return false;
}
}