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

Filter过滤器实现同一地址手机和电脑页面不同相关推荐

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

    安装sublime server 插件包 1.Ctrl + shift + p  install package sublimeServer 2.git cd to your Sublime pack ...

  2. 百度android模拟器下载地址,百度手机助手电脑版怎么下载 安卓模拟器电脑版下载地址...

    最近在朋友圈非常流行的手游百度手机助手已经开放下载了,不过不少玩家都觉得手机上玩百度手机助手手机屏幕太小,操作不方便,画面不够清晰炫酷.那么如何在电脑上运行百度手机助手这款手游呢?小编现在就推荐一款百 ...

  3. 获取 连接本地手机热点 的 的具体IP和MAC地址(其他手机或电脑)

       当在设备终端(手机,电脑等)上使用Wifi热点的时候,需要获知Wifi热点的运行状态,热点是否打开,连接到该WIFI热点的设备数量,以及连接设备的具体IP和MAC地址. 使用re文件管理器去&q ...

  4. 最新织梦DEDECMS全站目录化伪静态设置(网址和生成静态地址一样、电脑和手机访问地址也一样)

    最新织梦DEDECMS全站目录化伪静态设置,伪静态设置成功后,网址和生成静态地址一样.电脑和手机访问地址也一样. 如果你电脑端是生成静态而手机端是动态的话,请查看织梦手机端伪静态设置http://ww ...

  5. 手机访问电脑同一局域网下的地址

    手机想访问电脑同一局域网下的地址 首先,手机和电脑连接相同wifi 1.在手机的wifi上先配置端口 选择连接的wifi,点进去,代理-手动 端口:XXXX 2.电脑端配置端口如下: 即配置电脑防火墙 ...

  6. javascript判断浏览器和终端类型,js如何区分手机、电脑终端和浏览器

    判断浏览器类型 复制代码代码如下: if ( window.sidebar && "object" == typeof( window.sidebar ) & ...

  7. Filter过滤器和动态代理处理机制和案例(Filter过滤器和动态代理结合)

    关注公众号:"奇叔码技术" 回复:"java面试题大全"或者"java面试题" 即可免费领取资料 Filter过滤器和动态代理处理机制和案例 ...

  8. [JAVA EE] Filter过滤器

    Filter过滤器 ◼ 过滤器(Filter)可以动态地拦截请求和响应. ◼ 应用场景:过滤敏感词汇.防止SQL注入.设置字符编码.进行URL级 别的权限访问控制.压缩响应信息等. 启动文件DemoA ...

  9. linux 设置代理_用Android手机做电脑的HTTP代理服务器

    在手机端创建一个 HTTP 代理可以让电脑共享手机网络. 手机端 在 Play Store 里选择 Termux 安装. 其它备选 app : GNURoot Debian 等. 打开 Termux ...

最新文章

  1. 数据库收缩:NOTRUNCATE与TRUNCATEONLY
  2. 【 MATLAB 】模拟信号采样及离散时间傅里叶变换(DTFT)案例分析
  3. 优秀中层必备的十大能力
  4. BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)
  5. 72万奖金!DCIC 2021数据竞赛正式报名了!
  6. Navicat导入TXT到数据库
  7. 大龄技术人的出路在哪里?6月20日长沙-中国技术开放日邀请你一起探讨
  8. 华为云企业级Redis:助力VMALL打造先进特征平台
  9. 虚拟机开启mysql服务_远程操作虚拟机中的mysql服务器
  10. 《阿甘正传》,看了很多遍,是否留意到这个镜头???
  11. informix 访问mysql_Informix 11.7 使用非系统用户访问数据库
  12. android小米手机变慢,小米手机出现变慢卡顿现象怎么办 教你如何让小米手机跑的更快的方法...
  13. Android手机RTMP播放工具(APK,支持秒开)
  14. .Net平台下安装DotNetBar
  15. 安卓基于图像识别和CNN做出一个通用的斗地主记牌器(一)
  16. OpenGL 视椎体剔除算法
  17. python flask web_Python Web开发之Flask
  18. burpSuit抓取app的数据包
  19. PHP 测试页index.php phpinfo 空白问题
  20. Jmeter学习-BeanShell 内置变量vars、props、prev

热门文章

  1. HDSF主要节点解说(二)工作原理
  2. eclipse 最全快捷键 分享快乐与便捷
  3. Visio 与 Access 2007 的集成应用
  4. EPCS 无法配置FPGA的解决方法以及JTAG、AS调试总结
  5. linux xorg 文件 位置,Linux系统中xorg.conf文件详细介绍
  6. RocketMQ(七)——消息的消费
  7. edge新版 能够正则式_在最近的一项HTML5测试中,新版Edge浏览器表现满分
  8. 卡尔曼滤波(kalman filter)
  9. 国外稳定免费php,国外免费php空间 稳定
  10. c++排序函数_Excel2010 技巧六 (排名函数)