一、Handel概念

  • J2EE Web 服务中的Handler技术特点非常像Servlet技术中的Filter。我们知道,在Servlet中,当一个HTTP到达服务端时,往往要经过多个Filter对请求进行过滤,然后才到达提供服务的Servlet,这些Filter的功能往往是对请求进行统一编码,对用户进行认证,把用户的访问写入系统日志等。相应的,Web服务中的Handler通常也提供一下的功能:
    • 对客户端进行认证、授权;
    • 把用户的访问写入系统日志;
    • 对请求的SOAP消息进行加密,解密;
    • 为Web Services对象做缓存。
    SOAP消息Handler能够访问代表RPC请求或者响应的SOAP消息。在JAX-RPC技术中,SOAP消息Handler可以部署在服务端,也可以在客户端使用。
  • handler可以作用于客户端,也可以作用了服务端

    handler分为:1、LogicalHandler:只能获取到soap消息的body。

           2、SOAPHandler:可以获取SOAPMessage的信息(我们通常用这种)。

  • 客户端--》服务端的请求中通过handler的顺序:

    假如客户端和服务端的handler-chain.xml中定义的顺序都是:LogicalHandler1/SOAPHandler1/LogicalHandler2/SOAPHandler2

    那么请求的顺序将是:

    client-->LogicalHandler1-->LogicalHandler2-->SOAPHandler1-->SOAPHandler2-->|服务器容器|-->SOAPHandler1-->SOAPHandler2-->LogicalHandler1-->LogicalHandler2-->service

二、案例

  • 效果:  客户端在调用服务端的时候,传过去用户名和密码,服务端判断用户名和密码是否正确。
  •   服务端

  2.1  编写服务接口和实现类

package services;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService; @WebService
public interface ILogin { @WebResult(name="loginResult")
public String login(@WebParam(name="userName")String userName,@WebParam(name="passWord")String passWord);
}
package services;

import javax.jws.HandlerChain;
import javax.jws.WebService; @WebService(endpointInterface = "services.ILogin")
@HandlerChain(file = "handler-chain.xml")
public class LoginImpl implements ILogin { @Override
public String login(String userName, String passWord) { return "welcome " + userName;
} }
  • @HandlerChain(file = "handler-chain.xml") 要配置,该注解指定了某个服务要执行的handleChain

  2.2  编写Handle

package com.handler;

import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext; public class LoginHandler implements SOAPHandler<SOAPMessageContext> { @Override
public boolean handleMessage(SOAPMessageContext context) {
System.out.println("run handleMessage method"); Boolean out = (Boolean) context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (!out) { try {
SOAPMessage message = context.getMessage();
SOAPPart part = message.getSOAPPart();
SOAPEnvelope envelope = part.getEnvelope();
SOAPBody body = envelope.getBody();
String userName = body.getElementsByTagName("userName").item(0).getTextContent();
String passWord = body.getElementsByTagName("passWord").item(0).getTextContent(); if (userName.equals("admin")) { if (passWord.equals("123")) { // 正确 return true; } else { throw new RuntimeException("密码错误或者为空");
} } else {
throw new RuntimeException("用户名错误或者为空"); } } catch (Exception e) {
e.printStackTrace();
return false; }
}
return true;
} @Override
public boolean handleFault(SOAPMessageContext context) {
System.out.println("run handleFault method");
return false;
} @Override
public void close(MessageContext context) {
System.out.println("run close method"); } @Override
public Set<QName> getHeaders() {
System.out.println("run getHeaders method");
return null;
} }
  • 如果handleMessage方法返回的是false,那么客户端收到的便是发送的soap消息(发送的soap消息,接收的也是这个消息),如果是返回true,则正确调用服务端的方法。

  2.3  编写handler-chain.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<javaee:handler-chains xmlns:javaee="http://java.sun.com/xml/ns/javaee"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<javaee:handler-chain>
<javaee:handler>
<javaee:handler-class>com.handler.LoginHandler
</javaee:handler-class>
</javaee:handler>
</javaee:handler-chain>
</javaee:handler-chains>

  2.4  发布服务

package publish;

import javax.xml.ws.Endpoint;

import services.LoginImpl;

public class publish {

    public static void main(String[] args) {
Endpoint.publish("http://localhost:8081/login", new LoginImpl());
System.out.println("服务启动成功......");
}
}

  • 客户端

  2.5  测试

package testMain;

import java.io.StringReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class TestMain {
public static void main(String[] args) {
try { /**
* 定义发送soap的消息
*/
StringBuffer str_xml = new StringBuffer();
str_xml.append(
" <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ser=\"http://services/\">");
str_xml.append(" <soapenv:Header/>");
str_xml.append(" <soapenv:Body>");
str_xml.append("<ser:login>");
str_xml.append(" <userName>admin</userName>");
str_xml.append("<passWord>123</passWord>");
str_xml.append("</ser:login>");
str_xml.append(" </soapenv:Body>");
str_xml.append(" </soapenv:Envelope>"); /**
* 定义post请求
*/
// 定义post请求地址
HttpPost httpPost = new HttpPost("http://localhost:8081/login?wsdl");
// 定义post请求的实体
HttpEntity entity = new StringEntity(str_xml.toString());
// 设置post请求的实体和头部
httpPost.setEntity(entity);
httpPost.setHeader("Content-Type", "text/xml; charset=UTF-8"); /**
* 发送请求并获取返回数据
*/ @SuppressWarnings("deprecation")
DefaultHttpClient client = new DefaultHttpClient();
// 发送请求并获取返回数据
HttpResponse response = client.execute(httpPost);
// 获取返回数据中的实体
HttpEntity respon_entity = response.getEntity();
// 将返回数据的实体转为字符串
String respon_str = EntityUtils.toString(respon_entity); // 解析字符串
SAXReader reader = new SAXReader();
Document document = reader.read(new StringReader(respon_str));
Element rootElement = document.getRootElement(); Element resultElement = rootElement.element("Body").element("loginResponse").element("loginResult");
String addResult = resultElement.getText();
System.out.println("loginResult = " + addResult); } catch (Exception e) {
e.printStackTrace();
}
}
}

  

  2.6  结果

