java WebService CXF Spring 自定义拦截器 附实例源码

2. soap消息:请求消息和响应消息

3 http+xml片段

SEI:WebServiceEndPoint Interface(终端)


直译: web service的终端接口,

1. 就是WebService服务器端用来处理请求的接口

CXF:Celtix +XFire

一个apache的用于开发webservice服务器端和客户端的框架

3、WebService的两个重要组成部分

http协议

1. 请求的组成:

请求行(请求方式  path http1.1)

请求头

请求体:只有post请求有

2. 响应的组成

响应状态行:

响应头

响应体: 浏览器解析显示的数据

3. 请求的过程

**

**

**Schema约束

**

1.namespace

相当于schema文件的id

2.targetNamespace属性

用来指定schema文件的namespace的值

3.xmlns属性

引入一个约束,它的值是一个schema文件的namespace值

4.schemaLocation属性

用来指定引入的schema文件的位置

目录结构

新建一个接口类

package com.iflyee.cxf;

import javax.jws.WebService;

@WebService

public interface Ivo {

public boolean vo(String username,int count);

public int getvousernameCount();

public int getvocount();

public String build01();

public String xml();

}

package com.iflyee.cxf;

import java.util.ArrayList;

import javax.jws.WebService;

import org.dom4j.Document;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

@WebService

public class Vo implements Ivo {

//添加属性

private static int pt;

private static int ut;

public int getvocount() {

// TODO Auto-generated method stub

return pt;

}

public int getvousernameCount() {

// TODO Auto-generated method stub

return ut;

}

public boolean vo(String username, int count) {

ut++;

pt+=count;

return true;

}

public String build01(){

//DocumentHelper提供了创建Document对象的方法

Document document = DocumentHelper.createDocument();

try {

//添加节点信息

Element rootElement = document.addElement(“modules”);

//这里可以继续添加子节点,也可以指定内容

rootElement.setText(“这个是module标签的文本信息”);

Element element = rootElement.addElement(“module”);

for (int i = 0; i < 5; i++) {

Element nameElement = element.addElement(“name”);

Element valueElement = element.addElement(“value”);

Element descriptionElement = element.addElement(“description”);

nameElement.setText(“名称”+i);

nameElement.addAttribute(“language”, “java”+i);//为节点添加属性值

valueElement.setText(“值”+i);

valueElement.addAttribute(“language”, “c#”+i);

descriptionElement.setText(“描述”+i);

descriptionElement.addAttribute(“language”, “sql server”+i);

}

System.out.println(document.asXML()); //将document文档对象直接转换成字符串输出

} catch (Exception e) {

e.printStackTrace();

}

return document.asXML();

}

public String xml(){

StringBuffer str = new StringBuffer();

str.append(“\n”);

APIUtils ap = new APIUtils();

User user = new User();

java.util.List list = new ArrayList();

list.add(1);

list.add(“张胜男”);

list.add(“xs111”);

list.add(2);

list.add(“张胜”);

list.add(“xs222”);

list.add(3);

list.add(“胜男”);

list.add(“xs333”);

for (int i = 0; i < 3; i++) {

str.append(ap.getXMLModel(user,list));

}

System.out.println(str);

str.append(“”);

APIUtils.num=0;

return str.toString();

}

}

package com.iflyee.cxf;

public class User {

private int id;

private String userName;

private String password;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

}

package com.lzw.springcxf.auth;

import java.util.List;

import org.apache.cxf.binding.soap.SoapMessage;

import org.apache.cxf.headers.Header;

import org.apache.cxf.interceptor.Fault;

import org.apache.cxf.phase.AbstractPhaseInterceptor;

import org.apache.cxf.phase.Phase;

import org.w3c.dom.Element;

import org.w3c.dom.NodeList;

public class AuthInterceptor extends AbstractPhaseInterceptor{

public AuthInterceptor() {

//拦截器在调用方法之前拦截SOAP消息

super(Phase.PRE_INVOKE);

System.out.println(“11111111111111111111111111111111111”);

}

/**

  • @Description: 拦截器操作

  • @param msg 被拦截到的SOAP消息

  • @throws Fault

*/

@Override

public void handleMessage(SoapMessage msg) throws Fault {

System.out.println(“==============================”);

System.out.println(“=自定义拦截器===”);

//获取SOAP消息的Header

List

headers = msg.getHeaders();

//如果没有Header

if(headers == null || headers.size() < 1) {

throw new Fault(new IllegalArgumentException(“没有Header,拦截器实施拦截”));

}

//获取Header携带是用户和密码信息

Header firstHeader = headers.get(0);

Element ele = (Element) firstHeader.getObject();

NodeList userIdEle = ele.getElementsByTagName(“userId”);

NodeList userPassEle = ele.getElementsByTagName(“userPass”);

if (userIdEle.getLength() != 1) {

throw new Fault(new IllegalArgumentException(“用户Id格式不对”));

}

if (userPassEle.getLength() != 1) {

throw new Fault(new IllegalArgumentException(“用户密码格式不对”));

}

//获取元素的文本内容

String userId = userIdEle.item(0).getTextContent();

String userPass = userPassEle.item(0).getTextContent();

if (!userId.equals(“lyy”) || !userPass.equals(“123456”)) {

throw new Fault(new IllegalArgumentException(“用户和密码不正确”));

}

}

}

package jp.co.service;

public interface TestService {

public String SayHello();

}

package jp.co.service.impl;

数据结构与算法

这一块在笔试、面试的代码题中考核较多,其中常考的数据结构主要有:数组、链表、队列、栈、Set、Map、哈希表等,不同数据结构有不同的方法以及储存原理,这些算是技术岗的必备知识。算法部分主要分为两大块,排序算法与一些其他算法题

排序算法根据考频高低主要有:快速排序、归并排序、堆排序、冒泡排序、插入排序、选择排序、希尔排序、桶排序、基数排序、Timsort这十种,这类考核点要么是算法的时间、空间复杂度、稳定度,要么是直接手写代码,故在理解算法原理的同时,对JS语言版的排序算法代码也要加强记忆。

