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.
		
		
		
		
			
				
					
					
						
							143 lines
						
					
					
						
							5.5 KiB
						
					
					
				
			
		
		
	
	
							143 lines
						
					
					
						
							5.5 KiB
						
					
					
				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();
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 |