关于单点登录场景有很多解决,比如常见的CAS统一鉴权中心,但这依赖于一个统一的CAS服务。
而本文当时所遇到的场景是,鉴权中心仅能提供一个接口供调用。
实现站点间交互、需要获取他人的鉴权返回信息实现同步登录等场景。
最简单是直接使用ajax进行跨域请求,并获取返回进行处理。
鉴权中心同意开放跨域访问,后来通过评审我们一致认为这种方式有很大的安全隐患。
稍微懂点技术的Hacker使用一个开源的BurpSuite就能篡改请求&返回进行伪造登陆。
Apache Jakarta Common下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包。
实现了所有 HTTP 的方法GET,POST,PUT,HEAD等。
简而言之,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相当易用。
当前还没有观点发布,欢迎您留下足迹!
Spring就像一个大家族,里面包含了很多衍生产品,其中最为出名的就是SpringMVC和SpringBoot,那么这三者之间是什么关系呢?SpringMVC和SpringBoot又专门用来做什么呢?
在JAVA的WEB工程中我们可以将JSP页面文件放在WEB-INFO中限制用户进行URL直接访问,但静态资源如js、css文件却是需要被外部直接访问的,直接对外暴露又不太安全,可以通过自定义过滤器处理
SpringMVC框架是围绕DispatcherServlet(前端控制器)展开的,本文描述SpringMVC的优点、各个核心类(角色)作用,并说明用户请求数据到最终视图返回完整的数据传输过程
SpringBoot 的 MyBatis 默认采用 hikari 连接池,druid (德鲁伊) 连接池由阿里开源,它不仅仅是一个连接池,更是代理、过滤器、解析器、插件、监控、优化等实用功能组件库,更在阿里生产环境得到验证,所以 Lets Do It
Struts2框架以WebWork优秀的设计思想为核心,吸收了 Struts框架的部分优点,提供了一个更加整洁的MVC设计模式实现的Web应用程序框架,本文主要是与Spring整合关键配置和实例
scope属性主要用于控制依赖范围,主要分为编译、打包、运行、测试、依赖传递等各个常见,scope不同于optional提供了更多可选择的配置参数用于应对不同的依赖场景。