Java的实现二级域名访问卖家首页

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_16148137/article/details/51848163

一.使用场景说明

  在电子商务平台中,卖家在平台上可以开自己的店铺,然后买家就可以直接进入到卖家的店铺进行购物.那么问题来了,买家通过什么样的入口进入卖家的店铺?

不加任何处理的方式就是:
1. 在平台上添加卖家店铺入口的链接
2. 直接给用户一个访问卖家店铺首页的URL

  对于第一种方式,是合理的,也是必须要这样做.而第二种很明显就不合理,我想大家作为一个web开发者都知道,上面所说的那个访问卖家首页的url一定是带着很多参数,很长很不优雅,很难记忆的一个url.所以,我们是要给用户一个url,但是这个url必须得是精短的,易记的,优雅的一个URL.所以我们可以为每个店铺配置一个二级域名,用户通过这个二级域名在浏览器输入,就可以直接访问卖家店铺的首页了.


  然后,接下来的第二个问题就来了,我们如何给卖家配置二级域名?为每一个卖家的店铺都在DNS服务器上配置一个二级域名显然是不现实.所以我们要通过程序来实现二级域名的访问.


二.实现原理:

  1. 给DNS配置泛域名解析,也就是在DNS服务器上配置一条: “*.一级域名” 的主机记录,假如您申请的以及域名是 legengshop.com,那在DNS服务器上配置的泛域名解析的主机记录就是 *.legendshop.com 配置泛域名解析的意义就在于让所有的 *.legendshop.com 访问都映射到同一个IP

    关于配置DNS的泛域名解析请参考 DNS泛域名解析

  2. 编写一个过滤器来拦截所有的请求,然后对拦截的请求进行解析,转换成访问卖家店铺首页的url,然后在过滤器进行转发.

    • 如可口可乐在您的电商平台上开了一个店铺,并且可口可乐希望用户可以通过 coco.legendshop.com 访问到他们的店铺首页.但是实际访问可口可乐店铺首页的url却是: www.legendshop.com/shop?shopId=1 ,这时候我们编写的这个过滤器就需要把用户在浏览器输入的 coco.legendshop.com 变为 www.legendshop.com/shop?shopId=1 ,然后进行转发就可以进入到可口可乐店铺首页了.
    • 至于 www.legendshop.com/shop?shopId=1 这条url的含义,以及如何把 coco.legendshop.com 变为 www.legendshop.com/shop?shopId=1 请看下面的详细步奏说明吧!

三. 具体实现

  1. 数据设计

  一般来说,店铺信息应该在数据库有一张店铺表来保存店铺信息的,上面举例的链接 www.legendshop.com/shop?shopId=1 中的shopId=1,其实就是把店铺id通过url参数传到后台,然后后台程序通过这个店铺ID找到数据库对应的店铺数据,再填充到页面,最后将页面响应给用户,那么用户访问的就是店铺首页.数据库的店铺表如下:

shop_id shop_name sec_domain_name shop_info
1 可口可乐 coco 你想和谁分享可口可乐。

  所以我们要做的就是,在数据库的店铺表增加一个用于存放二级域名的字段,每条店铺记录对应一个二级域名.然后我们通过二级域名这个字段就可以查询到对应的店铺ID,然而根据这个店铺ID就可以拼接一个能实际访问店铺首页的url,如上面提到的例子: www.legendshop.com/shop?shopId=1 然后对这个url进行转发,这样就实现了.

  至于二级域名的获取,假如用户在浏览器输入的是 coco.legendshop.com ,这个”coco”就是二级域名,我们只要在过滤器获取到用户访问的主机名,然后进行字符串的切割就可以获取到了.

  1. 过滤器的编写,代码的实现.

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain)
            throws IOException, ServletException {
    
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
    
        //获取域名
        String serverName = request.getServerName();
        //获取访问路径
        String uri = request.getRequestURI();
    
        //如果后面带有路径的,则不拦截
        if(uri.length()>1){
            filterChain.doFilter(request, response);
            return;
        }
    
        //获取主域名
        String domainName = serverName.substring(serverName.indexOf(".")+1);
    
        if(!domainName.equalsIgnoreCase(this.domainName)){
            filterChain.doFilter(request, response);
            return;
        }
    
        //获取二级域名
        String secDomainName = serverName.substring(0, serverName.indexOf("."));
    
        if(retainDomainName.contains(secDomainName)){
            request.getRequestDispatcher("/index.jsp").forward(request, response);
            return;
        }
    
        //根据二级域名获取店铺id
        Integer shopId = shopDao.getShopIdBySecDomainName(secDomainName);
    
        if(null == shopId){
            filterChain.doFilter(request, response);
            return;
        }
    
        //根据获取到的店铺ID拼接成能够访问店铺首页的URL,然后进行转发
        request.getRequestDispatcher("/shop?shopId="+shopId).forward(request, response);
    }
  2. 访问店铺首页的servlet
private ShopDao shopDao = new ShopDao();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //设置字符编码
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");

        //获取用户请求参数,也就是店铺ID
        String shopId = req.getParameter("shopId");

        //根据ID查询店铺信息
        Shop shop = shopDao.getShopById(Integer.parseInt(shopId));

        if(null == shop){
            resp.setStatus(404);
            return;
        }

        req.setAttribute("shop", shop);
        //转发到店铺首页页面
        req.getRequestDispatcher("/WEB-INF/jsp/shop.jsp").forward(req, resp);
    }
  1. web.xml的配置
  <servlet>
    <servlet-name>shopServlet</servlet-name>
    <servlet-class>com.legendshop.servlet.ShopServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>shopServlet</servlet-name>
    <url-pattern>/shop</url-pattern>
  </servlet-mapping>

备注:

  如果在测试阶段不想做DNS的泛域名解析配置,那可以通过更改window的hosts文件进行测试.只需要把您要测试的二级域名呢添加到hosts文件里面去就行了.如下:

# IP                Hosts
127.0.0.1    www.legendshop.com
127.0.0.1    yision.legendshop.com
127.0.0.1    coco.legendshop.com
127.0.0.1    meizu.legendshop.com

———————————本文结束——————————-

PS:

  • 本文属于本人原创文章,转载请注明出处,如果你觉得这篇文章对你有帮助或启发,也可以来请我喝咖啡。
  • 利益相关:本篇文章所有提到的商业品牌或网站链接均为笔者随意想到的,无任何广告费用。
展开阅读全文

没有更多推荐了,返回首页