通过HttpClient实现服务端收发HTTP请求

JAVA服务端实现HTTP请求的方式有很多种(比如常见的socket操作),本文介绍采用Apache Jakarta Common下的子项目HttpClient来实现,个人当时引入此工具包主要为实现单点登录能力

所属分类 JAVA

相关标签 请求HTTP服务端

场景描述

关于单点登录场景有很多解决,比如常见的CAS统一鉴权中心,但这依赖于一个统一的CAS服务。

而本文当时所遇到的场景是,鉴权中心仅能提供一个接口供调用。

实现站点间交互、需要获取他人的鉴权返回信息实现同步登录等场景。

最简单是直接使用ajax进行跨域请求,并获取返回进行处理。

鉴权中心同意开放跨域访问,后来通过评审我们一致认为这种方式有很大的安全隐患。

稍微懂点技术的Hacker使用一个开源的BurpSuite就能篡改请求&返回进行伪造登陆。

HttpClient

Apache Jakarta Common下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包。

实现了所有 HTTP 的方法GET,POST,PUT,HEAD等。

  • 支持自动转向
  • 支持 HTTPS 协议
  • 支持代理服务器等

简而言之,HttpClient最大的作用是为了实现在服务端发送Http请求

public class MyTestServiceRequest extends HttpServlet
{

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
    this.doPost(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
    System.setProperty("org.apache.commons.logging.Log""org.apache.commons.logging.impl.SimpleLog");
    System.setProperty("org.apache.commons.logging.simplelog.showdatetime""true");
    System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient""stdout");
    String url = 请求地址;
    String xmlString = 需要发送的XML格式信息;
    HttpClient client = new HttpClient();
    PostMethod myPost = new PostMethod(url);
    //超时时间
    client.getParams().setSoTimeout(300*1000);  
    String responseString = null;
    try{
        //设置请求头
        myPost.setRequestEntity(new StringRequestEntity(xmlString,"text/xml","utf-8")); 
        //执行发送
        int statusCode = client.executeMethod(myPost);
        //如果返回码200,成功
        if(statusCode == HttpStatus.SC_OK)   
        {
            BufferedInputStream bis = new BufferedInputStream(myPost.getResponseBodyAsStream());  //读取rsp的body体
            byte[] bytes = new byte[1024];
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            int count = 0;
            while((count = bis.read(bytes))!= -1)
            {
                bos.write(bytes, 0, count);
            }
            byte[] strByte = bos.toByteArray();
            responseString = new String(strByte,0,strByte.length,"utf-8");  //转成String
            Map<String,String> authMap = new HashMap<String,String>();
            if(null!=responseString&&!"".equals(responseString))
            {
                //String转XML
                authMap = xmlElements(responseString); 
                //鉴权成功       
                if("true".equals(authMap.get("result")))  
                {
                    //远程鉴权成功的后续操作
                }else{
                    //远程鉴权失败的后续操作
                }
            }
            bos.close();
            bis.close();
        }
    }catch (Exception e) {
        //异常处理 
    }
    myPost.releaseConnection();
    client.getHttpConnectionManager().closeIdleConnections(0);
}

/**
 * 解析返回的XMLBody体
 */
public Map<String,String> xmlElements(String xmlDoc) {…略…}


@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
    this.doPost(req, resp);
}
}

这个实例意义不大,JAVA服务端接受POST请求直接用常规Servlet即可。

public class MyTestServiceResponse extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
  this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    try
    {
        InputStream is = request.getInputStream(); //获取HTTP请求的输入流        
        BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));  //以HTTP请求输入流建立一个BufferedReader对象       
        String buffer = null//读取HTTP请求内容 
        StringBuffer sb = new StringBuffer();
        while ((buffer = br.readLine()) != null)
        {
            sb.append(buffer+"n"); //读取所有的信息,并追加 转行
        }
        PrintWriter out = response.getWriter();
        StringBuffer stringBuffer = new StringBuffer("<?xml version="1.0" encoding="UTF-8"?>");//建议返回体
        stringBuffer.append("返回信息");
        ……
        stringBuffer.append("返回信息");
        out.write(stringBuffer.toString());
        out.flush();
        out.close();
    } catch (Exception e) {
        //异常处理
    }
}
}

结语

本质上来讲采用HttpClient实现服务端处理http请求的意义不是很大,现在SpringMVC和struts相当易用。

米虫

做一个有理想的米虫,伪全栈程序猿,乐观主义者,坚信一切都是最好的安排!

本站由个人原创、收集或整理,如涉及侵权请联系删除

本站内容支持转发,希望贵方携带转载信息和原文链接

本站具有时效性,不提供有效、可用和准确等相关保证

本站不提供免费技术支持,暂不推荐您使用案例商业化

发表观点

提示

昵称

邮箱

QQ

网址

当前还没有观点发布,欢迎您留下足迹!

同类其他

JAVA

listener、filter、servlet的加载次序

在web.xml中经常会看到listener,filter,servlet的相关标签配置,它们分别是监听器、过滤器、容器,都是在项目启动的时候就可以进行初始化的加载动作

JAVA中创建线程的三种方式的使用与区别

JAVA中通过继承Thread类、实现Runnable接口以及实现Callable接口配合Future接口实现创建多线程,三种方式各有优缺点,而第三种则具备更多的增强能力

SpringBoot配置文件生效优先级

SpringBoot 可以通过 spring.profiles.active 属性指定生效不同配置文件来满足多环境要求,多环境更为复杂的场景,就需要理解配置文件生效优先级,考虑直接引入外部配置项和配置文件

自定义filter过滤器拦截未登录(非法)请求

在JAVA的WEB工程中我们可以将JSP页面文件放在WEB-INFO中限制用户进行URL直接访问,但静态资源如js、css文件却是需要被外部直接访问的,直接对外暴露又不太安全,可以通过自定义过滤器处理

Maven的pom配置文件的scope属性

scope属性主要用于控制依赖范围,主要分为编译、打包、运行、测试、依赖传递等各个常见,scope不同于optional提供了更多可选择的配置参数用于应对不同的依赖场景。

JAVA语言中的反射机制的作用原理及使用

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;动态获取的信息以及动态调用对象的方法的功能。

选择个人头像

昵称

邮箱

QQ

网址

评论提示

  • 头像:系统为您提供了12个头像自由选择,初次打开随机为你选择一个
  • 邮箱:可选提交邮箱,该信息不会外泄,或将上线管理员回复邮件通知
  • 网址:可选提交网址,评论区该地址将以外链的形式展示在您的昵称上
  • 记忆:浏览器将记忆您已选择或填写过得信息,下次评论无需重复输入
  • 审核:提供一个和谐友善的评论环境,本站所有评论需要经过人工审核