最近做一个网站,客户要求在访问主域名的时候实现电脑访问时展示电脑页面,手机访问时展示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 转载请注明出处!

Filter过滤器实现同一地址手机和电脑页面不同的更多相关文章

  1. 用sublime server 启动本地服务器(手机访问电脑页面)

    安装sublime server 插件包           1.Ctrl + shift + p                      install package               ...

  2. SpringBoot+Shiro学习(七):Filter过滤器管理

    SpringBoot+Shiro学习(七):Filter过滤器管理 Hiwayz 关注  0.5 2018.09.06 19:09* 字数 1070 阅读 5922评论 1喜欢 20 先从我们写的一个 ...

  3. Filter(过滤器)学习

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  4. 安卓手机与电脑无线传输文件(利用ftp服务)

    安卓手机与电脑无线传输文件(利用ftp服务) 手机与电脑无线传输文件,手机开启ftp服务,电脑能够对手机内全部文件进行全方位管理,包括上传.下载.新建.删除等,而且手机和电脑能够双向传输,很方便.手机 ...

  5. WIFI环境下Android手机和电脑通信

    前面已经写过一篇java实现最基础的socket网络通信,这篇和之前那篇大同小异,只是将客户端代码移植到手机中,然后获取本机IP的方法略有不同. 先讲一下本篇中用到Android studio的使用吧 ...

  6. 手机访问电脑wampServer本地环境页面

    1.  电脑需要安装好wamp,我这里用的2.0版本,下载地址   http://pan.baidu.com/s/1jG31hbS   2. 电脑需要有个wifi,我用的360wifi   3. 启动 ...

  7. JavaWeb(五)Filter过滤器

    Filter过滤器 Fileter介绍 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Serv ...

  8. SpringBoot使用Filter过滤器处理是否登录的过滤时,用response.sendRedirect()转发报错

    1.使用response.sendRedirect("/login")时报错,控制台报错如下: Cannot call sendError() after the response ...

  9. java使用Filter过滤器对Response返回值进行修改

    转:java使用Filter过滤器对Response返回值进行修改 练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过 ...

随机推荐

  1. Day12(补充) Python操作MySQL

    本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...

  2. EJB

    Enterprise JavaBean,企业级javabean,是J2EE的一部分,定义了一个用于   开发基于组件的企业多重应用程序的标准.其特点包括网络服务支持和核心开发工具(SDK). 是Jav ...

  3. 关于org.openqa.selenium.ElementNotVisibleException

    最近在使用Selenium,编写最简单的百度search脚本,结果使用name来定位元素抛出了如下exception: 在定位百度的输入框,使用By.name()定位失败,但是使用By.id()和By ...

  4. map和lambda

    同事问我python里,比如一个列表: a = ['1', '2', '3'] 如何变成: b = ['1x', '2x', '3x'] 好吧,果断不知道-原来pthon中有map函数,查看帮助文档: ...

  5. 关于MYSQL优化(持续更新)

    *利用MYSQL数据缓存提高效率,注意事项: 1.应用环境:不经常改变的表及对此表相同的查询 2.不适用于服务器端编写的语句 3.根据数据使用频率,合理分解表 4.合理使用默认条件,提高命中率 5.统 ...

  6. linux中bin和xbin下可执行程序的区别

    /bin下的都是Linux最基础的,所有用户都可以使用的外部命令 /sbin下的都是只有超级用户root才能使用的.管理Linux系统的外部命令 /usr/bin以及/usr/local/bin下的都 ...

  7. [转]加盐hash保存密码的正确方式

    0x00 背景 大多数的web开发者都会遇到设计用户账号系统的需求.账号系统最重要的一个方面就是如何保护用户的密码.一些大公司的用户数据库泄露事件也时有发生,所以我们必须采取一些措施来保护用户的密码, ...

  8. Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条

    Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条 异步任务相信大家应该不会陌生,那么本章内容MOMO将带领大家学习Unity中的一些异步任务.在同步加载游戏场景的时候通常会使用方法 Ap ...

  9. Transformation

    hdu4578:http://acm.hdu.edu.cn/showproblem.php?pid=4578 题意:给一个序列 {an},有 4 种操作.1.将一段区间的数全部加 c.2.将一段区间的 ...

  10. codeforces C. Prime Swaps

    题意:给你n个数,然后在交换次数小于等于5×n的情况下使得这个序列变成升序,输出次数; 思路:哥德巴赫猜想:任何一个大于5的数都可以写成三个质数之和.尽可能的找大的素数,从1的位置向右逐步的调整,每一 ...