[Servlet & amp; JSP] use of the package

Source: Internet
Author: User
Tags wrappers

[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.

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.