开发不需要登录s-HR就可以调用的接口原创
金蝶云社区-云社区用户4eh7396
云社区用户4eh7396
40人赞赏了该文章 5883次浏览 未经作者许可,禁止转载编辑于2021年09月07日 15:37:24

s-HR中的大部分接口都是需要先单点登录,登录成功之后才可以。那么如何开发不需要登录就可以调用的接口呢?


目前了解的方案有两个,第一种:自定义servlet;第二种:自定义controller。下面就介绍这两种

一、自定义servlet

①、新建servlet类

package com.kingdee.shr.test.web.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CloudTestServlet extends HttpServlet {        
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      System.out.println("cloudtestServlet do get;");
      doPost(req, resp);
    } 
          
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      System.out.println("cloudtestServlet do post;");
    }
}

此处对于自定义的servlet全路径是没有要求的。

②、导出jar包并部署

导出jar包的步骤这里不描述。
将导出的jar放在{SHR-HOME}\eas\server\lib\sp\目录下即可。

③、 在web.xml中配置servlet

  • 这里需要说明一下,由于在服务器上有许多个web.xml,配置在不同路径下web.xml会影响后续ssoParameter.properties文件的修改已经接口访问的地址。此处只讲解与s-HR相关的。

  • 找到{EAS-HOME}\eas\server\deploy\easweb.ear\shr_web.war\WEB-INF\web.xml,添加自定义的servlet配置,记住这里配置的url-pattern,因为这是接口访问的路径

<!-- webApi servlet-->
   <servlet>
      <servlet-name>API ACCESS</servlet-name>
      <servlet-class>com.kingdee.shr.test.web.controller.CloudTestServlet</servlet-class>
   </servlet>
   <servlet-mapping>
      <servlet-name>API ACCESS</servlet-name>
      <url-pattern>/api/cloudTest</url-pattern>
   </servlet-mapping>

④、 在ssoParameter.properties中配置path

  • 找到{EAS-HOME}\eas\server\deploy\easweb.ear\shr_web.war\WEB-INF\sso\ssoParamemter.properties,在cas.client.UrlPattern的值后面加上第三步的url-pattern值,以英文分号隔开。

cas.client.UrlPattern={$假设这里是原本就有的值};/api/cloudTest

⑤、 修改apusic的web.xml配置

找到{EAS-HOME}\apusic\domains\server(1-n)\config\web.xml,注意以下配置是所有实例都需要修改。

  • 搜索param-name为allow_URLS(如果搜不到就搜allow),修改这里的param-value,以英文逗号隔开。

<init-param>
   <param-name>allow_URLS</param-name>
   <param-value>{$假设这里是原本就有的值},/shr/api/cloudTest</param-value>
</init-param>
  • 搜索“enableCSRFCheck_POST”,将true改成false

<init-param>
   <param-name>enableCSRFCheck_POST</param-name>
   <param-value>false</param-value>
</init-param>
  • 搜索“serverNameWhiteList”

<init-param>
   <!-- CSRF WHITE LIST,SPLIT BY , -->
   <param-name>serverNameWhiteList</param-name>
   <param-value>在原有值的基础上 + 英文逗号 + 第三方系统域名或者IP</param-value>
</init-param>
  • 请特别注意,这里添加的值为/shr/api/cloudTest,在path的前面多了/shr。

⑥、重启服务,大功告成

重启完成之后,自定义接口的访问地址为

http://127.0.0.1:6888/shr/api/cloudTest

二、自定义controller

自定义controller与自定义servlet有几大步骤是一样的

①、新建controller类

  • 注意这里对新建controller类的全路径是有要求的,可以通过查看{EAS-HOME}\eas\server\deploy\easweb.ear\shr_web.war\WEB-INF\properties\applicationContext.xml配置文件找到,扫描的被注解@controller标注的类的路径。我这边查到的是如下

<!-- 把标记了@Controller注解的类转换为bean -->
<context:component-scan base-package="com.kingdee" use-default-filters="false">
  <!--context:include-filter type="regex" expression="com.kingdee.bos.webframework.*Controller"/-->
  <!--context:include-filter type="regex" expression="com.kingdee.bos.webframework.component.*"/-->
  <context:include-filter type="regex" expression="com.kingdee.eas.hr.*.web.*.*Controller"/>
  <context:include-filter type="regex" expression="com.kingdee.shr.*.web.*.*Controller"/>
