java中过滤器的使用

原创 2016年05月31日 14:01:10
public final class EntranceFilter implements Filter {

	private static final String JSONP_CALLBACK = "callback";
	private static final String JSONP_UPLOAD_CALLBACK = "uploadcallback";
	private static final String HTTP_AJAX_TYPE = "ajax";

	@SuppressWarnings("unchecked")
	public void doFilter(ServletRequest req, ServletResponse respon, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) respon;
		
		//请求类型  如果是ajax请求响应头会有,x-requested-with;
		if (request.getHeader("x-requested-with") != null
				&& request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
			TempleConfigContext.setCurrentRequestType(TempleConfigContext.AJAX_REQUEST_TYPE);
		}
		
		//跨域请求
		if(request.getParameter(JSONP_CALLBACK) != null || request.getParameter(JSONP_UPLOAD_CALLBACK) != null){
			TempleConfigContext.setCurrentRequestType(TempleConfigContext.AJAX_REQUEST_TYPE);
		}
		
		if(request.getParameter(HTTP_AJAX_TYPE) != null){
			TempleConfigContext.setCurrentRequestType(TempleConfigContext.AJAX_REQUEST_TYPE);
		}
		
		//请求是ajax请求
		if(TempleConfigContext.getCurrentRequestType() == TempleConfigContext.AJAX_REQUEST_TYPE){
			ByteResponseWrapper brw = new ByteResponseWrapper(response);
			chain.doFilter(request, brw);
			String out = new String(brw.getBytes());
			
			//ajax矫正
			if(TempleConfigContext.getCurrentRequestType() == TempleConfigContext.AJAX_REQUEST_TYPE){
				Map<String, Object> map = null;
				try {
					map = JsonTool.getMap4Json(out);
				} catch (JSONException ex) {
					map = new HashMap<String, Object>();
					map.put(Constant.MESSAGE, out);
				}
				
				int status = brw.getStatus();
				response.setStatus(HttpStatus.OK.value());
				if (status >= 200 && status < 300 || status == 304) {
					if (status == 304) {
						response.setStatus(HttpStatus.NOT_MODIFIED.value());
					}
					map.put(Constant.STATUS, Constant.SUCCESS);
				} else {
					map.put(Constant.STATUS, Constant.FAILURE);
				}
				out = JSONObject.fromObject(map).toString();
			}
			
//			System.out.println(out);
			if (request.getParameter(JSONP_CALLBACK) != null) {
				out = request.getParameter(JSONP_CALLBACK) + "(" + out + ");";
				response.setCharacterEncoding("utf8");
				response.setContentType("application/json;charset=" + Constant.ENCODING);
				response.setContentLength(out.getBytes().length);
				response.getOutputStream().write(out.getBytes());
				response.getOutputStream().flush();
			}else if(request.getParameter(JSONP_UPLOAD_CALLBACK) != null){
				out = URLEncoder.encode(out, Constant.ENCODING); 
				response.setCharacterEncoding(Constant.ENCODING);
				response.setContentType("text/html;charset=" + Constant.ENCODING);
				response.setHeader("Cache-Control", "no-cache");
				response.addHeader("Access-Control-Allow-Origin", "*");
				response.addHeader("Access-Control-Allow-Headers", "x-requested-with");
				response.addHeader("Location", Constant.FRONT_DOMAIN_NAME + "/deal_callback.html?" + request.getParameter(JSONP_UPLOAD_CALLBACK) + "(" + out + ")");
				response.sendRedirect(Constant.FRONT_DOMAIN_NAME + "/deal_callback.html?" + request.getParameter(JSONP_UPLOAD_CALLBACK) + "(" + out + ")");
			}else {
				response.getOutputStream().write(out.getBytes());
				response.getOutputStream().flush();
			}
		}else {
			chain.doFilter(request, respon);
		}
		
