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.
		
		
		
		
			
				
					144 lines
				
				5.5 KiB
			
		
		
			
		
	
	
					144 lines
				
				5.5 KiB
			| 
											3 years ago
										 | package com.ynxbd.common.config.interceptor;
 | ||
|  | 
 | ||
|  | import com.opensymphony.xwork2.ActionContext;
 | ||
|  | import com.opensymphony.xwork2.ActionInvocation;
 | ||
|  | import com.ynxbd.common.helper.common.ErrorHelper;
 | ||
|  | import com.ynxbd.common.helper.common.JsonHelper;
 | ||
|  | import com.ynxbd.common.result.Result;
 | ||
|  | import org.apache.commons.lang3.ObjectUtils;
 | ||
|  | import org.apache.struts2.interceptor.ServletConfigInterceptor;
 | ||
|  | 
 | ||
|  | import javax.servlet.http.HttpServletRequest;
 | ||
|  | import javax.servlet.http.HttpServletResponse;
 | ||
|  | import java.io.IOException;
 | ||
|  | import java.io.PrintWriter;
 | ||
|  | import java.lang.reflect.Method;
 | ||
|  | import java.lang.reflect.Parameter;
 | ||
|  | import java.math.BigDecimal;
 | ||
|  | import java.util.ArrayList;
 | ||
|  | import java.util.List;
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * 方法拦截器
 | ||
|  |  */
 | ||
|  | public class MethodInterceptor extends ServletConfigInterceptor {
 | ||
|  | 
 | ||
|  |     @Override
 | ||
|  |     public String intercept(ActionInvocation invocation) throws Exception {
 | ||
|  |         Object action = invocation.getAction();
 | ||
|  |         ActionContext context = invocation.getInvocationContext();
 | ||
|  |         HttpServletRequest request = context.getServletRequest();
 | ||
|  |         if (action instanceof org.apache.struts2.action.ServletRequestAware) {
 | ||
|  |             ((org.apache.struts2.action.ServletRequestAware) action).withServletRequest(request);
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |         String methodName = invocation.getProxy().getMethod();
 | ||
|  |         String initials;
 | ||
|  |         for (Method method : action.getClass().getDeclaredMethods()) {
 | ||
|  |             if (method.getName().equals(methodName)) {
 | ||
|  |                 List<Object> params = new ArrayList<>();
 | ||
|  |                 String simpleName;
 | ||
|  |                 String value;
 | ||
|  |                 for (Parameter parameter : method.getParameters()) {
 | ||
|  |                     simpleName = parameter.getType().getSimpleName();
 | ||
|  |                     value = request.getParameter(parameter.getName());
 | ||
|  | 
 | ||
|  |                     if ("String".equals(simpleName)) {
 | ||
|  |                         params.add(ObjectUtils.isEmpty(value) ? null : value);
 | ||
|  |                         continue;
 | ||
|  |                     }
 | ||
|  | 
 | ||
|  |                     initials = simpleName.substring(0, 1);
 | ||
|  |                     if (initials.equals(initials.toUpperCase()) && ObjectUtils.isEmpty(value)) { // 大写
 | ||
|  |                         params.add(null);
 | ||
|  |                         continue;
 | ||
|  |                     }
 | ||
|  | 
 | ||
|  |                     if (simpleName.equals("int")) {
 | ||
|  |                         simpleName = "integer";
 | ||
|  |                     }
 | ||
|  | 
 | ||
|  |                     simpleName = simpleName.toLowerCase();
 | ||
|  |                     try {
 | ||
|  |                         switch (simpleName) {
 | ||
|  |                             case "boolean":
 | ||
|  |                                 params.add(Boolean.valueOf(value));
 | ||
|  | 
 | ||
|  |                                 break;
 | ||
|  |                             case "bigdecimal":
 | ||
|  |                                 params.add(new BigDecimal(value));
 | ||
|  | 
 | ||
|  |                                 break;
 | ||
|  |                             case "integer":
 | ||
|  |                                 params.add(Integer.valueOf(value));
 | ||
|  | 
 | ||
|  |                                 break;
 | ||
|  |                             case "long":
 | ||
|  |                                 params.add(Long.valueOf(value));
 | ||
|  | 
 | ||
|  |                                 break;
 | ||
|  |                             case "double":
 | ||
|  |                                 params.add(Double.valueOf(value));
 | ||
|  | 
 | ||
|  |                                 break;
 | ||
|  |                             default:
 | ||
|  |                                 params.add(null);
 | ||
|  |                                 break;
 | ||
|  |                         }
 | ||
|  |                     } catch (Exception e) {
 | ||
|  |                         params.add(null);
 | ||
|  |                     }
 | ||
|  |                 }
 | ||
|  | 
 | ||
|  |                 try {
 | ||
|  |                     Object invoke = method.invoke(action, params.toArray());
 | ||
|  |                     if (invoke == null) { // 避免返回值为空
 | ||
|  |                         return "SUCCESS";
 | ||
|  |                     }
 | ||
|  | 
 | ||
|  |                     if (Result.class == invoke.getClass()) {
 | ||
|  |                         respJson(context.getServletResponse(), action, invoke);
 | ||
|  |                     }
 | ||
|  |                     return "SUCCESS";
 | ||
|  |                 } catch (Exception e) {
 | ||
|  |                     e.printStackTrace();
 | ||
|  |                     if (e.getMessage() == null) {
 | ||
|  |                         Throwable cause = e.getCause();
 | ||
|  |                         if (cause != null) {
 | ||
|  |                             ErrorHelper.println((Exception) cause);
 | ||
|  |                         }
 | ||
|  |                     } else {
 | ||
|  |                         ErrorHelper.println(e);
 | ||
|  |                     }
 | ||
|  |                     return "SUCCESS";
 | ||
|  |                 }
 | ||
|  |             }
 | ||
|  |         }
 | ||
|  |         return "SUCCESS";
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     public void respJson(HttpServletResponse response, Object action, Object data) {
 | ||
|  |         if (action instanceof org.apache.struts2.action.ServletResponseAware) {
 | ||
|  |             ((org.apache.struts2.action.ServletResponseAware) action).withServletResponse(response);
 | ||
|  |         }
 | ||
|  |         response.setContentType("application/json;charset=utf-8");
 | ||
|  |         /* 允许跨域的主机地址 */
 | ||
|  |         response.setHeader("Access-Control-Allow-Origin", "*");
 | ||
|  |         /* 允许跨域的请求方法GET, POST, HEAD 等 */
 | ||
|  |         response.setHeader("Access-Control-Allow-Methods", "*");
 | ||
|  |         /* 重新预检验跨域的缓存时间 (s) */
 | ||
|  |         response.setHeader("Access-Control-Max-Age", "3600");
 | ||
|  |         /* 允许跨域的请求头 */
 | ||
|  |         response.setHeader("Access-Control-Allow-Headers", "*");
 | ||
|  |         /* 是否携带cookie */
 | ||
|  |         response.setHeader("Access-Control-Allow-Credentials", "true");
 | ||
|  |         try (PrintWriter pw = response.getWriter()) {
 | ||
|  |             pw.write(JsonHelper.toJsonString(data));
 | ||
|  |             pw.flush();
 | ||
|  |         } catch (IOException e) {
 | ||
|  |             e.printStackTrace();
 | ||
|  |         }
 | ||
|  |     }
 | ||
|  | }
 |