  • 二叉树层序遍历
  • B 树的特性,B 树和 B+树的区别
  • 尾递归
  • 如何写一个大数阶乘?递归的方法会出现什么问题?
  • 把多维数组变成一维数组的方法
  • 知道的排序算法 说一下冒泡快排的原理
  • Heap 排序方法的原理?复杂度?
  • 几种常见的排序算法,手写
  • 数组的去重,尽可能写出多个方法
  • 如果有一个大的数组,都是整型,怎么找出最大的前 10 个数
  • 知道数据结构里面的常见的数据结构
  • 找出数组中第 k 大的数组出现多少次,比如数组【1,2, 4,4,3,5】第二大的数字是 4,出现两次,所以返回 2
  • 合并两个有序数组
  • 给一个数,去一个已经排好序的数组中寻找这个数的位 置(通过快速查找,二分查找)

、队列、栈、Set、Map、哈希表等**,不同数据结构有不同的方法以及储存原理,这些算是技术岗的必备知识。算法部分主要分为两大块,排序算法与一些其他算法题

排序算法根据考频高低主要有:快速排序、归并排序、堆排序、冒泡排序、插入排序、选择排序、希尔排序、桶排序、基数排序、Timsort这十种,这类考核点要么是算法的时间、空间复杂度、稳定度,要么是直接手写代码,故在理解算法原理的同时,对JS语言版的排序算法代码也要加强记忆。

  • 二叉树层序遍历
  • B 树的特性,B 树和 B+树的区别
  • 尾递归
  • 如何写一个大数阶乘?递归的方法会出现什么问题?
  • 把多维数组变成一维数组的方法
  • 知道的排序算法 说一下冒泡快排的原理
  • Heap 排序方法的原理?复杂度?
  • 几种常见的排序算法,手写
  • 数组的去重,尽可能写出多个方法
  • 如果有一个大的数组,都是整型,怎么找出最大的前 10 个数
  • 知道数据结构里面的常见的数据结构
  • 找出数组中第 k 大的数组出现多少次,比如数组【1,2, 4,4,3,5】第二大的数字是 4,出现两次,所以返回 2
  • 合并两个有序数组
  • 给一个数,去一个已经排好序的数组中寻找这个数的位 置(通过快速查找,二分查找)

[外链图片转存中…(img-f3nkVjnN-1719215361261)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值