		TempleConfigContext.removeContext();
	}

	public void destroy() {
		
	}

	public void init(FilterConfig filterConfig) {

	}

	static class ByteResponseWrapper extends HttpServletResponseWrapper {
		private PrintWriter writer;
		private ByteOutputStream output;
		private int code = 200;

		public byte[] getBytes() {
			writer.flush();
			return output.getBytes();
		}

		public ByteResponseWrapper(HttpServletResponse response) {
			super(response);
			output = new ByteOutputStream();
			writer = new PrintWriter(output);
		}

		@Override
		public PrintWriter getWriter() {
			return writer;
		}

		@Override
		public ServletOutputStream getOutputStream() throws IOException {
			return output;
		}

		public int getStatus() {
			return code;
		}

		public void sendRedirect(String location) throws IOException {
			code = HttpStatus.MOVED_TEMPORARILY.value();
			super.sendRedirect(location);
		}

		@Override
		public void setStatus(int sc) {
			this.code = sc;
		}

		@Override
		public void setStatus(int sc, String message) {
			this.code = sc;
		}

		@Override
		public void sendError(int sc) throws IOException {
			this.code = sc;
		}

		@Override
		public void sendError(int sc, String msg) throws IOException {
			this.code = sc;
		}
	}

	static class ByteOutputStream extends ServletOutputStream {
		private ByteArrayOutputStream bos = new ByteArrayOutputStream();

		@Override
		public void write(int b) throws IOException {
			bos.write(b);
		}

		public byte[] getBytes() {
			return bos.toByteArray();
		}
	}

	private static class JsonTool {
		@SuppressWarnings({ "unchecked", "rawtypes" })
		public static Map getMap4Json(String jsonString) {
			JSONObject jsonObject = JSONObject.fromObject(jsonString);
			Iterator keyIter = jsonObject.keys();
			String key;
			Object value;
			Map valueMap = new HashMap();

			while (keyIter.hasNext()) {
				key = (String) keyIter.next();
				value = jsonObject.get(key);
				valueMap.put(key, value);
			}

			return valueMap;
		}
	}
}

如果请求是跨域的则请求会带一个callback的参数 进入过滤器并设置请求类型是AJAX_REQUEST_TYPE

当准备响应给浏览器时 再次进入过滤器将返回的字符串转化为JSON对象 这里controller的返回类型必须是对象类型 比如Map<String, Object>或者bean 不能是JSONArray对象或者直接是List对象 因为JsonTool.getMap4Json转化json的时候JSONObject.fromObject()这句的限制只能转化Object


版权声明:本文为博主原创文章,未经博主允许不得转载。

java使用Filter过滤器对Response返回值进行修改

有时候在开发过程中会有这样一个场景,有时需要对返回的数据进行处理。比如加密啊,添加某些标记啊等等。这种情况我们可以通过过滤器去处理。 过滤器是什么就不介绍了,百度一下,你就知道。 看看代码...
  • KokJuis
  • KokJuis
  • 2017年08月18日 17:13
  • 1457

Java程序员从笨鸟到菜鸟之(二十一)java过滤器和监听器详解

过滤器 1、Filter工作原理(执行流程)               当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请...

过滤器返回值

response.setCharacterEncoding("UTF_8");//设置Response的编码方式为UTF-8 response.setHeader("Content-type","te...
  • yy3097
  • yy3097
  • 2016年10月14日 10:56
  • 448

JavaWeb学习篇之----Servlet过滤器Filter

一、Servlet过滤器接口的构成: 所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法: A.init(FilterConfi...

java过滤器的使用

  • 2010年08月22日 23:17
  • 5KB
  • 下载

Java中过滤器的使用

  • 2014年08月06日 12:30
  • 183KB
  • 下载

使用java的过滤器filter备忘(get和post)

测试中间件是weblogic8.1.4,jdk 是weblogic 自带的1.42 对于不同的请求方式,需要采取不同的处理方式 一。GET 方法      可以用request 的 getParame...

java 中如何使用filter过滤器

  • 2011年12月01日 14:35
  • 4KB
  • 下载

java web 过滤器跟拦截器的区别和使用

1、首先要明确什么是拦截器、什么是过滤器 1.1 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java中过滤器的使用
举报原因:
原因补充:

(最多只允许输入30个字)