From aaecad11c07af732dea370f828df88aad5ab9e6e Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Sat, 13 May 2017 11:19:48 +0800 Subject: [PATCH] --- convert.html | 2 +- net.html | 7 ++++++- plugin_rest.html | 6 +++--- redkale.html | 4 ++-- service.html | 31 +++++++++++++++---------------- 5 files changed, 27 insertions(+), 23 deletions(-) diff --git a/convert.html b/convert.html index a43277dd6..5ed159268 100644 --- a/convert.html +++ b/convert.html @@ -191,7 +191,7 @@ //获取用户自己的信息 @HttpMapping(url = "/user/myinfo") public void mydetail(HttpRequest req, HttpResponse resp) throws IOException { - int userid = currentUser(req).getUserid(); //获取当前用户ID + int userid = req.currentUser().getUserid(); //获取当前用户ID UserSimpleInfo user = service.findUserInfo(userid); resp.finishJson(detailConvert, user); // 包含用户的注册时间和注册地址字段信息 } diff --git a/net.html b/net.html index 73cfc4297..5ffd0cbdc 100644 --- a/net.html +++ b/net.html @@ -89,7 +89,12 @@ //moduleid值来自 @WebServlet.moduleid()用于定义模块ID; actionid值自来@HttpMapping.actionid()用于定义操作ID; 需要系统化的鉴权需要定义这两个值 @Override public void authenticate(HttpRequest request, HttpResponse response) throws IOException { - UserInfo info = currentUser(request); + UserInfo info = request.currentUser(); + if (info == null) { + String sessionid = request.getSessionid(false); + if (sessionid != null) info = userService.current(sessionid); + if (info != null) request.currentUser(info); //必须赋值给request.currentUser + } if (info == null) { response.finishJson(RetCodes.retResult(RetCodes.RET_USER_UNLOGIN)); return; diff --git a/plugin_rest.html b/plugin_rest.html index 6fcf06be7..88caaff55 100644 --- a/plugin_rest.html +++ b/plugin_rest.html @@ -44,7 +44,7 @@ <server protocol="HTTP" port="6060" interceptor="org.redkalex.rest.RestNodeInterceptor"> <!-- REST的核心配置项 - base: REST服务的BaseServlet,必须是 org.redkalex.rest.RestServlet 的子类,该属性值没有默认值,必须指定。 + base: REST服务的BaseServlet,必须是 org.redkale.net.http.HttpServlet 的子类,且子类必须标记@HttpUserType。 autoload:默认值"true" 默认值. 加载当前server所能使用的Servce对象; mustsign:默认值"true" 是否只加载标记为RestController的Service类,默认加载所有可用Service includes:当autoload="true", 拉取类名与includes中的正则表达式匹配的类, 多个正则表达式用分号;隔开 @@ -61,9 +61,9 @@ </application>

-         通常配置都需要编写一个 org.redkalex.rest.RestServlet 子类,主要用于获取当前用户信息和鉴权,且必须指定具体的User对象类。开发者的实现类可以参考 redkale-demo 中的BaseServlet类,以下是一个简单的范例:
+         通常配置都需要编写一个 org.redkale.net.http.HttpServlet 子类,主要用于获取当前用户信息和鉴权,且必须指定具体的User对象类。开发者的实现类可以参考 redkale-demo 中的BaseServlet类,以下是一个简单的范例:

-
public class SimpleRestServlet extends RestServlet<UserInfo> {
+            
public class SimpleRestServlet extends HttpServlet<UserInfo> {
 
     protected static final RetResult RET_UNLOGIN = RetCodes.retResult(RetCodes.RET_USER_UNLOGIN);
 
diff --git a/redkale.html b/redkale.html
index a6b45441c..88199a5df 100644
--- a/redkale.html
+++ b/redkale.html
@@ -633,13 +633,13 @@
         
         <!-- 
            REST的核心配置项, 存在[rest]节点则Server启动时会加载REST服务, 当Server为SNCP协议时,则SncpServer会变成REST的HttpServer, 节点可以多个
-           base:     REST服务的BaseServlet,必须是 org.redkale.net.http.RestServlet 的子类,该属性值默认值为 org.redkale.net.http.RestServlet。
+           base:     REST服务的BaseServlet,必须是org.redkale.net.http.HttpServlet的子类,且子类必须标记 @HttpUserType
            autoload:默认值"true"  默认值. 加载当前server所能使用的Servce对象;    
            mustsign:默认值"true" 是否只加载标记为RestService的Service类,默认只加载标记RestService且ignore=false的Service
            includes:当autoload="true", 拉取类名与includes中的正则表达式匹配的类, 多个正则表达式用分号;隔开
            excludes:当autoload="true", 排除类名与excludes中的正则表达式匹配的类, 多个正则表达式用分号;隔开
         -->
-        <rest base="org.redkale.net.http.DefaultRestServlet" mustsign="false" autoload="true" includes="" excludes="">
+        <rest base="org.redkale.net.http.HttpServlet" mustsign="false" autoload="true" includes="" excludes="">
             <!-- 
                value:  Service类名,列出的表示必须被加载的Service对象
                ignore: 是否忽略,设置为true则不会加载该Service对象,默认值为false
diff --git a/service.html b/service.html
index 747f7dbe5..a75733195 100644
--- a/service.html
+++ b/service.html
@@ -290,7 +290,7 @@
             