用户名密码正确,成功调用服务端方法。

(十三)使用handler实现登录验证的更多相关文章

  1. nodeJS---express4+passport实现用户注册登录验证

    网上有很多关于passport模块使用方法的介绍,不过基本上都是基于express3的,本文介绍在express4框架中使用passport模块. 前言 passport是一个功能单一,但非常强大的一 ...

  2. 搭建开发框架Express,实现Web网站登录验证

    NodeJS学习笔记(一)——搭建开发框架Express,实现Web网站登录验证   JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需 ...

  3. SpringMVC之拦截器实现登录验证

    今天回头看之前发的javaweb学习路线图,发现把路线图中的也学的有一半多了,不过还是路漫漫.在前面的博客中有学习过spring的aop,它利用动态代理实现,在springmvc中也是一样,今天使用H ...

  4. Android 实现http通信(servlet做服务器端) HttpClient、HttpURLConnection实现登录验证

    一,写好服务器端 在eclipse或其它javaee开发工具中新建一个web项目(我这里的项目名是:Android),建一个servlet(我这里的servlet名是:LoginServlet),模拟 ...

  5. Spring Boot使用HandlerInterceptorAdapter和WebMvcConfigurerAdapter实现原始的登录验证

    HandlerInterceptorAdapter的介绍:http://www.cnblogs.com/EasonJim/p/7704740.html,相当于一个Filter拦截器,但是这个颗粒度更细 ...

  6. Spring Security登录验证流程源码解析

    一.登录认证基于过滤器链 Spring Security的登录验证流程核心就是过滤器链.当一个请求到达时按照过滤器链的顺序依次进行处理,通过所有过滤器链的验证,就可以访问API接口了. SpringS ...

  7. 【笔记】vue+springboot前后端分离实现token登录验证和状态保存的简单实现方案

    简单实现 token可用于登录验证和权限管理. 大致步骤分为: 前端登录,post用户名和密码到后端. 后端验证用户名和密码,若通过,生成一个token返回给前端. 前端拿到token用vuex和lo ...

  8. Java 自定义注解在登录验证的应用

    java注解 从 JDK 5开始,Java 增加了注解的新功能,注解其实是代码里面的特殊标记,这些标记可以在编译.类加载和运行时被读取,在不改变代码原有逻辑下,给源文件嵌入注解信息.再通过返回获取注解 ...

  9. SSM项目使用拦截器实现登录验证功能

    SSM项目使用拦截器实现登录验证功能 登录接口实现 public User queryUser(String UserName, String Password,HttpServletRequest ...

随机推荐

  1. 使用Qt Creator作为Linux IDE,代替Vim:实现两台Linux电脑远程部署和gdb调试(一台电脑有桌面系统,一台电脑无桌面系统)

      版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/libaineu2004/article/details/62423830 尊重作者,支持原创,如 ...

  2. Python 自学笔记(七)

    1.定义函数和调用函数 1-1.定义函数 定义函数的语法书写:def 函数名(参数名)(注:括号内可以为空,也可以为多个参数,多个参数间用逗号隔开即可) 由上可以看出,函数默认返回None 2.函数的 ...

  3. mysql插入数据时 insert IGNORE、ON DUPLICATE KEY UPDATE、replace into

    转: mysql insert时几个操作DELAYED .IGNORE.ON DUPLICATE KEY UPDATE的区别 博客分类: mysql基础应用   mysql insert时几个操作DE ...

  4. struct2json -- C结构体与 JSON 快速互转库V1.0发布

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/zhutianlong/article/d ...

  5. 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_08-课程预览技术方案

    3.2.1 技术需求 课程详情页面是向用户展示课程信息的窗口,课程相当于网站的商品,本页面的访问量会非常大.此页面的内容设 计不仅要展示出课程核心重要的内容而且用户访问页面的速度要有保证,有统计显示打 ...

  6. 常用音频格式对应的采样率,每采样点bit数以及比特率

    Format SamplesPerSec BitsPerSample BitsPerSec(格式) (采样频率) (每采样点bit数) (比特率或位率)MEDIA_FORMAT_WAV 8kHz 16 ...

  7. Win10使用mysqldump导出csv文件及期间遇到的问题

    作为测试,我们这里使用了名为testdb的数据库中的名为test_table的表,首先我们使用如下SQL来查看其中有何数据: select * from testdb.test_table 数据如下: ...

  8. Azure DevOps的variable group实现array和hashtable参数的传递

    Azure Devops中的variable group建议或者只能(?)添加string类型的value.基于此我们想在variable group实现array或者hashtable的传递的核心思 ...

  9. NASA HEG tool安装心得

    自从NASA对MRT工具停止支持后,这个工具的官网也随之打不开无法下载.处理数据当然还是需要官方的工具好一些. 现在NASA推荐使用HEG工具来处理MODIS系列产品,除此之外工具对ASTER, MI ...

  10. UIPath工具取得某个路径下的文件夹的名称

    UIPath工具取得某个路径下的文件夹的名称 处理的流程如下图 [Edit Code]按钮押下之后写入代码如下 Dim dir As New DirectoryInfo("C:\Users\ ...