java通过Filter过滤器实现html静态文件301重定向

日期:2016-08-31 23:20:32

留言:0

分类:经验心得

标签: html Java

在公司的项目中,有一些特殊需求,例如有些生成的html静态文件,需要重定向到一些指定的新页面上,而且有些旧页面重定向到新页面内容跟地址都是差异很大的,本文介绍通过java的过滤器Filter来实现这个功能。

html静态文件301重定向实现原理描述:

1)在需要重定向的html文件顶部第一行放入一个自定义的标签,例如我是用<!--301:http://www.zengdongwu.com/-->,用户可以根据自己需求写,但是解析的规则也要配合变化。

2)通过Filter过滤所有*.html的请求。

3)从请求中取得真实物理路径的地址。

4)通过IO流取得文件的首行内容,关闭输入流。

5)通过正则表达式检验是否存在301重定向标签,以及提取重定向的url。

6)如果有合法的301重定向url,直接返回301状态码及url,否则调用doFilter()方法直接往下运行。

html静态文件301重定向实例代码:

package com.zengdongwu.www.rewrite;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

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 HtmlRedirector implements Filter {

	@Override
	public void destroy() {}

	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {
		// 转换request
		HttpServletRequest request = (HttpServletRequest)req;
		// 获取301转发地址
		String redirectUrl = getRedirectUrl(request);
		// 如果找到,返回301
		if (redirectUrl != null) {
			HttpServletResponse response = (HttpServletResponse)res;
			response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
			response.setHeader("Location", redirectUrl);
		} else {
			chain.doFilter(req, res);
		}
	}

	private String getRedirectUrl(HttpServletRequest request) {
		
		// 获取请求文件物理路径
		String realPath = request.getServletContext().getRealPath("/");
		String uri = request.getRequestURI();
		
		//二级目录应用部署debug,防止应用名重复
		String contextPath = request.getContextPath();
		uri = uri.replaceFirst(contextPath, "");
		
		File file = new File(realPath + uri);
		if (!file.exists())
			return null;
		
		// 获取html文件首行内容
		RandomAccessFile raf;
		String firstLine;
		try {
			raf = new RandomAccessFile(file,"r");
			firstLine = raf.readLine();
			raf.close();
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
		
		return parseUrl(firstLine);
	}

	private String parseUrl(String firstLine) {
		if (firstLine == null)
			return null;
		// 此处正则表达式开头和结尾加入.是为了防止有些文件编码问题读取出现?或者乱码符号,或者兼容用户输入的额外符号。
		Pattern p = Pattern.compile(".*?<!--301:(.+?)-->.*");
		Matcher m = p.matcher(firstLine);
		if (m.matches() && m.groupCount() > 0)
			return m.group(1);
		return null;
	}

	@Override
	public void init(FilterConfig config) throws ServletException {}

}

web.xml配置

把代码部署到您的网站应用中,还需要改动WEB-INF目录下的web.xml文件,请加入如下配置:

<filter>
	<filter-name>HtmlRedirector</filter-name>
	<filter-class>com.zengdongwu.www.rewrite.HtmlRedirector</filter-class>
</filter>

<filter-mapping>
	<filter-name>HtmlRedirector</filter-name>
	<url-pattern>*.html</url-pattern>
</filter-mapping>

如果您的静态文件为index.html,请求路径是省略路径,那么请过滤所有请求,并且在获取请求物理路径中自行区分地址。

PS:本文为作者原创,请尊重作者劳动成果,转载时请注明引用出处。

给我留言
留言表
ZengDongwu
Hi ~ 当前还没有人留言,欢迎您给我留言 ^_^