1.说明

在项目开发过程中,可能读者会有这样的需求,那就是你需要提供接口供第三方系统来获取你们系统某个业务的信息。这样的需求其实是在支付系统会更为常见。笔者曾经做过某大型公司的支付系统的接口。我们需求提供大量的接口来供第三方系统来调用。这些接口的返回信息可以是json的格式,亦可是xml的。可能说了这么多,无非就是java中的一门技术,叫RESTful。笔者在博客已经写过SpringMVC的RESTful的用法,笔者可以了解一下。今天,我们将要学习如何使用Spring的框架和CXF的框架来实在拦截身份验证和接口提供提供。

2.CXF的拦截器

一看到拦截器,我想读者可能最先想到的是Struts,是的Struts的拦截器是我们项目开发中最为常用的,但这里我们不讲Struts,我们主要是讨论CXF的拦截器.要想实例CXF的拦截器,我们需要引入cxf-2.3.6.jar架包。并且我们在加载Spring的时候,需要加载这个拦截器。笔者的Spring配置文件命名为applicationContext-webservice.xml。读者也可以自己命名。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jaxws="http://cxf.apache.org/jaxws"xmlns:simple="http://cxf.apache.org/simple"xmlns:soap="http://cxf.apache.org/bindings/soap"xmlns:cxf="http://cxf.apache.org/core"xsi:schemaLocation="http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsdhttp://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsdhttp://cxf.apache.org/simple http://cxf.apache.org/schemas/simple.xsdhttp://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <import resource="classpath:META-INF/cxf/cxf.xml" /><import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /><import resource="classpath:META-INF/cxf/cxf-servlet.xml" /><!-- 全局Bus(输入拦截器) --><cxf:bus><cxf:inInterceptors><bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/><bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" /> <ref bean="readSoapHeader"/></cxf:inInterceptors></cxf:bus><!--获取Student信息--><jaxws:endpoint id="studentService" implementor="#StudentService"address="/StudentService" />
</beans>

读者已经看到了拦截器是对全局进行拦截的,同时我们引入的CXF的两个拦截器,分别是LoggingInInterceptor和SAAJInterceptor的拦截器。可能读者会有疑惑,那个bean的配置readSopHeader是什么玩意儿。其实这个是我们自己定义的一个拦截器SoapHeaderInterceptor,并交给Spring管理的。这个拦截器主要是继承AbstractPhaseInterceptor。也就是对访问的消息头进行拦截判断。

@Component(value="readSoapHeader")
public class SoapHeaderInterceptor  extends AbstractPhaseInterceptor<SoapMessage>
{//权限管理@Autowired(required=false)private AuthenticationManager authenticationManager;public SoapHeaderInterceptor() {super(Phase.PRE_PROTOCOL);//添加SAAJInterceptor拦截器getAfter().add(SAAJInInterceptor.class.getName());}/*** @param meaasge 消息头信息*/@Overridepublic void handleMessage(SoapMessage message) throws Fault {//输入用户名与密码,代表用户的信息。这里笔者将其写固定,实际可以写在配置文件或从访问者的信息中提取UsernamePasswordAuthenticationToken adminAuth = new UsernamePasswordAuthenticationToken("admin","123456");//对身份信息管理Authentication authenticatedUser = authenticationManager.authenticate(adminAuth); //身份信息需要进一步去后台数据库进行判断是否正确//放入上下文中,就会去调用UserDetailsService,做进一步判断SecurityContextHolder.getContext().setAuthentication(authenticatedUser);  }
}

以上的代码,我们看到了handleMessage和方法,这个方法主要是对访问的对象进行身份验证的。关于身份验证,我们下面将会讲。

3.Spring的身份验证

身份验证说是对于请求者的用户名、密码、账户情况、凭证情况进行验证的。要想使用Spring的身份验证,除了项目开发需要引入的常用的Spring架包以外,读者还要引入这几个架包,分另是:spring-security-cas-3.1.4 .RELEAS.jar、spring-security-config-3.1.4.RELEASE.jar、spring-security-core-3.1.4.RELEASE.jar.

Spring的身份验证,我们主要用到的Spring的bean对象AuthenticationManager,这个对象要对用户的用户名和密码进行管理。所以,为了在普通类中可以自动加载这个bean,我们需要创建一个Spring的xml文件来配置。这个文件在笔者的项目中是叫:applicationContext-security.xml。读者可以自己命名。

<?xml version="1.0" encoding="UTF-8"?><beans:beans xmlns="http://www.springframework.org/schema/security"xmlns:beans="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"><beans:bean id="userDetailServiceImpl" class="com.owen.spring.cxf.ws.service.impl.UserDetailServiceImpl" /><authentication-manager alias="authenticationManager" ><authentication-provider user-service-ref="userDetailServiceImpl" /></authentication-manager></beans:beans>

