一、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. 多网卡下如何配置指定IP走某个路由器(适用于外网不通,但是钉钉服务器通的情况)

    # 多网卡下如何配置指定IP走某个路由器(适用于外网不通,但是钉钉服务器通的情况) ## 如何查看一个进程建立的网络连接,方式一 - 查看进程pid `ps -ef|grep dingtalk`- 查 ...

  2. Ionic4.x 中的 UI 组件(UI Components) Slides 轮播图组件、Searchbar 组件、 Segment 组件

    Slides 轮播图组件 Ionic4.x 中的轮播图组件是基于 swiper 插件,所以配置 slides 的属性需要在 swiper 的 api 中 找 Swiper Api:http://ida ...

  3. C语言练习,可以解析协议,主机,路径,询问,片段等

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> ...

  4. VSCode使用Dart和lutter所需按照的插件

    Dart Flutter Flutter Widget Snippets [可快速敲出关联代码] Code Runner: 用于代码运行 Awesome Flutter Snippetsnash

  5. jsp中cookie的一个报错

    写项目时在一个jsp页面中使用了cookie,用逗号分隔的数据,服务器老报错,搞了一个小时,终于清楚了,jsp的cookie中不能使用逗号. cookie规则:这个规则用于jsp.asp中(下面这两句 ...

  6. ElasticSearch——索引生命周期管理

    从ES6.6开始,Elasticsearch提供索引生命周期管理功能,索引生命周期管理可以通过API或者kibana界面配置,详情参考[index-lifecycle-management] 本文仅通 ...

  7. AWS 存储服务(三)

    目录 AWS S3 业务场景 挑战 解决方案 S3的好处 S3 属性 存储桶 Buckets 对象 Object S3 特性 S3 操作 可用性和持久性 一致性 S3 定价策略 S3高级功能 存储级别 ...

  8. charles 工具菜单总结

    本文参考:charles 工具菜单总结 主要是下面的功能,具体可以点击对应菜单查看 工具菜单总结 禁用缓存 禁用Cookies 远程映射到URL地址 映射到本地 重写工具 黑名单 白名单 DNS欺骗 ...

  9. ubuntu desktop 登录root账户

    有一些操作,登录root账户比较方便,但是ubuntu桌面版默认不允许这样,需要更改root账户的默认密码才可以登录,解决方法是按以下顺序输入: sudo passwd <你现在的用户的密码&g ...

  10. 关于远程链接 redis的坑·

    今天遇到了一个问题,在redis.conf 中 将 bind: 注释掉bind 127.0.0.1 仍然不行 其实是要把bind 127.0.0.1 改为 0.0.0.0 才行 下面附赠详细过程 查看 ...