增加@RestUserid 废弃 HttpRequest.currentUser() 方法, 建议 HttpRequest.currentUserid()

This commit is contained in:
Redkale
2020-05-28 20:20:08 +08:00
parent 30a0b12020
commit 740bc8ae31
3 changed files with 107 additions and 2 deletions

View File

@@ -72,6 +72,8 @@ public class HttpRequest extends Request<HttpContext> {
protected Annotation[] annotations;
protected Serializable currentUserid;
protected Object currentUser;
private final ByteArray array = new ByteArray();
@@ -273,6 +275,34 @@ public class HttpRequest extends Request<HttpContext> {
}
/**
* 设置当前用户ID, 通常在HttpServlet.preExecute方法里设置currentUserid <br>
* 数据类型通常是int、long、String
*
* @param <T> 泛型
* @param user 用户信息
*
* @return HttpRequest
*/
public <T extends Serializable> HttpRequest setCurrentUserid(T userid) {
this.currentUserid = userid;
return this;
}
/**
* 获取当前用户ID<br>
*
* @param <T> 通常是int、long、String类型
*
* @return 用户信息
*/
@SuppressWarnings("unchecked")
public <T extends Serializable> T currentUserid() {
return (T) this.currentUserid;
}
/**
* @Deprecated
* 建议使用 setCurrentUserid, 通过userid从Service或缓存中获取用户信息<br>
* 设置当前用户信息, 通常在HttpServlet.preExecute方法里设置currentUser <br>
* 数据类型由&#64;HttpUserType指定
*
@@ -281,12 +311,15 @@ public class HttpRequest extends Request<HttpContext> {
*
* @return HttpRequest
*/
@Deprecated
public <T> HttpRequest setCurrentUser(T user) {
this.currentUser = user;
return this;
}
/**
* @Deprecated
* 建议使用 currentUserid, 通过userid从Service或缓存中获取用户信息<br>
* 获取当前用户信息<br>
* 数据类型由&#64;HttpUserType指定
*
@@ -294,6 +327,7 @@ public class HttpRequest extends Request<HttpContext> {
*
* @return 用户信息
*/
@Deprecated
@SuppressWarnings("unchecked")
public <T> T currentUser() {
return (T) this.currentUser;
@@ -513,6 +547,7 @@ public class HttpRequest extends Request<HttpContext> {
this.moduleid = 0;
this.actionid = 0;
this.annotations = null;
this.currentUserid = null;
this.currentUser = null;
this.attachment = null;

View File

@@ -1067,6 +1067,18 @@ public final class Rest {
comment = annuri.comment();
}
RestUserid userid = param.getAnnotation(RestUserid.class);
if (userid != null) {
if (annhead != null) throw new RuntimeException("@RestUserid and @RestHeader cannot on the same Parameter in " + method);
if (anncookie != null) throw new RuntimeException("@RestUserid and @RestCookie cannot on the same Parameter in " + method);
if (annsid != null) throw new RuntimeException("@RestUserid and @RestSessionid cannot on the same Parameter in " + method);
if (annaddr != null) throw new RuntimeException("@RestUserid and @RestAddress cannot on the same Parameter in " + method);
if (annbody != null) throw new RuntimeException("@RestUserid and @RestBody cannot on the same Parameter in " + method);
if (annfile != null) throw new RuntimeException("@RestUserid and @RestUploadFile cannot on the same Parameter in " + method);
if (!ptype.isPrimitive() && !java.io.Serializable.class.isAssignableFrom(ptype)) throw new RuntimeException("@RestUserid must on java.io.Serializable Parameter in " + method);
comment = "";
}
RestParam annpara = param.getAnnotation(RestParam.class);
if (annpara != null) radix = annpara.radix();
if (annpara != null) comment = annpara.comment();
@@ -1100,7 +1112,7 @@ public final class Rest {
}
} while ((loop = loop.getSuperclass()) != Object.class);
}
paramlist.add(new Object[]{param, n, ptype, radix, comment, required, annpara, annsid, annaddr, annhead, anncookie, annbody, annfile, annuri, param.getParameterizedType()});
paramlist.add(new Object[]{param, n, ptype, radix, comment, required, annpara, annsid, annaddr, annhead, anncookie, annbody, annfile, annuri, userid, param.getParameterizedType()});
}
Map<String, Object> mappingMap = new LinkedHashMap<>();
@@ -1218,7 +1230,8 @@ public final class Rest {
RestBody annbody = (RestBody) ps[11];
RestUploadFile annfile = (RestUploadFile) ps[12];
RestURI annuri = (RestURI) ps[13];
java.lang.reflect.Type pgentype = (java.lang.reflect.Type) ps[14];
RestUserid userid = (RestUserid) ps[14];
java.lang.reflect.Type pgentype = (java.lang.reflect.Type) ps[15];
final boolean ishead = annhead != null; //是否取getHeader 而不是 getParameter
final boolean iscookie = anncookie != null; //是否取getCookie
@@ -1283,6 +1296,36 @@ public final class Rest {
mv.visitMethodInsn(INVOKEVIRTUAL, reqInternalName, "getRequestURI", "()Ljava/lang/String;", false);
mv.visitVarInsn(ASTORE, maxLocals);
varInsns.add(new int[]{ALOAD, maxLocals});
} else if (userid != null) { //HttpRequest.currentUserid
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKEVIRTUAL, reqInternalName, "currentUserid", "()Ljava/io/Serializable;", false);
if (ptype == int.class) {
mv.visitTypeInsn(CHECKCAST, "java/lang/Integer");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Integer", "intValue", "()I", false);
mv.visitVarInsn(ISTORE, maxLocals);
varInsns.add(new int[]{ILOAD, maxLocals});
} else if (ptype == float.class) {
mv.visitTypeInsn(CHECKCAST, "java/lang/Float");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Float", "floatValue", "()F", false);
mv.visitVarInsn(FSTORE, maxLocals);
varInsns.add(new int[]{FLOAD, maxLocals});
} else if (ptype == long.class) {
mv.visitTypeInsn(CHECKCAST, "java/lang/Long");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Long", "longValue", "()J", false);
mv.visitVarInsn(LSTORE, maxLocals);
varInsns.add(new int[]{LLOAD, maxLocals});
maxLocals++;
} else if (ptype == double.class) {
mv.visitTypeInsn(CHECKCAST, "java/lang/Double");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Double", "doubleValue", "()D", false);
mv.visitVarInsn(DSTORE, maxLocals);
varInsns.add(new int[]{DLOAD, maxLocals});
maxLocals++;
} else {
mv.visitTypeInsn(CHECKCAST, Type.getInternalName(ptype));
mv.visitVarInsn(ASTORE, maxLocals);
varInsns.add(new int[]{ALOAD, maxLocals});
}
} else if ("#".equals(pname)) { //从request.getRequstURI 中取参数
if (ptype == boolean.class) {
mv.visitVarInsn(ALOAD, 1);

View File

@@ -0,0 +1,27 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.redkale.net.http;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* 只能注解于Service类的方法的参数或参数内的Serializable字段
* <p>
* 用于获取HTTP请求端的用户ID HttpRequest.currentUserid
* <p>
* 详情见: https://redkale.org
*
* @author zhangjx
*/
@Inherited
@Documented
@Target({PARAMETER, FIELD})
@Retention(RUNTIME)
public @interface RestUserid {
}