<!--<context:include-filter type="regex" expression="com.kingdee.bos.wafctrl.demo.select.SelectController"/>
  <context:include-filter type="regex" expression="com.kingdee.bos.wafctrl.demo.autoComplete.AutoCompleteController"/>
  <context:include-filter type="regex" expression="com.kingdee.bos.wafctrl.demo.grid.controller.PersonController"/>
  <context:include-filter type="regex" expression="com.kingdee.bos.wafctrl.demo.grid.controller.InvController"/>
  <context:include-filter type="regex" expression="com.kingdee.bos.wafctrl.demo.validator.validatorController"/>
  <context:include-filter type="regex" expression="com.kingdee.bos.wafctrl.demo.IndexController"/>
  <context:include-filter type="regex" expression="com.kingdee.bos.wafctrl.demo.f7.grid.GridController"/>
  <context:include-filter type="regex" expression="com.kingdee.bos.wafctrl.demo.f7.quick.QuickController"/>
  <context:include-filter type="regex" expression="com.kingdee.bos.wafctrl.demo.tree.TreeController"/>
  <context:include-filter type="regex" expression="com.kingdee.bos.wafctrl.demo.fileupload.controller.FileUploadDemoController"/> -->
</context:component-scan>

所以我这边的controller类的路径定义为com.kingdee.shr.guilogin.web.controller.MyTestController

package com.kingdee.shr.guilogin.web.controller;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/mytest")
public class MyTestController{        
   @RequestMapping(params = { "method=test" })        
   public String dotet(HttpServletRequest request,HttpServletResponse response){
      System.out.println("mytest -method = test");                
      try {
          response.getWriter().write("test");
      } catch (IOException e) {                        
          // TODO Auto-generated catch block
          e.printStackTrace();
      }               
      return null;
   }

}

请一定要严格按照这种方式编写代码

②、 导出jar包并部署

参考 自定义servlet的第二步

③、 在ssoParameter.properties中配置path

  • 找到{EAS-HOME}\eas\server\deploy\easweb.ear\shr_web.war\WEB-INF\sso\ssoParamemter.properties,在cas.client.UrlPattern的值后面加上第三步的url-pattern值,以英文分号隔开。

cas.client.UrlPattern={$假设这里是原本就有的值},/mytest

④、 修改apusic的web.xml

  • 找到{EAS-HOME}\apusic\domains\server(1-n)\config\web.xml,搜索param-name为allow_URLS(如果搜不到就搜allow),修改这里的param-value,以英文逗号隔开。注意是所有实例都需要修

 <init-param>
    <param-name>allow_URLS</param-name>
    <param-value>{$假设这里是原本就有的值},/shr/mytest</param-value>
 </init-param>
  • 请特别注意,这里添加的值为/shr/mytest,在path的前面多了/shr。

当前配置文件还有两处需要修改,可参考 自定义servlet的第五步

⑤、 重启服务,大功告成

重启完成之后,自定义接口的访问地址为

http://127.0.0.1:6888/shr/mytest.do?method=test

可能有疑问,为什么这里 mytest 需要加上 .do 呢,通过查看{EAS-HOME}\eas\server\deploy\easweb.ear\shr_web.war\WEB-INF\web.xml,发现其中有这一段

<servlet>
  <servlet-name>MVCServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/properties/applicationContext.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>MVCServlet</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>

想要dispatcher,那就要遵循规则

三、常见问题

①、 调用接口出现404或者403

  • 找到{EAS-HOME}\apusic\domains\server(1-n)\config\web.xml, 搜索“enableCSRFCheck”,将这里的值改成false,重启服务。

<init-param>
    <param-name>enableCSRFCheck</param-name>
    <param-value>false</param-value>
</init-param>

如果重启服务之后还是404,那就真的是404 not found,这个就自行分析吧。

②、 SHRContext.getInstance().getContext()报错

  • 注意我们的接口都是在不登录的情况下调用的,所以这里想要获取各种Context或者使用 ***Factory.getLocalInstance(ctx)这种方式肯定是不行的。有什么解决方案。。。没研究过


没有验证过很多注解,比如@requestParam,@PathVariable,感兴趣的同学可以自行验证然后反馈在评论区。


赞 40