[Servlet & JSP] use of the package
Filters can be pre-processed and post-processed before and after the Servlet service () method is executed. However, some information cannot be changed, such as request parameters. The request wrappers and corresponding wrappers are used to encapsulate the requests generated by the container and the corresponding objects. The request information or responses can be processed.
Request wrappers
HttpServletRequestWrapper implements the HttpServletRequest interface. The following example describes how to inherit from HttpServletRequestWrapper to implement a request encapsulate. You can replace the angle brackets in the Request Parameters with the replacement characters.
Import java. util. Iterator; import java. util. Map; import javax. servlet. http. HttpServletRequest; import javax. servlet. http. Handler; public class CharacterRequestWrapper extends HttpServletRequestWrapper {private Map
EscapeMap; public CharacterRequestWrapper (HttpServletRequest request, Map
EscapeMap) {super (request); // encapsulate the incoming request object this. escapeMap = escapeMap;} @ Override public String getParameter (String name) {// Override the getParameter () method return doEscape (this. getRequest (). getParameter (name);} private String doEscape (String parameter) {if (parameter = null) {return null;} String result = parameter; Iterator
It = escapeMap. keySet (). iterator (); while (it. hasNext () {String origin = it. next (); String escape = escapeMap. get (origin); result = result. replaceAll (origin, escape);} return result ;}}
You can use this request interceptor with a filter to filter characters. For example:
Import java. io. bufferedReader; import java. io. IOException; import java. io. inputStreamReader; import java. util. hashMap; import java. util. map; import java. util. logging. level; import java. util. logging. logger; import javax. servlet. filter; import javax. servlet. filterChain; import javax. servlet. filterConfig; import javax. servlet. servletException; import javax. servlet. servletRequest; import javax. servlet. servletResponse; import javax. servlet. http. httpServletRequest; public class CharacterFilter implements Filter {private Map
EscapeMap; @ Override public void init (FilterConfig filterConfig) throws ServletException {BufferedReader reader = null; try {String escapeListFile = filterConfig. getInitParameter ("ESCAPE_LIST"); reader = new BufferedReader (new InputStreamReader (filterConfig. getServletContext (). getResourceAsStream (escapeListFile); String input = null; escapeMap = new HashMap
(); While (input = reader. readLine ())! = Null) {String [] token = input. split ("\ t"); escapeMap. put (token [0], token [1]) ;}} catch (IOException ex) {Logger. getLogger (CharacterFilter. class. getName ()). log (Level. SEVERE, null, ex);} finally {try {reader. close ();} catch (IOException ex) {Logger. getLogger (CharacterFilter. class. getName ()). log (Level. SEVERE, null, ex) ;}}@ Override public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, servletException {// encapsulate the original request object in CharacterRequestWrapper HttpServletRequest requestWrapper = new response (HttpServletRequest) request, escapeMap); // pass the response object as a request parameter to the doFilter () chain. doFilter (requestWrapper, response) ;}@ Override public void destroy () {// TODO Auto-generated method stub }}
Response wrappers
If you want to compress the response content, you can inherit the HttpServletResponseWrapper class in the response Interceptor to encapsulate the HttpServletResponse object.
To output a response to the browser, you must use getWriter () to obtain PrintWriter or getOutputStream () to obtain ServletOutputStream. Therefore, the request for compressed output is mainly implemented by rewriting the two methods after inheriting HttpServletResponseWrapper.
Here, the compression function will adopt the GZIP format, which is an acceptable compression format for the browser and can be implemented using the GZIPOutputStream class. Because the PrintWriter of getWriter () must also use ServletOutputStream when creating it, The ServletOutputStream class is first extended here to make it compressed.
GzipServletOutputStream. java:
Package club. chuxing; import java. io. IOException; import java.util.zip. GZIPOutputStream; import javax. servlet. servletOutputStream; import javax. servlet. writeListener; public class extends writable {private GZIPOutputStream gzipOutputStream; public writable (writable) throws IOException {this.gzip OutputStream = new GZIPOutputStream (ServletOutputStream);} public void write (int B) throws IOException {// use GZIPOutputSteam's write () to compress the output gzipOutputStream. write (B);} public GZIPOutputStream getGzipOutputStream () {return gzipOutputStream;} @ Override public boolean isReady () {// TODO Auto-generated method stub return false ;} @ Override public void setWriteListener (WriteListener listener) {// TODO Auto-generated method stub }}
CompressionResponseWrapper. java:
package club.chuxing;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.util.zip.GZIPOutputStream;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper;public class CompressionResponseWrapper extends HttpServletResponseWrapper { private GZipServletOutputStream gzServletOutputStream; private PrintWriter printWriter; public CompressionResponseWrapper(HttpServletResponse resp) { super(resp); } @Override public ServletOutputStream getOutputStream() throws IOException { if (printWriter != null) { throw new IllegalStateException(); } if (gzServletOutputStream == null) { gzServletOutputStream = new GZipServletOutputStream( getResponse().getOutputStream()); } return gzServletOutputStream; } @Override public PrintWriter getWriter() throws IOException { if (gzServletOutputStream != null) { throw new IllegalStateException(); } if (printWriter == null) { gzServletOutputStream = new GZipServletOutputStream( getResponse().getOutputStream()); OutputStreamWriter osw = new OutputStreamWriter( gzServletOutputStream, getResponse().getCharacterEncoding()); printWriter = new PrintWriter(osw); } return printWriter; } @Override public void setContentLength(int len) { } public GZIPOutputStream getGZIPOutputStream() { if (this.gzServletOutputStream == null) { return null; } return this.gzServletOutputStream.getGzipOutputStream(); }}
CompressionFilter. java (compression filter ):
Package club. chuxing; import java. io. IOException; import java.util.zip. GZIPOutputStream; import javax. servlet. filter; import javax. servlet. filterChain; import javax. servlet. filterConfig; import javax. servlet. servletException; import javax. servlet. servletRequest; import javax. servlet. servletResponse; import javax. servlet. http. httpServletRequest; import javax. servlet. http. httpServletResponse; public class Compr EssionFilter implements Filter {@ Override public void init (FilterConfig filterConfig) throws ServletException {// TODO Auto-generated method stub} @ Override public void doFilter (ServletRequest request, response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; String encodings = req. getHeader ("accept-encoding"); if (encodings! = Null) & encodings. indexOf ("gzip")>-1) {// establish a response encapsulation CompressionResponseWrapper responseWrapper = new CompressionResponseWrapper (res); // set the response content encoding to gzip format responseWrapper. setHeader ("content-encoding", "gzip"); chain. doFilter (request, responseWrapper); GZIPOutputStream gzipOutputStream = responseWrapper. getGZIPOutputStream (); if (gzipOutputStream! = Null) {// call the finish () method of GZIPOutputStream to compress the output gzipOutputStream. finish () ;}} else {chain. doFilter (request, response) ;}@override public void destroy () {// TODO Auto-generated method stub }}
Finally, set the filter in web. xml, and the response will be compressed.