精华内容
下载资源
问答
  • 最近做一个网站,客户要求在访问主域名的时候实现电脑访问时展示电脑页面,手机访问时展示h5的手机页面,这种需求的使用还是比较的;尤其网站需要百度推广的时候,百度推广就要求同一域名下,手机访问时展示手机...
    最近做一个网站,客户要求在访问主域名的时候实现电脑访问时展示电脑页面,手机访问时展示h5的手机页面,这种需求的使用还是比较多的;尤其网站需要百度推广的时候,百度推广就要求同一域名下,手机访问时展示手机页面,电脑访问时展示电脑。
    在这里将需求的思路和实现代码展示一下。
    首先分析思路,手机和电脑访问的时候会有不同的标记,主要是请求时HTTP协议中的请求头的User-Agent字段,咱们先看一段真是的HTTP协议的请求内容。
    使用浏览器的开发者工具就可以请求信息。不同类型的浏览器可以通过UA(User-Agent)去区分,所以我们在服务器端就可以去获取UA,然后我们判断UA来区分是手机浏览器还是电脑浏览器。我在这里整理了大部分常用的手机浏览器的UA:
     
     1 String[] mobileAgents = { “iphone”, “android”, “phone”, “mobile”,
     2 “wap”, “netfront”, “java”, “opera mobi”, “opera mini”, “ucweb”,
     3 “windows ce”, “symbian”, “series”, “webos”, “sony”,
     4 “blackberry”, “dopod”, “nokia”, “samsung”, “palmsource”, “xda”,
     5 “pieplus”, “meizu”, “midp”, “cldc”, “motorola”, “foma”,
     6 “docomo”, “up.browser”, “up.link”, “blazer”, “helio”, “hosin”,
     7 “huawei”, “novarra”, “coolpad”, “webos”, “techfaith”,
     8 “palmsource”, “alcatel”, “amoi”, “ktouch”, “nexian”,
     9 “ericsson”, “philips”, “sagem”, “wellcom”, “bunjalloo”, “maui”,
    10 “smartphone”, “iemobile”, “spice”, “bird”, “zte-“, “longcos”,
    11 “pantech”, “gionee”, “portalmmm”, “jig browser”, “hiptop”,
    12 “benq”, “haier”, “^lct”, “320×320”, “240×320”, “176×220”,
    13 “w3c “, “acs-“, “alav”, “alca”, “amoi”, “audi”, “avan”, “benq”,
    14 “bird”, “blac”, “blaz”, “brew”, “cell”, “cldc”, “cmd-“, “dang”,
    15 “doco”, “eric”, “hipt”, “inno”, “ipaq”, “java”, “jigs”, “kddi”,
    16 “keji”, “leno”, “lg-c”, “lg-d”, “lg-g”, “lge-“, “maui”, “maxo”,
    17 “midp”, “mits”, “mmef”, “mobi”, “mot-“, “moto”, “mwbp”, “nec-“,
    18 “newt”, “noki”, “oper”, “palm”, “pana”, “pant”, “phil”, “play”,
    19 “port”, “prox”, “qwap”, “sage”, “sams”, “sany”, “sch-“, “sec-“,
    20 “send”, “seri”, “sgh-“, “shar”, “sie-“, “siem”, “smal”, “smar”,
    21 “sony”, “sph-“, “symb”, “t-mo”, “teli”, “tim-“, “tosh”, “tsm-“,
    22 “upg1”, “upsi”, “vk-v”, “voda”, “wap-“, “wapa”, “wapi”, “wapp”,
    23 “wapr”, “webc”, “winw”, “winw”, “xda”, “xda-“,
    24 “Googlebot-Mobile” };

     

    将UA存放到字符串数组中。
    然后封装成了一个判断是否是手机UA的方法:
     
     1 /**
     2  * 判断是否是手机访问
     3  * 
     4  * @param request
     5  * @return
     6  */
     7 public boolean isMoblie(HttpServletRequest request) {
     8     boolean isMoblie = false;
     9     String[] mobileAgents = { "iphone", "android", "phone", "mobile",
    10             "wap", "netfront", "java", "opera mobi", "opera mini", "ucweb",
    11             "windows ce", "symbian", "series", "webos", "sony",
    12             "blackberry", "dopod", "nokia", "samsung", "palmsource", "xda",
    13             "pieplus", "meizu", "midp", "cldc", "motorola", "foma",
    14             "docomo", "up.browser", "up.link", "blazer", "helio", "hosin",
    15             "huawei", "novarra", "coolpad", "webos", "techfaith",
    16             "palmsource", "alcatel", "amoi", "ktouch", "nexian",
    17             "ericsson", "philips", "sagem", "wellcom", "bunjalloo", "maui",
    18             "smartphone", "iemobile", "spice", "bird", "zte-", "longcos",
    19             "pantech", "gionee", "portalmmm", "jig browser", "hiptop",
    20             "benq", "haier", "^lct", "320x320", "240x320", "176x220",
    21             "w3c ", "acs-", "alav", "alca", "amoi", "audi", "avan", "benq",
    22             "bird", "blac", "blaz", "brew", "cell", "cldc", "cmd-", "dang",
    23             "doco", "eric", "hipt", "inno", "ipaq", "java", "jigs", "kddi",
    24             "keji", "leno", "lg-c", "lg-d", "lg-g", "lge-", "maui", "maxo",
    25             "midp", "mits", "mmef", "mobi", "mot-", "moto", "mwbp", "nec-",
    26             "newt", "noki", "oper", "palm", "pana", "pant", "phil", "play",
    27             "port", "prox", "qwap", "sage", "sams", "sany", "sch-", "sec-",
    28             "send", "seri", "sgh-", "shar", "sie-", "siem", "smal", "smar",
    29             "sony", "sph-", "symb", "t-mo", "teli", "tim-", "tosh", "tsm-",
    30             "upg1", "upsi", "vk-v", "voda", "wap-", "wapa", "wapi", "wapp",
    31             "wapr", "webc", "winw", "winw", "xda", "xda-",
    32             "Googlebot-Mobile" };
    33     if (request.getHeader("User-Agent") != null) {
    34         for (String mobileAgent : mobileAgents) {
    35             if (request.getHeader("User-Agent").toLowerCase()
    36                     .indexOf(mobileAgent) >= 0) {
    37                 isMoblie = true;
    38                 break;
    39             }
    40         }
    41     }
    42     return isMoblie;
    43 }

     

     

    这个时候我们要考虑的就是如何拦截客户端的请求了,之前想过用Servlet的url匹配去拦截,但是会造成拦截所有请求包括转发,后来想到用Filter拦截器可以产生拦截和放行的效果,果断采用Filter(咱们先不谈框架里的拦截器)。
    Filter代码如下:
     1 public class WapFilter implements Filter {
     2     @Override
     3     public void doFilter(ServletRequest request, ServletResponse response,
     4             FilterChain chain) throws IOException, ServletException {
     5         response.setContentType("text/html;charset=utf-8");
     6         HttpServletRequest httpRequest = (HttpServletRequest) request;
     7         String uri = httpRequest.getRequestURI();
     8         if (isMoblie(httpRequest)) {
     9             httpRequest.getRequestDispatcher("/wap" + uri).forward(request,
    10                     response);
    11         } else {
    12             chain.doFilter(request, response);// 电脑放行
    13         }
    14     }
    15         //省略其他代码……
    16 }

     

    web.xml配置文件代码:
    1 <filter>
    2 <filter-name>wapfilter</filter-name>
    3 <filter-class>cn.dtblog.filter.WapFilter</filter-class>
    4 </filter><filter-mapping>
    5 <filter-name>wapfilter</filter-name>
    6 <url-pattern>/*</url-pattern>
    7 </filter-mapping>

     

    我们拦截所有的请求(懒汉做法(●ˇ∀ˇ●)),在Filter的代码中我们可以看到,判断为手机的UA后实现转发,并且是转发到wap文件夹下拼接请求的jsp的名字;下面给出一个拼接路径的对照表:
    电脑地址 拼接wap后的手机网址
    /index.jsp /wap/index.jsp
    /about.jsp /wap/about.jsp
    所以我们还需要在wap目录下创建文件名一样(h5页面)的jsp文件(也可以考虑放到WEB-INF下隐藏访问),这样我们手机在访问时,就会被转发到指定的jsp文件,从而实现地址不变,内容改变的效果。
    这是我在做网站的一个小小的思路,希望也能帮助到有需要的朋友,如果你有更好的思路或建议,也欢迎评论中提出。
     

    原文由博主 乐智 编辑撰写,版权归博主所有。

    原文地址 http://www.dtblog.cn/1105.html 转载请注明出处!

    转载于:https://www.cnblogs.com/AIThink/p/5827758.html

    展开全文
  • 0200 代码段应小于 64K。  0201 操作系统无法运行 %1。  0202 操作系统无法运行 %1。  0203 系统找不到输入的环境选项。  0205 在命令子树中的进程没有信号句柄。  0206 文件名或扩展名太长。  ...
  • 4.4 通过编程实现同一窗体的个副本 83 4.4.1 支持窗体实例 84 4.4.2 检查Employees窗体的代码 84 4.4.3 自动关闭Employees窗体 86 4.5 小 结 87 第5章 使用DAO 88 5.1 理解DAO 88 5.1.1 了解...
  • 仿京东商城购物系统正式版

    热门讨论 2012-03-05 20:23:54
    7)商品可选参数:同一款商品可以设置不同的参数如颜色、尺码让客户选择 8)商品积分、编号可以选手动输入或者按照规则自动生成,库存可设置默认值 9)商品价格体系 市场价格-仅供参考不参与订购计算 本站价格-...
  • 索引聚簇表:索引聚簇表是表相关的表共享同一数据块中的相同列,并把相关数据存储中同一个数据块上。创建索引聚簇表中最重要的是对SIZE参数有很好的估量,否则聚簇将会降低空间利用,降低效率。 使用索引聚簇表的...
  • 什么是VLAN

    2013-10-23 09:59:12
     VLAN除了能将网络划分为个广播域,从而有效地控制广播风暴的发生,以及使网络的拓扑结构变得非常灵活的优点外,还可以用于控制网络中不同部门、不同站点之间的互相访问。  VLAN是为解决以太网的广播问题和安全...
  • 随着网络安全的日益提高,为防止部分恶意人员对商城进行点击或其他不法行为,网趣网上购物系统新增IP访问限制功能,添加某IP后即可限制此IP人员的访问,同时系统支持IP的限制访问功能,可对同一IP进行访问限制...
  • 随着网络安全的日益提高,为防止部分恶意人员对商城进行点击或其他不法行为,网趣网上购物系统新增IP访问限制功能,添加某IP后即可限制此IP人员的访问,同时系统支持IP的限制访问功能,可对同一IP进行访问限制...
  • Spring面试题

    2015-05-06 07:19:39
    7. 表字要少,表关联不要怕,有二级缓存撑腰 7. Struts工作机制?为什么要使用Struts? 工作机制: Struts的工作流程: 在web应用启动时就会加载初始化ActionServlet,ActionServlet从 struts-config.xml文件中...
  • 网趣商城ASP源码

    2013-02-17 17:11:35
    随着网络安全的日益提高,为防止部分恶意人员对商城进行点击或其他不法行为,网趣网上购物系统新增IP访问限制功能,添加某IP后即可限制此IP人员的访问,同时系统支持IP的限制访问功能,可对同一IP进行访问限制...
  • 在计划阶段,团队和客户共同定 义构建和部署的内容以及构建的方式和时机/在开发阶段,团队构建并测试解决方案,具体包括代码、基础构架和文档等交付成果。/在稳定阶段,对功能齐全的解决方案进行最后的测试,使其...
  • 在此之前译者只是奇怪有相当长的一时间访问不了Stevens博士的个人主页,并没想到其背后隐蔽着这件令全世界计算机界和网络工作者为之扼腕叹息的事。当时本书的翻译工作尚未开始,译者也曾一度在是否接手翻译上徘徊...
  • asp.net知识库

    2015-06-18 08:45:45
    关于能自定义格式的、支持语言的、支持数据库的代码生成器的想法 发布Oracle存储过程包c#代码生成工具(CodeRobot) New Folder XCodeFactory3.0完全攻略--序 XCodeFactory3.0完全攻略--基本思想 XCodeFactory...
  • 态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 5、String是最基本的数据类型吗?  基本数据类型包括byte、int、char、long、float、double、boolean和short。  java....
  • 中,如果不关心a[]的哪一个分量会被写入,这段代码就没有问题,i也的确会增加1,对吗? 3.11 人们总是说i=i++的行为是未定义的。可我刚刚在一个ANSI编译器上尝试过,其结果正如我所期望的。 3.12 我不想学习那些...
  • 系统自动避免同一用户次提交。 管理员可增加、删除、修改调查问卷;管理员可设定当前生效的调查问卷;管理员可对历史调查问卷进行关闭操作,一旦关闭将无法进行答卷;管理员可对调查问卷增加新的调查题目,对历史...
  • java 面试题 总结

    2009-09-16 08:45:34
    态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang....
  • o 8.1 为什么这段代码不行?char *answer; printf("Type something:\n"); gets(answer); printf("You typed \"%s\"\n", answer); o 8.2 我的 strcat() 不行.我试了 char *s1 = "Hello, "; char *s2 = "world!"; ...
  • 6.1 同一类型和不同类型的个对象 6.2 简单数组 6.2.1 数组的声明 6.2.2 数组的初始化 6.2.3 访问数组元素 6.2.4 使用引用类型 6.3 多维数组 6.4 锯齿数组 6.5 Array类 6.5.1 创建数组 6.5.2 复制数组 6.5.3 排序...
  • 6.1 同一类型和不同类型的个对象 6.2 简单数组 6.2.1 数组的声明 6.2.2 数组的初始化 6.2.3 访问数组元素 6.2.4 使用引用类型 6.3 多维数组 6.4 锯齿数组 6.5 Array类 6.5.1 创建数组 6.5.2 复制数组 6.5.3 排序...
  • 6.1 同一类型和不同类型的个对象 6.2 简单数组 6.2.1 数组的声明 6.2.2 数组的初始化 6.2.3 访问数组元素 6.2.4 使用引用类型 6.3 多维数组 6.4 锯齿数组 6.5 Array类 6.5.1 创建数组 6.5.2 复制数组 6.5.3 排序...
  • 中,如果不关心a[]的哪一个分量会被写入,这段代码就没有问题,i也的确会增加1,对吗? 38  3.11 人们总是说i=i++的行为是未定义的。可我刚刚在一个ANSI编译器上尝试过,其结果正如我所期望的。 38  3.12 我不...
  • 数据交换需求规格说明书

    热门讨论 2011-03-01 14:57:51
    根据客户需求数据交换平台主要采用数据中心和数据交换代理节点的结构来简化电子政务应用主体内部功能体之间、主体与主体之间所存在的复杂的相互关系,在代理节点上提供相应的服务来方便老应用系统的接入并提供一致的...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    1.Web安全性的考虑(表单验证、浏览器Basic方式的验证,应用程序的安全性,SSL,代码考虑) 2.简单介绍您所了解的MVC。 3.简单介绍所了解的XML。 4.文档和编码规范 5.Java中的分页、效率考虑。 6.简单介绍您所...
  • (5) 进化需求 客户的需要总是不断(连续)地增长,但是一般的软件开发又总是落后于客户需求的增长,如何管理需求的进化(变化)就成为软件进化的首要问题。对于传统的变化管理过程来说,其基本成分包括软件配置、软件...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    中,如果不关心a[]的哪一个分量会被写入,这段代码就没有问题,i也的确会增加1,对吗? 38  3.11 人们总是说i=i++的行为是未定义的。可我刚刚在一个ANSI编译器上尝试过,其结果正如我所期望的。 38  3.12 我不...
  • 实例111 将个Excel文件输出到同一SQL Server数据库 244 实例112 批量读取Excel文件给指定数据库 4.4 利用Excel进行数据挖掘 248 实例113 利用Excel对数据进行格式转换 实例114 将个Excel文件汇总到一个...

空空如也

空空如也

1 2
收藏数 39
精华内容 15
关键字:

多客户访问同一代码段