一 主处理逻辑做什么
其实在第五部分已经把IServlet的整体设计做的差不多了,但是process()并没有实现,process()就是我所谓的主处理方法。
这个方法要做几件事情:
- 请求处理耗时统计
- 分发请求到具体处理方法
- 拼装IResponse应答结构
- 解决跨域处理
所以先定义方法如下:
private void process() throws IOException
{
try
{
processAction();
}
catch (Throwable t)
{
}
}
二 补充处理耗时
请求到来时即应记录下当前的系统时间,并且在请求处理完毕后再次计下当前的系统时间,然后取前后时间的跨度值作为请求耗时。
注意,每一个请求的应答为IResponse类型,且IServlet在请求进入时已经实例化好了IResponse对象result,所以补充逻辑如下:
private void process() throws IOException
{
long StartTime = System.currentTimeMillis();
try
{
processAction();
}
catch (Throwable t)
{
}
result.setElapsedTime((int) (System.currentTimeMillis() - StartTime));
}
三 拼装IResponse并响应请求
这时候就用上了我们之前的准备工作,GsonUtil完美的支持我们现在工作需求:
private void process() throws IOException
{
long StartTime = System.currentTimeMillis();
try
{
processAction();
}
catch (Throwable t)
{
}
result.setElapsedTime((int) (System.currentTimeMillis() - StartTime));
response.setContentType("text/plain; charset=UTF-8");
Gson gson = GsonUtil.getGson();
try
{
PrintWriter out = response.getWriter();
response.getWriter().print(gson.toJson(result));
out.flush();
out.close();
}
catch (Exception e)
{
}
}
四 解决跨域问题
要解决跨域问题,首先要知道跨域问题时怎么来的,比如说在a.com下去访问b.com的资源,这就是跨域。浏览器允许跨域写,但是不允许跨域读。这里说的写是指请求,读则为应答。
了解其原理之后,我们的解决方案为在应答时处理跨域问题,所以补充处理逻辑如下:
private void process() throws IOException
{
long StartTime = System.currentTimeMillis();
try
{
processAction();
}
catch (Throwable t)
{
}
result.setElapsedTime((int) (System.currentTimeMillis() - StartTime));
response.setContentType("text/plain; charset=UTF-8");
Gson gson = GsonUtil.getGson();
try
{
PrintWriter out = response.getWriter();
String callback = request.getParameter("callback");
if (callback == null)
{
response.addHeader("Access-Control-Allow-origin", request.getHeader("callback"));
response.addHeader("Access-Control-Allow-Methods", "POST,GET");
// 是否支持cookie跨域
response.addHeader("Access-Control-Allow-Credentials", "true");
response.getWriter().print(gson.toJson(result));
}
else
{
String output = callback + "(" + gson.toJson(result) + ")";
response.getWriter().print(output);
}
out.flush();
out.close();
}
catch (Exception e)
{
}
}