zoukankan      html  css  js  c++  java
  • Java 之Filter 应用实例--UrlWriterFilter 仿urlrewrite 用来支持二级域名重写

    一、背景

    之前的文章介绍了用Java 做301重定向,即使用Url Rewrite 进行URL 重写来实现网站的伪静态。现在产品这边又多了一个需求,需要网站支持二级域名跳转,比如访问abc.baidu.com 能够跳转到 www.baidu.com/abc。这个功能其实和301 重定向原理是一样的,只不过我们需要自己自定义一个重定向规则。

    二、代码实现

    UrlWriterFactory 工厂类

    public class UrlWriterFactory {
    	private static Log logger = LogFactory.getLog(UrlWriterFactory.class);
    
    	private static final String FORWARD = "forward";
    
    	private static final String REDIRECT = "redirect";
    
    	private static final String DEFAULT_CONFIG_FILE_NAME = "config/urlrewrite.xml";
    
    	private static String urlWriterConfigName;
    
    	/**
    	 * 版本号
    	 */
    	private Long version = System.currentTimeMillis();
    
    	private static List<UrlWriter> urlPatternList = new ArrayList<UrlWriter>();
    
    	public void init() {
    		if (StringUtils.isBlank(urlWriterConfigName)) {
    			urlWriterConfigName = DEFAULT_CONFIG_FILE_NAME;
    		}
    		InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(urlWriterConfigName);
    		if (null == inputStream) {
    			throw new RuntimeException("没有配置urlrewrite.xml");
    		}
    		urlPatternList = initUrlWriter(inputStream);
    	}
    @SuppressWarnings("unchecked")
    	private List<UrlWriter> initUrlWriter(InputStream inputStream) {
    		List<UrlWriter> urlPatternList = new ArrayList<UrlWriter>();
    		SAXReader reader = new SAXReader();
    		try {
    			Document doc = reader.read(inputStream);
    			List<Node> nodes = doc.selectNodes("urlrewrite/rule");
    
    			for (Node elm : nodes) {
    				UrlWriter urlMapping = new UrlWriter();
    				String from = ((Element) elm).elementText("from");
    				from = StringUtils.isBlank(from) ? "" : from;
    				urlMapping.setFrom(from);
    
    				String to = ((Element) elm).elementText("to");
    				to = StringUtils.isBlank(to) ? "" : to;
    				urlMapping.setTo(to);
    
    				Attribute attribute = ((Element) elm).element("to").attribute("type");
    				String type = FORWARD;
    				if (null != attribute) {
    					if (StringUtils.isBlank(attribute.getValue())) {
    						type = attribute.getValue();
    					}
    				}
    				urlMapping.setType(type);
    				urlPatternList.add(urlMapping);
    			}
    			return urlPatternList;
    		} catch (DocumentException e) {
    
    			logger.error("解析url.xml时发现异常:" + e);
    		}
    		return urlPatternList;
    
    	}
    
    public static UrlResult getUrlResult(String url) {
    		if (StringUtils.isEmpty(url)) {
    			return null;
    		}
    		url = filterUrlStyle(url);
    		UrlResult urlResult = new UrlResult(false, "");
    		for (UrlWriter urlMapping : urlPatternList) {
    			Pattern pattern = Pattern.compile(urlMapping.getFrom());
    			Matcher matcher = pattern.matcher(url);
    			if (matcher.find()) {
    				// urlResult.setUrl(matcher.replaceAll(urlMapping.getTo()));
    				String urlTo = urlMapping.getTo();
    				for (int i = 1; i <= matcher.groupCount(); i++) {
    					urlTo = urlTo.replace("$" + i, matcher.group(i));
    				}
    				if (!urlTo.contains(".html")) {
    					urlTo = urlTo + File.separator + "index.html";
    				}
    				urlResult.setUrl(urlTo);
    				if (urlMapping.getType().equals(REDIRECT)) {
    					urlResult.setFlag(true);
    				}
    				return urlResult;
    			}
    		}
    		return urlResult;
    	}
    
    public static class UrlResult {
    		private boolean flag = false;
    		private String url = "";
    
    		public UrlResult(boolean flag, String url) {
    			super();
    			this.flag = flag;
    			this.url = url;
    		}
    
    		public boolean isFlag() {
    			return flag;
    		}
    
    		public void setFlag(boolean flag) {
    			this.flag = flag;
    		}
    
    		public String getUrl() {
    			return url;
    		}
    
    		public void setUrl(String url) {
    			this.url = url;
    		}
    	}
    
    public String getUrlWriterConfigName() {
    		return urlWriterConfigName;
    	}
    
    	public void setUrlWriterConfigName(String urlWriterConfigName) {
    		UrlWriterFactory.urlWriterConfigName = urlWriterConfigName;
    	}
    
    	public Long getVersion() {
    		return version;
    	}
    
    	public void setVersion(Long version) {
    		this.version = version;
    	}
    
    	private static String filterUrlStyle(String url) {
    		if (url.indexOf("://") != -1) {
    			url = url.substring(url.indexOf("://") + 3);
    		}
    		// if (url.length() > 1 && url.endsWith("/")) {
    		// url = url.substring(0, url.length() - 1);
    		// }
    		return url;
    	}
    
    public static boolean checkIfSecondDomain(String url) {
    		if (StringUtil.isBlank(url)) {
    			return false;
    		}
    		if (!url.contains("\.company")) {
    			return false;
    		}
    		return false;
    	}
    

    UrlWriter 实体bean

    public class UrlWriter {
    	private String from;
    	private String to;
    	private String type;
    
    	public String getFrom() {
    		return from;
    	}
    
    	public void setFrom(String from) {
    		this.from = from;
    	}
    
    	public String getTo() {
    		return to;
    	}
    
    	public void setTo(String to) {
    		this.to = to;
    	}
    
    	public String getType() {
    		return type;
    	}
    
    	public void setType(String type) {
    		this.type = type;
    	}
    }
    

    UrlWriterFilter 过滤器方法

    public class UrlWriterFilter implements Filter {
    
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    			throws IOException, ServletException {
    		HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    		HttpServletResponse httpServletResponse = (HttpServletResponse) response;
    		String requestURL = httpServletRequest.getRequestURL().toString();
    		System.out.println("URL的值" + requestURL);
    		// 屏蔽镜像网站
    		if (requestURL.indexOf(".xiniu1688.com") == -1) {
    			request.getRequestDispatcher("/error/404.do").forward(request, response);// 跳转到信息提示页面!!
    			return;
    		}
    		// 非二级域名直接过滤掉
    		if (requestURL.startsWith("http://www.xxxx.com") || requestURL.startsWith("http://xxxx.com")) {
    			chain.doFilter(request, response);
    			return;
    		}
    		UrlWriterFactory uf = new UrlWriterFactory();
    		uf.init();
    		UrlResult urlResult = UrlWriterFactory.getUrlResult(requestURL);
    
    		if (null != urlResult && !StringUtil.isBlank(urlResult.getUrl())) {
    			String realPath = urlResult.getUrl();
    			if (urlResult.isFlag()) {
    				httpServletResponse.sendRedirect(realPath);
    				return;
    			} else {
    				if (!realPath.startsWith("/")) {
    					realPath = "/" + realPath;
    				}
    				httpServletRequest.getRequestDispatcher(realPath).forward(request, response);
    				return;
    			}
    		} else {
    			chain.doFilter(request, response);
    		}
    	}
    
    	@Override
    	public void destroy() {
    	}
    
    	/*
    	 * (non-Javadoc)
    	 * 
    	 * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
    	 */
    	@Override
    	public void init(FilterConfig filterConfig) throws ServletException {
    
    	}
    
    }
    

    urlrewrite.xml 配置文件,放在根目录下面的conf 文件夹下

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN"
            "http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">
    <urlrewrite>
    	<rule>
    		<from>^(.*).xxxx.com/(.*)$</from>
    		<to>/company/$1/$2</to>
    	</rule>
    </urlrewrite>
    

    web.xml 配置

    <!-- urlrewriter 重写 -->
    	<filter>
            <filter-name>SecDomainUrlWriterFilter</filter-name>
            <filter-class>com.xxx.xxx.urlwriter.UrlWriterFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>SecDomainUrlWriterFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

     参考: 仿一个urlrewrite 支持二级域名

    声明:本文版权归作者和博客园共有,欢迎转载,但请在文章页面明显位置给出原文连接。 
  • 相关阅读:
    BlockUI常见问题
    AssemblyInfo文件
    asp.net 如何让虚拟目录里面的webconfig不继承主目录config(转)
    jquery Ajax示例
    jQuery Ajax 实例 全解析 (转)
    如何在ASP.NET服务器控件库中嵌入JavaScript脚本文件(转)
    如何使用ASP.NET2.0的“嵌入的资源”(转)
    BlockUI对话框
    Jquery ajax参数设置
    What's production quality
  • 原文地址:https://www.cnblogs.com/hellovoyager1/p/9224376.html
Copyright © 2011-2022 走看看