        生成远程模式Service时发现参数带有@RpcCall注解的方法,在远程调用返回结果时会进行回调处理。

Service REST

-

        RestService提供类似Spring Boot的功能。开启REST功能的HTTP Server在实例化标记为@RestService的Service后自动生成对应的HttpServlet,免去开发人员编写HttpServlet的工作量。RestService生成的HttpServlet均是RestServlet的子类。主要通过@RestService@RestMapping@RestParam这三个注解来实现,同时为了获取其他类型的参数也有@RestAddress@RestCookie@RestHeader@RestSessionid@RestBody 提供其扩展功能。

+

        RestService提供类似Spring Boot的功能。开启REST功能的HTTP Server在实例化标记为@RestService的Service后自动生成对应的HttpServlet,免去开发人员编写HttpServlet的工作量。主要通过@RestService@RestMapping@RestParam这三个注解来实现,同时为了获取其他类型的参数也有@RestAddress@RestCookie@RestHeader@RestSessionid@RestBody 提供其扩展功能。

    @RestService :

@@ -391,13 +391,13 @@
         <!-- 
            REST的核心配置项, 存在[rest]节点则Server启动时会加载REST服务, 当Server为SNCP协议时,则SncpServer会变成REST的HttpServer, 节点可以多个
-           base:     REST服务的BaseServlet,必须是 org.redkale.net.http.RestServlet 的子类,该属性值默认值为 org.redkale.net.http.RestServlet。
+           base:     REST服务的BaseServlet,必须是org.redkale.net.http.HttpServlet的子类,且子类必须标记 @HttpUserType
            autoload:默认值"true"  默认值. 加载当前server所能使用的Servce对象;    
            mustsign:默认值"true" 是否只加载标记为RestService的Service类,默认只加载标记RestService且ignore=false的Service
            includes:当autoload="true", 拉取类名与includes中的正则表达式匹配的类, 多个正则表达式用分号;隔开
            excludes:当autoload="true", 排除类名与excludes中的正则表达式匹配的类, 多个正则表达式用分号;隔开
         -->
-        <rest base="org.redkale.net.http.RestServlet" mustsign="true" autoload="true" includes="" excludes="">
+        <rest base="org.redkale.net.http.HttpServlet" mustsign="true" autoload="true" includes="" excludes="">
             <!-- 
                value:  Service类名,列出的表示必须被加载的Service对象
                ignore: 是否忽略,设置为true则不会加载该Service对象,默认值为false
@@ -407,9 +407,10 @@
                 

        Redkale中的REST并非严格遵循标准的REST规范,在尽量满足规范的同时也考虑到开发的灵活性和简易性。以下通过简单的实例来说明其特性。

-         通常配置都需要编写一个 org.redkale.net.http.RestServlet 子类,主要用于获取当前用户信息和鉴权,且必须指定具体的User对象类。开发者的实现类可以参考 redkale-demo 中的BaseServlet类,以下是一个简单的范例:
+         通常配置都需要编写一个 org.redkale.net.http.HttpServlet 子类,主要用于获取当前用户信息和鉴权,且必须指定具体的User对象类。开发者的实现类可以参考 redkale-demo 中的BaseServlet类,以下是一个简单的范例:

-
public class SimpleRestServlet extends RestServlet<UserInfo> {
+            
@HttpUserType(UserInfo.class)
+public class SimpleRestServlet extends HttpServlet {
 
     protected static final RetResult RET_UNLOGIN = RetCodes.retResult(RetCodes.RET_USER_UNLOGIN);
 
@@ -418,22 +419,20 @@
     @Resource
     private UserService userService;
 
-    //获取当前用户信息
-    @Override
-    protected UserInfo currentUser(HttpRequest req) throws IOException {
-        String sessionid = req.getSessionid(false);
-        if (sessionid == null || sessionid.isEmpty()) return null;
-        return userService.current(sessionid);
-    }
-
     //普通鉴权
     @Override
     public void authenticate(HttpRequest request, HttpResponse response) throws IOException {
-        UserInfo info = currentUser(request);
+
+        UserInfo info = request.currentUser();
+        if (info == null) {
+            String sessionid = request.getSessionid(false);
+            if (sessionid != null) info = userService.current(sessionid);
+            if (info != null) request.currentUser(info); //必须赋值给request.currentUser
+        }
         if (info == null) {
             response.finishJson(RET_UNLOGIN);
             return;
-        } else if (!info.checkAuth(module, actionid)) {
+        } else if (!info.checkAuth(request.getModuleid(), request.getActionid())) {
             response.finishJson(RET_AUTHILLEGAL);
             return;
         }
@@ -546,7 +545,7 @@
                 

-         根据默认命名规则可以看出,以上范例生成的RestServlet与去掉所有@RestService、@RestMapping、@RestParam后的Service生成的是完全相同的。 REST根据Service会动态生成HttpServlet,以上范例自动生成的HttpServlet如下:
+         根据默认命名规则可以看出,以上范例生成的HttpServlet与去掉所有@RestService、@RestMapping、@RestParam后的Service生成的是完全相同的。 REST根据Service会动态生成HttpServlet,以上范例自动生成的HttpServlet如下:

@WebServlet(value = {"/hello/*"}, repair = true)