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 支持二级域名

    声明:本文版权归作者和博客园共有,欢迎转载,但请在文章页面明显位置给出原文连接。 
  • 相关阅读:
    UVA 408 (13.07.28)
    linux概念之用户,组及权限
    Java实现 蓝桥杯 历届试题 网络寻路
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 九宫重排
    Java实现 蓝桥杯 历届试题 九宫重排
  • 原文地址:https://www.cnblogs.com/hellovoyager1/p/9224376.html
Copyright © 2011-2022 走看看