struts2请求转发问题

williamxiao 2011-08-16 10:25:21
在struts2的Action中需要将请求转发至一个系统之外的地址.
例如:"http://www.google.com"

request.getRequestDispatcher("http://www.google.com").forward(request, response);


如果是转发到系统中的某个action这样是可以的.

request.getRequestDispatcher("index.action").forward(request, response);


使用请求转发是为了解决公网网站去访问局域网服务器文件的一个问题:

公网网站中有某一链接需要链接到局域网电话系统服务器上的录音文件,
开放到公网上的只有网站服务器,网站服务器与电话系统服务器在同一局域网中,

希望做到在点击公网网站上的录音链接时,由公网的网站系统将请求转发至局域网的电话系统服务器中获得录音文件.

例如:
公网网站地址是:http://www.abc.com;
点击录音链接时访问:http://www.abc.com/tape/playTape.action;
此时希望由playTape.action中某个方法将请求转发到局域网的电话系统服务器中获得录音;
request.getRequestDispatcher("http://192.168.0.88/record/20110511.wav").forward(request, response);

但是这样做不行,会由struts2报404错误.

不知哪位兄弟姐妹有木有解决方案?
...全文
896 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
williamxiao 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 softroad 的回复:]

引用 3 楼 alexandertech 的回复:

应该不能通过url转发的方式完成,可以通过Action中读取局域网服务器上的录音文件再将它输出到请求方


可以通过HttpURLConnection的方式把http://192.168.0.88/record/20110511.wav文件下载到公网服务器上,然后一同发出去。
[/Quote]

嗯,不错的办法,先尝试一下。
softroad 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 alexandertech 的回复:]

应该不能通过url转发的方式完成,可以通过Action中读取局域网服务器上的录音文件再将它输出到请求方
[/Quote]

可以通过HttpURLConnection的方式把http://192.168.0.88/record/20110511.wav文件下载到公网服务器上,然后一同发出去。
williamxiao 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fly_m 的回复:]

这个...你可以通过文件copy的方式进行转发,比如将内网的文件读出来之后,再返回给外网。

比如,获取内网中一个文件的流,将其输出到外网。
[/Quote]

考虑过先将录音文件从局域网的电话系统服务器中copy至公网网站系统中的某个目录,
当时是这么考虑的:
1.当点击网站上的录音链接时,由网站系统请求电话系统,获得录音文件,并将文件copy到网站系统的目录中,同时开启播放录音的窗口页面;
2.当点击播放录音按钮时,请求网站目录中对应的录音文件流,并播放录音.

后来没有使用这种方案,是因为两个原因:
1.某个录音链接有时会有多个录音文件,将录音文件全部copy性能开支可能会比较大(有时copy过来后,用户并不会需要播放所有的录音文件);
2.copy过来的录音文件,在目录中需要定时的清理,需要另外写功能实现.

所以会想到在action的方法中直接将请求转发到电话系统服务器上的方案,这种方案是这样假设的:
1.当点击网站上的录音文件时,由网站系统请求电话系统,获得电话系统中录音文件的地址,应该地址将作为请求播放录音的一个参数;
2.当点击播放录音按钮时,请求网站系统的播放录音acion,并传送录音文件地址参数.如:playTape.action?url=http://192.168.0.88/record/20110511.wav;
3.由播放录音方法将请求转发到电话系统服务器上,获得录音文件流,并播放录音.

尝试过在播放录音方法中不使用请求转发,而使用请求重定向,这样在局域网中测试时是可以播放录音的.
是因为客户机、网站测试服务器及电话系统服务器均在同一网络中。所以客户机可以直接访问电话系统的录音文件。

将播放录音方法的代码贴上:

/**
* 播放录音
* @throws IOException
* @throws ServletException
*/
public void playTape() throws ServletException, IOException
{
//获得需要播放的文件url
String url = Struts2Utils.getParameter("url");
if(!url.isEmpty())
{
HttpServletRequest request = Struts2Utils.getRequest();
HttpServletResponse response = Struts2Utils.getResponse();
//请求转发到呼叫中心服务器获取录音
request.getRequestDispatcher(url).forward(request, response);

//尝试过使用请求重定向,当客户机、网站测试服务器及电话系统服务器均在同一网络中时可行
//response.sendRedirect(url);
}
}
飞跃颠峰 2011-08-16
  • 打赏
  • 举报
回复
应该不能通过url转发的方式完成,可以通过Action中读取局域网服务器上的录音文件再将它输出到请求方
飞跃颠峰 2011-08-16
  • 打赏
  • 举报
回复
报错是因为没有访问局域网的权限
Fly_m 2011-08-16
  • 打赏
  • 举报
回复
这个...你可以通过文件copy的方式进行转发,比如将内网的文件读出来之后,再返回给外网。

比如,获取内网中一个文件的流,将其输出到外网。
softroad 2011-08-16
  • 打赏
  • 举报
回复
lz技术还是不错的嘛,一下就搞定了。
北极天使星 2011-08-16
  • 打赏
  • 举报
回复
转发用于服务器内部跳转,从定向可用于服务器外部跳转!
williamxiao 2011-08-16
  • 打赏
  • 举报
回复
问题已经解决,一开始只能获得8500个字节大小的输入流是因为没有使用缓冲的原因。

最终获得录音文件的方法实现如下:

/**
* 播放录音
* @throws IOException
*/
public void playTape() throws IOException
{
//获得需要播放的文件url
String url = ServletActionContext.getRequest().getParameter("url");
if(!url.isEmpty())
{
//HTTP请求
URL http = new URL(url);
HttpURLConnection httpConn = (HttpURLConnection) http.openConnection();
if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK)
{
//从http连接中获得相关对象
InputStream in = httpConn.getInputStream();//输入流
String contentType = httpConn.getContentType(); //内容类型

//实例缓冲输入流
BufferedInputStream buffIn = new BufferedInputStream(in);
//获得响应输出流
HttpServletResponse response = ServletActionContext.getResponse();
OutputStream out = response.getOutputStream();
//设置响应相关属性
response.setContentType(contentType);
response.setHeader("Content-Disposition","attachment;filename=temp.wav");

//设置缓存大小
byte[] buffer = new byte[1024];
int size = 0;
//循环响应输出
while((size=buffIn.read(buffer,0,1024))!=-1)
{
out.write(buffer,0,size);
}
//关闭流对象
out.flush();
out.close();
buffIn.close();
in.close();
}
}
}
williamxiao 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 softroad 的回复:]

引用 3 楼 alexandertech 的回复:

应该不能通过url转发的方式完成,可以通过Action中读取局域网服务器上的录音文件再将它输出到请求方


可以通过HttpURLConnection的方式把http://192.168.0.88/record/20110511.wav文件下载到公网服务器上,然后一同发出去。
[/Quote]

在HttpURLConnection里面怎样获得较大的输入流??

尝试了一下这种方式,录音太大的时候,只能读取8500个字节左右大小的输入流。
javaylj 2011-08-16
  • 打赏
  • 举报
回复
跟着学习了

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