1
/** *//**//*
2
* <p>Company: 凌科软件 www.elingke.com </p>
3
* @author liubaojun
4
* @version 1.0
5
* Created on 2004-11-29
6
* 来源于 elinkBSP 部分源代码
7
*/
8
package com.elink.control;
9
10
import java.io.*;
11
import java.util.*;
12
import java.util.zip.*;
13
import javax.servlet.*;
14
import javax.servlet.http.*;
15
//import com.elink.util.*;
16
17
/** *//** *//** *//**
18
* @author liubj
19
*/
20
21
public class BusiFilter implements Filter
22

{
23
private FilterConfig config = null;
24
private HashMap expiresMap = null;
25
private String encoding = null;
26
27
public void init(FilterConfig filterConfig)
28
{
29
this.config = filterConfig;
30
this.encoding = config.getInitParameter("encoding");
31
if( encoding == null || encoding.length() == 0 )
32
{
33
encoding = "GBK";
34
}
35
expiresMap = new HashMap();
36
Enumeration names = config.getInitParameterNames();
37
while( names.hasMoreElements() )
38
{
39
String paramName = (String)names.nextElement();
40
if( !"encoding".equals(paramName) )
41
{
42
String paramValue = config.getInitParameter(paramName);
43
try
44
{
45
Integer expires = Integer.valueOf( config.getInitParameter(paramName) );
46
expiresMap.put(paramName, expires);
47
}
48
catch( Exception ex)
49
{
50
//LogUtil.logError( "Filter."+paramValue+"="+paramValue);
51
}
52
}
53
}
54
}
55
56
public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain)
57
throws IOException, ServletException
58
{
59
// 汉字问题
60
HttpServletRequest httpRequest = (HttpServletRequest)request;
61
httpRequest.setCharacterEncoding( encoding );
62
// chain.doFilter(request, response);
63
64
// 压缩传输
65
HttpServletResponse httpResponse = (HttpServletResponse)response;
66
String uri = httpRequest.getRequestURI();
67
68
String transferEncoding = getGZIPEncoding((HttpServletRequest)request);
69
if (transferEncoding == null)
70
{
71
setResponseHeader( httpResponse, uri, transferEncoding );
72
chain.doFilter(request, response);
73
}
74
else
75
{
76
if( uri.endsWith(".ctl") || uri.endsWith("busictrl") ) // 不处理的 URL
77
{
78
chain.doFilter(request, response);
79
}
80
else
81
{
82
setResponseHeader( httpResponse, uri, transferEncoding );
83
httpResponse.setHeader("Content-Encoding", transferEncoding);
84
GZIPEncodableResponse wrappedResponse = new GZIPEncodableResponse((HttpServletResponse)response);
85
chain.doFilter(request, wrappedResponse);
86
wrappedResponse.flush();
87
}
88
}
89
}
90
91
public void destroy()
92
{
93
}
94
95
private void setResponseHeader( HttpServletResponse response, String uri, String transferEncoding )
96
{
97
//LogUtil.logDebug( uri + ".Accept-Encoding: "+ transferEncoding);
98
String ext = null;
99
int dot = uri.lastIndexOf(".");
100
if( dot != -1 )
101
{
102
ext = uri.substring( dot+1 );
103
}
104
if( ext!= null && ext.length() > 0 )
105
{
106
Integer expires = (Integer)expiresMap.get(ext);
107
if( expires != null )
108
{
109
//LogUtil.logDebug( uri + ".Expires: "+ expires.intValue());
110
if( expires.intValue() > 0 )
111
{
112
response.setHeader("Cache-Control","max-age="+expires.intValue()); //HTTP 1.1
113
}
114
else
115
{
116
response.setHeader("Cache-Control","no-cache");
117
response.setHeader("Pragma","no-cache"); //HTTP 1.0
118
response.setDateHeader ("Expires", expires.intValue() );
119
}
120
}
121
}
122
}
123
124
private static String getGZIPEncoding(HttpServletRequest request)
125
{
126
String acceptEncoding = request.getHeader("Accept-Encoding");
127
if (acceptEncoding == null)
128
return null;
129
acceptEncoding = acceptEncoding.toLowerCase();
130
if (acceptEncoding.indexOf("x-gzip") >= 0)
131
{
132
return "x-gzip";
133
}
134
if (acceptEncoding.indexOf("gzip") >= 0)
135
{
136
return "gzip";
137
}
138
return null;
139
}
140
141
private class GZIPEncodableResponse extends HttpServletResponseWrapper
142
{
143
private GZIPServletStream wrappedOut;
144
145
public GZIPEncodableResponse(HttpServletResponse response) throws IOException
146
{
147
super(response);
148
wrappedOut = new GZIPServletStream(response.getOutputStream());
149
}
150
151
public ServletOutputStream getOutputStream() throws IOException
152
{
153
return wrappedOut;
154
}
155
156
private PrintWriter wrappedWriter;
157
158
public PrintWriter getWriter() throws IOException
159
{
160
if (wrappedWriter == null)
161
{
162
wrappedWriter = new PrintWriter(new OutputStreamWriter(
163
getOutputStream(), getCharacterEncoding()));
164
}
165
return wrappedWriter;
166
}
167
168
public void flush() throws IOException
169
{
170
if (wrappedWriter != null)
171
{
172
wrappedWriter.flush();
173
}
174
wrappedOut.finish();
175
}
176
}
177
178
private class GZIPServletStream extends ServletOutputStream
179
{
180
private GZIPOutputStream outputStream;
181
182
public GZIPServletStream(OutputStream source) throws IOException
183
{
184
outputStream = new GZIPOutputStream(source);
185
}
186
187
public void finish() throws IOException
188
{
189
outputStream.finish();
190
}
191
192
public void write(byte[] buf) throws IOException
193
{
194
outputStream.write(buf);
195
}
196
197
public void write(byte[] buf, int off, int len) throws IOException
198
{
199
outputStream.write(buf, off, len);
200
}
201
202
public void write(int c) throws IOException
203
{
204
outputStream.write(c);
205
}
206
207
public void flush() throws IOException
208
{
209
outputStream.flush();
210
}
211
212
public void close() throws IOException
213
{
214
outputStream.close();
215
}
216
}
217
} 配置文件
1
<filter>
2
<filter-name>busifilter</filter-name>
3
<filter-class>com.elink.control.BusiFilter</filter-class>
4
<init-param>
5
<param-name>encoding</param-name>
6
<param-value>GBK</param-value>
7
</init-param>
8
<init-param>
9
<param-name>js</param-name>
10
<param-value>3600</param-value>
11
</init-param>
12
<init-param>
13
<param-name>gif</param-name>
14
<param-value>3600</param-value>
15
</init-param>
16
<init-param>
17
<param-name>jpg</param-name>
18
<param-value>3600</param-value>
19
</init-param>
20
<init-param>
21
<param-name>css</param-name>
22
<param-value>3600</param-value>
23
</init-param>
24
<init-param>
25
<param-name>bo</param-name>
26
<param-value>0</param-value>
27
</init-param>
28
<init-param>
29
<param-name>jsp</param-name>
30
<param-value>0</param-value>
31
</init-param>
32
</filter>
33
<filter-mapping>
34
<filter-name>busifilter</filter-name>
35
<url-pattern>/*</url-pattern>
36
</filter-mapping>
37
posted on 2007-01-05 13:59
公主她爹 阅读(524)
评论(0) 编辑 收藏 所属分类:
Servlet Filter