本文介绍了在s-HR系统中开发无需登录即可调用的接口的两种方案:自定义servlet和自定义controller。自定义servlet需要新建servlet类、导出jar包并部署、在web.xml中配置servlet、在ssoParameter.properties中配置path、修改apusic的web.xml配置,并重启服务。自定义controller步骤类似,但需注意controller类的路径定义和url-pattern的配置。此外,还讨论了常见问题如404或403错误以及SHRContext获取错误,并提供了可能的解决方案。
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,感兴趣的同学可以自行验证然后反馈在评论区。
推荐阅读