利用filter更改response簡例

package com.matrix.filter;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.net.URI;

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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

/**
 * Servlet Filter implementation class MyFilter
 */
@WebFilter("/MyFilter")
public class MyFilter implements Filter
{

	private String basePath;

	/**
	 * Default constructor.
	 */
	public MyFilter() {
		// TODO Auto-generated constructor stub
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain filterChain)
	{
		this.basePath = getBaseURL((HttpServletRequest)request);
		
		CheckFrameHttpServletResponseWrapper wrapper = new CheckFrameHttpServletResponseWrapper(
				(HttpServletResponse) response);
		try
		{
			filterChain.doFilter(request, wrapper);
		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	public void destroy()
	{

	}

	public void init(FilterConfig arg0) throws ServletException
	{

	}

	private class CheckFrameHttpServletResponseWrapper extends
			HttpServletResponseWrapper
	{

		public CheckFrameHttpServletResponseWrapper(HttpServletResponse response) {

			super(response);
		}

		public PrintWriter getWriter() throws IOException
		{
			return new CheckFrameWriter(super.getWriter());
		}
	}

	private class CheckFrameWriter extends PrintWriter
	{
		String checkString = "waterif";

		public CheckFrameWriter(Writer out) {
			super(out);
		}

		public void write(int c)
		{
			super.write((char) c);
		}

		public void write(char buf[], int off, int len)
		{
			StringBuffer sb = new StringBuffer(len);
			for (int i = 0; i < len; i++)
			{
				sb.append(buf[off + i]);
			}
			String s = sb.toString();
			int bodyIndex = s.indexOf("<body>");
			if (bodyIndex > -1)
			{
				String part1 = s.substring(0, bodyIndex);
				String part2 = s.substring(bodyIndex);
				s = part1 + checkString + part2;
			}
			for (int i = 0; i < s.length(); i++)
			{
				write(s.charAt(i));
			}
		}

		public void write(String s, int off, int len)
		{
			s = s.replaceAll("http://localhost:8090", "http://127.0.0.1:8090");
			for (int i = 0; i < len; i++)
			{
				write(s.charAt(off + i));
			}
		}
	}

	public static String getBaseURL(HttpServletRequest request)
	{
		String reqPrefix = request.getRequestURL().toString();
		String pathInfo = request.getPathInfo() == null ? "" : request
				.getPathInfo();
		// fix for CXF-898
		if (!"/".equals(pathInfo) || reqPrefix.endsWith("/"))
		{
			StringBuilder sb = new StringBuilder();
			// request.getScheme(), request.getLocalName() and
			// request.getLocalPort()
			// should be marginally cheaper - provided request.getLocalName()
			// does
			// return the actual name used in request URI as opposed to
			// localhost
			// consistently across the Servlet stacks

			URI uri = URI.create(reqPrefix);
			sb.append(uri.getScheme()).append("://")
					.append(uri.getRawAuthority());
			sb.append(request.getContextPath())
					.append(request.getServletPath());

			reqPrefix = sb.toString();
		}
		return reqPrefix;
	}

}







  <filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.matrix.filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/services/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
  </filter-mapping>




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章