|
不同的地方在于,同样的代码【response.sendError(1);】
在Tomcat下,response.getResponseCode()的值是 1,而在Websphere下面则是 500。
而且500这个东西比较尴尬,一般的web框架都会在web.xml里面默认让它迁移到错误页面。
由此,对于调用远端服务器servlet进行验证,需要给出结果的时候,可以根据response.getResponseCode()
进行分支判断的想法就不能借助response.sendError()来实行。
解释下,web后台调用远端服务器的时候一般使用HttpURLConnection,调用完毕之后,需要进行分支处理的时候,
最好使用response.getResponseCode(),而不是通过
BufferedReader rd = new BufferedReader(new InputStreamReader(con.getInputStream(), CommonValue.CHAR_SET));
String line = "";
while ((line = rd.readLine()) != null) {
}
来读这个stream内容,为什么呢,因为有可能返回的stream内容不同,有的时候是字符串,有的时候是一个文件流。
而且InputStream十分不好备份,因为为了备份而提供的两个方法mark()和reset()也是需要先自己实现了之后才能用的。
远端servlet的response不能用刚才的sendError()那用什么呢,用setStatus();
下面给出例子:
本地Server
1 public boolean downloadLogFromAp(String apNo) throws Exception {
2
3 super.currentForm.set(WebConst.WS0120Form.CAN_DOWNLOAD_FLG, CommonValue.NULL_SPACE);
4 String filepath = CommonValue.NULL_SPACE;
5 String httpsURL = CommonValue.NULL_SPACE;
6
7 if (CommonValue.STRING_ONE.equals(apNo)) {
8
9 filepath = PropertyFileReader.getTachiaiProperties("AP01PATH") + super.currentForm.getString(WS0120Form.AP1LOGFILEPATH);
10 httpsURL = PropertyFileReader.getTachiaiProperties("AP01URL");
11 } else {
12
13 filepath = PropertyFileReader.getTachiaiProperties("AP02PATH") + super.currentForm.getString(WS0120Form.AP2LOGFILEPATH);
14 httpsURL = PropertyFileReader.getTachiaiProperties("AP02URL");
15 }
16
17 String logfileparam = "logfilepath" + ServletConst.SIGN_OF_EQUALITY + filepath;
18 URL myurl = new URL(httpsURL);
19 HttpURLConnection con;
20 if ("https".equals(httpsURL.substring(0, 5))) {
21 con = (HttpsURLConnection) myurl.openConnection();
22 } else {
23 con = (HttpURLConnection) myurl.openConnection();
24 }
25
26 con.setRequestMethod("POST");
27 con.setConnectTimeout(60000);
28 con.setReadTimeout(60000);
29 con.setInstanceFollowRedirects(false);
30 con.setUseCaches(false);
31 con.setDoOutput(true);
32
33 OutputStream out = con.getOutputStream();
34 Writer wout = new OutputStreamWriter(out);
35 wout.write(logfileparam);
36 //wout.flush();
37 wout.close();
38
39 if (con.getResponseCode() == 200) {
40
41 HttpServletResponse response = super.currentResponse;
42 response.setHeader("Content-Type", "text/plain");
43 String zipfileName = getServerZipFileName(filepath);
44 response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(zipfileName, "UTF-8"));
45 OutputStream os = response.getOutputStream();
46 InputStream is = con.getInputStream();
47 DownloadUtil.transfer(is, os);
48 con.disconnect();
49 return true;
50 } else if (con.getResponseCode() == 1) {
51 // ログファイルが存在しない場合、エラーメッセージを表示する。
52 super.dispatchAction.getActionMessages().add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(MessageId.MSG_E_001_082));
53 con.disconnect();
54 return false;
55 } else {
56 con.disconnect();
57 return false;
58 }
59 }
远端Servlet
1 package jp.co.kentaku.kanri.tachiai.web.servlet;
2
3 import java.io.BufferedReader;
4 import java.io.File;
5 import java.io.FileInputStream;
6 import java.io.FileOutputStream;
7 import java.io.IOException;
8 import java.io.InputStream;
9 import java.io.InputStreamReader;
10 import java.io.OutputStream;
11 import java.io.PrintWriter;
12 import java.net.URLEncoder;
13
14 import javax.servlet.ServletException;
15 import javax.servlet.http.HttpServlet;
16 import javax.servlet.http.HttpServletRequest;
17 import javax.servlet.http.HttpServletResponse;
18
19 import jp.co.kentaku.common.tools.LogUtil;
20 import jp.co.kentaku.kanri.tachiai.common.TachiaiConst;
21 import jp.co.kentaku.kanri.tachiai.common.util.DownloadUtil;
22 import jp.co.kentaku.kanri.tachiai.renkei.common.ServletConst;
23
24 import org.apache.commons.lang.StringUtils;
25 import org.apache.tools.ant.BuildException;
26 import org.apache.tools.ant.Project;
27 import org.apache.tools.ant.taskdefs.Zip;
28 import org.apache.tools.ant.types.FileSet;
29
30
31 public class LogFileDownloadServlet extends HttpServlet {
32
33 /** シリアル・バージョンID */
34 private static final long serialVersionUID = 1L;
35
36 private static final String FILE_SEPARATOR = File.separator;
37
38
39 /**
40 * GET方式でサーブレット主処理を行う。
41 *
42 * @param req リクエスト
43 * @param resp レスポンス
44 */
45 @Override
46 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
47
48 this.doPost(req, resp);
49 }
50
51
52 /**
53 * POST方式でサーブレット主処理を行う。
54 *
55 * @param req リクエスト
56 * @param resp レスポンス
57 */
58 @Override
59 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
60
61 LogUtil.debug("jp.co.kentaku", "ログファイルダウンロードサーブレット開始。");
62 //ログファイルパスを取得する。
63 String filepath = null;
64 BufferedReader br = new BufferedReader(new InputStreamReader(req.getInputStream()));
65 String line = "";
66 if ((line = br.readLine()) != null) {
67 if (!StringUtils.isEmpty(line)) {
68 String[] arr = line.split(ServletConst.SIGN_OF_EQUALITY);
69 if (arr.length == 2) {
70 filepath = arr[1];
71 }
72 }
73 }
74
75 //ログファイル名正確の場合、ログファイルをダウンロードする。
76 if (!StringUtils.isEmpty(filepath)) {
77 downloadZip(filepath, resp);
78 } else {
79 resp.setHeader("Content-Type", "text/plain;charset=Shift_JIS");
80 PrintWriter out = resp.getWriter();
81 out.print("ログファイルダウンロードサーブレットで、ログファイル" + filepath + "がNULLであるから、エラーとする。");
82 LogUtil.error("jp.co.kentaku", "ログファイルダウンロードサーブレットで、ログファイル" + filepath + "がNULLであるから、エラーとする。");
83 out.flush();
84 out.close();
85 }
86
87 LogUtil.debug("jp.co.kentaku", "ログファイルダウンロードサーブレット終了。");
88 }
89
90
91 /**
92 * ログファイルをダウンロードする
93 *
94 * @param filepath ダウンロードパス
95 * @param response レスポンス
96 * @throws IOException 例外
97 */
98 private void downloadZip(String filepath, HttpServletResponse response) throws IOException {
99
100 boolean isMultiFilesName = isMultiFilesName(filepath);
101 File zipfolder = null;
102 if (isTargetExists(filepath, isMultiFilesName)) {
103 zipfolder = getZipTargetDir(filepath, isMultiFilesName);
104 String zippath = zipfolder.getName() + ".zip";
105 zipFile(zippath, zipfolder);
106 response.setHeader("Content-Type", "application/zip");
107 response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(zippath, "UTF-8"));
108 OutputStream os = response.getOutputStream();
109 File zipfile = new File(zippath);
110 InputStream is = new FileInputStream(zipfile);
111 DownloadUtil.transfer(is, os);
112 zipfile.delete();
113 for (File file : zipfolder.listFiles()) {
114 file.delete();
115 }
116 zipfolder.delete();
117 LogUtil.debug("jp.co.kentaku", "ログファイルダウンロードサーブレット経由し、ファイル" + filepath + "をダウンロードした。");
118 } else {
119 response.setHeader("Content-Type", "text/plain;charset=Shift_JIS");
120 response.setStatus(1);
121 LogUtil.error("jp.co.kentaku", "ログファイルダウンロードサーブレットで、ログファイル" + filepath + "が存在しないから、エラーとする。");
122 }
123
124 }
125
126
127 /**
128 * 圧縮対象フォルダを取得する
129 *
130 * @param filepath ダウンロードパス
131 * @param isMultiFilesName 複数件フラグ
132 * @return 圧縮対象フォルダ
133 * @throws IOException 例外
134 */
135 private File getZipTargetDir(String filepath, boolean isMultiFilesName) throws IOException {
136
137 File targetDir = null;
138 if (isMultiFilesName) {
139 int lastIndex = filepath.lastIndexOf(FILE_SEPARATOR) + 1;
140 String toFileName = filepath.substring(lastIndex, filepath.length() - 1);
141 File toFolder = new File(TachiaiConst.TachiaiProperties.TACHIAI_DATA_DIR + toFileName + ".log.all");
142 if (!toFolder.exists()) {
143 toFolder.mkdirs();
144 }
145 File fromFolder = new File(filepath.substring(0, lastIndex));
146 for (File file : fromFolder.listFiles()) {
147 if (file.isFile() && file.getName().startsWith(toFileName)) {
148 copyFile(new File(fromFolder, file.getName()), new File(toFolder, file.getName()));
149 }
150 }
151 targetDir = toFolder;
152
153 } else {
154 File fromFile = new File(filepath);
155 File toFile = new File(TachiaiConst.TachiaiProperties.TACHIAI_DATA_DIR + fromFile.getName());
156 if (!toFile.exists()) {
157 toFile.mkdirs();
158 }
159 copyFile(fromFile, new File(toFile, fromFile.getName()));
160 targetDir = toFile;
161
162 }
163 return targetDir;
164 }
165
166
167 /**
168 * ログファイルを圧縮する
169 *
170 * @param zippath 圧縮先パス
171 * @param zipfolder 圧縮対象フォルダ
172 * @throws BuildException 例外
173 */
174 private void zipFile(String zippath, File zipfolder) throws BuildException {
175
176 //ログファイルをZIPに圧縮する。
177 ZipCompressor zc = new ZipCompressor(zippath);
178 zc.compress(zipfolder);
179
180 }
181
182
183 /**
184 * 複数件ダウンロードするかどうか
185 *
186 * @param filepath ダウンロードパス
187 * @return 複数件フラグ
188 */
189 private boolean isMultiFilesName(String filepath) {
190
191 boolean isMultiFiles = false;
192 isMultiFiles = !StringUtils.isEmpty(filepath) && filepath.matches("^.+\\*$");
193 return isMultiFiles;
194 }
195
196
197 /**
198 * ログファイル存在チェック
199 *
200 * @param filepath ダウンロードパス
201 * @param isMultiFilesName 複数件フラグ
202 * @return チェック結果
203 */
204 private boolean isTargetExists(String filepath, boolean isMultiFilesName) {
205
206 boolean isTargetExists = false;
207 if (isMultiFilesName) {
208 int lastIndex = filepath.lastIndexOf(FILE_SEPARATOR);
209 String fileName = filepath.substring(lastIndex + 1, filepath.length() - 1);
210 File folder = new File(filepath.substring(0, lastIndex));
211 if (folder.exists()) {
212 for (File file : folder.listFiles()) {
213 if (file.getName().startsWith(fileName)) {
214 isTargetExists = true;
215 break;
216 }
217 }
218 }
219 } else {
220 File file = new File(filepath);
221 isTargetExists = file.exists();
222 }
223 return isTargetExists;
224 }
225
226
227 /**
228 * ファイルをコピーする
229 *
230 * @param fromFile コピー元
231 * @param toFile コピー先
232 * @throws IOException 例外
233 */
234 private void copyFile(File fromFile, File toFile) throws IOException {
235
236 FileInputStream fis = new FileInputStream(fromFile);
237 FileOutputStream fos = new FileOutputStream(toFile);
238 try {
239 int byteRead = 0;
240 byte[] buffer = new byte[1024];
241 while ((byteRead = fis.read(buffer)) != -1) {
242 fos.write(buffer, 0, byteRead);
243 }
244 } finally {
245 fis.close();
246 fos.flush();
247 fos.close();
248 }
249 }
250
251 /**
252 * CSVファイルをZIPに圧縮する用クラス
253 *
254 * @author zang_yuling
255 *
256 */
257 private static class ZipCompressor {
258
259 private File zipFile;
260
261
262 /**
263 * コンストラクタ
264 *
265 * @param pathName zipファイアのファイアパス
266 */
267 public ZipCompressor(String pathName) {
268
269 zipFile = new File(pathName);
270 }
271
272
273 /**
274 * ファイアを圧縮する
275 *
276 * @param file 圧縮されたファイア名
277 */
278 public void compress(File file) {
279
280 FileSet fileSet = new FileSet();
281 Project prj = new Project();
282 Zip zip = new Zip();
283 zip.setProject(prj);
284 zip.setDestFile(zipFile);
285 fileSet.setProject(prj);
286 fileSet.setDir(file);
287 zip.addFileset(fileSet);
288 zip.execute();
289 }
290
291 }
292
293 }
|
|
|