正如读者看到的,我们将AuthenticationManager对象所需要授权的对象是UserDetailService.也就是说用户的信息是否验证通过,是在UserDetailService的对象中做判断的。而UserDetailServicee也是Spring的内置对你,只是我们在使用的时候,需要继承它的接口UserDetailService.在笔者的项目中,继承的类名为UserDetailServiceImpl。

/*** 将身份信息通过后台,即数据库进行判断是否有此用户* @author Owen William* @Date 2017-4-15**/
public class UserDetailServiceImpl implements UserDetailsService
{/*** @param username 用户名称,通过身份管理的上下文中拿*/@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{boolean userIsEnabled = true;  //用户是否有效boolean accountNonExpired = true; //账户没有过期boolean credentialsNonExpired = true;//凭证没有过期boolean accountNonLocked = true;//账户没有锁//此处可以对用户名,去数据库查询是否有该用户,//如有,可以继续向下执行,否则就直接返回List<GrantedAuthority> authsList = new ArrayList<GrantedAuthority>();authsList.add(new SimpleGrantedAuthority("admin"));//有权限的用户,用户与密码与SoapHeaberInterceptor中配置一致UserDetails userdetails = new User("admin", "123456",userIsEnabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authsList);return userdetails;}}

细心的读者已经看到了,代码中有个类UserDetails,是的,这个类就是创建一个User,这个User需要的用户信息是授权的,所以会有用户名、密码、用户有效情况、用户账户是否过期、用户是否锁住的判断。这里需要注意的是,输入用户名与密码时,要是消息头获取的用户名与密码一致,也就是在AbstractPhaseInterceptor的handleMessage中输入的用户名、密码一致。笔者在这里用户名与密码都是写固定的,现实情况是要从消息头获取或从数据库中获取的。

4.接口返回RESTful信息

RESTful正常的情况是提供api给请求者,SpringMVC的RESTful的使用笔者认为是最简单的易懂的,读者已经在博客中写过关于SpringMVC的RESTful的使用,兴趣的读者可以自己查看。这里我们使用的是CXF的技术,同时我们返回的结果也是JSON的格式。

使用CXF的技术,我们首先需要在web.xml的文件中配置我们提供给访问者的http地址形式。如,我们相要访问者通过这个的访问http://localhost:8080/SpringCxfWS/ws/接口名/接口方法?参数&参数...,那么就需要这样去配置web.xml文件

<!-- CXF web service configuration start--><servlet><servlet-name>CXFServlet</servlet-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class><load-on-startup>1</load-on-startup></servlet>
<!-- 访问地址:http://localhost:8080/SpringCxfWS/ws/接口名/接口方法?参数&参数... --><servlet-mapping><servlet-name>CXFServlet</servlet-name><url-pattern>/ws/*</url-pattern></servlet-mapping><!-- CXF web service configuration end-->

细心的读者已经察觉到了,这个文件只能说明访问者是通过http://localhost:8080/SpringCxfWS/ws的地址访问,不能说明后面的接口名与接口方法还接口的参数呀。All Right!其实我们还需要在applicationContext-webservice.xml的文件中配置,配置如下的信息。

 <!--获取Student信息--><jaxws:endpoint id="studentService" implementor="#StudentService"address="/StudentService" />

Ok,现在可以说明访问者可以访问到 http://localhost:8080/SpringCxfWS/ws/StudentSerivce的地址,那后面的参数如何传入呢?及最后的JSON格式怎样去定义呢?看下面的代码,相信聪明的你是可以明白的。

@Component(value = "StudentService")
@WebService(serviceName="StudentService")//与配置文件xml中的一样
public class StudentServiceImpl implements StudentService
{@WebResult(name="studentInfo") //返回标签的名称@WebMethod(operationName="getStudentInfo") //提供接口方法public String getStudentInfo(@WebParam(name="name") String name,@WebParam(name="age") String age) {//创建Json对象JSONObject obj = new JSONObject();//此处为笔者固定填写信息,实际会从数据库中获取Student stu = new Student(name==null? "owen" : name,"深圳市南山区科技园",age == null? 20 : Integer.valueOf(age),"13577774444");//将信息封闭为json的格式obj.put("name",stu.getName());obj.put("address",stu.getAddress());obj.put("age", stu.getAge());obj.put("phone", stu.getPhone());return obj.toString();}}

5.最终效果

访问地址:http://localhost:8080/SpringCxfWS/ws/StudentService/getStudentInfo?name=www&age=18



                           源码地址:git@github.com:owenwilliam/SpringCxfWS.git

Spring身份验证+CXF拦截器+RESTful相关推荐

  1. CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)

    CXF拦截器使用,创建一个使用SOAPHeader的安全验证xml格式: <soap:Header><auth:authentication xmlns:auth="htt ...

  2. 【WebService】CXF拦截器的设置以及自定义CXF拦截器

    欢迎关注我新搭建的博客:http://www.itcodai.com/ WebService系列文章: [WebService]带你走进webservice的世界 [WebService]自定义Web ...

  3. spring mvc中的拦截器

    本文说下spring MVC中的拦截器 文章目录 拦截器介绍 拦截器注入适配器 自定义拦截器 controller测试 测试结果 本文小结 拦截器介绍 拦截器是在servlet执行之前执行的程序(这里 ...

  4. cxf拦截器,实现对接收到的报文和发送出去的报文格式自定义

    看此篇文章之前可以看看我的这篇文章,有助于更好的理解webservice和这篇文章 http://blog.csdn.net/zhaofuqiangmycomm/article/details/787 ...

  5. spring过滤器Filter 、 拦截器Interceptor 、 切片Aspect 详解

    springboot 过滤器Filter vs 拦截器Interceptor vs 切片Aspect 详解 1 前言 最近接触到了过滤器和拦截器,网上查了查资料,这里记录一下,这篇文章就来仔细剖析下过 ...

  6. Spring AOP原理及拦截器

    原理 AOP(Aspect Oriented Programming),也就是面向方面编程的技术.AOP基于IoC基础,是对OOP的有益补充. AOP将应用系统分为两部分,核心业务逻辑(Core bu ...

  7. spring 两次进入拦截器_过滤器和拦截器的 6 个区别,别再傻傻分不清了

    点击上方 肉眼品世界,选择 设为星标 深度价值体系传递 作者 :程序员内点事 来源 :toutiao.com/i6834310440495874563 毕竟这两种工具开发中用到的频率都相当高,应用起来 ...

  8. Spring MVC中的拦截器/过滤器HandlerInterceptorAdapter的使用

    转载自 https://www.cnblogs.com/EasonJim/p/7704740.html 一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的 而在Spring中,基于Filt ...

  9. Spring的一种拦截器SimpleUrlHandlerMapping

    spring的一种拦截器,用于在XML文件中配置以拦截url,它是以map映射的方式进行拦截.映射是从前台urls到具体后台的beans.同时支持到bean实例和bean名称的映射,后者要求非单实例控 ...

  10. java SpringBoot登录验证token拦截器

    用户访问接口验证,如果用户没有登录,则不让他访问除登录外的任何接口. 实现思路: 1.前端登录,后端创建token(通过JWT这个依赖),返给前端 2.前端访问其他接口,传递token,后端判断tok ...

最新文章

  1. json-lib把XML转化为json
  2. 汇编指令mrs_汇编指令 - Mrs.kang - 博客园
  3. iOS 快速定位到系统设置界面
  4. OpenCV中像素逻辑运算:逻辑或运算
  5. 《天天数学》连载38:二月七日
  6. sql两个in并列_SQL窗口函数
  7. 白板机器学习笔记 P39-P45 指数族分布
  8. MIG IP学习笔记
  9. vivado 一次性设置多线程编译
  10. Mysql GROUP_CONCAT 使用注意事项
  11. Linux从入门到入土①(Linux概述、文件系统、VIM编辑器)
  12. CSS 3之美化表格样式
  13. 毕设开题报告重要内容
  14. Intent直接跳转到Fragment
  15. 关于电子科技大学寝室电费缴费情况和满意度的调研
  16. 机器学习中的数学——常用概率分布(三):二项分布(Binomial分布)
  17. Unity 的Position和Rotation问题(坑)
  18. Severstal: Steel Defect Detection竞赛
  19. b2b2c o2o 多商家入驻商城 直播带货商城 电子商务
  20. C语言 图形任意多次平移、旋转、缩放和对称的变换方案

热门文章

  1. 查找目录下的所有文件中是否含有某个字符串
  2. Android--android 中自定义菜单
  3. springside4例子
  4. web安全day26:今天,算是把linux的用户管理弄明白了
  5. 110道Python面试题(真题)
  6. Security+ 学习笔记23 帐户管理
  7. 前缀列表技术原理和实验(华为设备)
  8. BGP过滤器原理和实验(华为设备)
  9. DHCP中继原理和配置(含常见配置配置误区)
  10. Java实现冒泡排序及逆序冒泡排序