zoukankan      html  css  js  c++  java
  • javaweb:推断当前请求是否为移动设备訪问

           这段时间都是在做pc端的业务。结果经理找到我说,可能要做移动端的应用,后台逻辑还是用我写的逻辑。可是须要修改一些,看看怎么处理。

           因为移动端和pc端还是略微有些差别的,我认为最好是在一个地儿统一推断,并且不要修改原先的代码,这样能够从一定程度上降低bug的数量。

    我的想法是首先应该推断当前请求是否为移动端,然后设一个标识到session中,然后就能够随便处理了。无论你是单独处理。还是统一处理,直接读取session就能够做对应的推断了。

           我封装成了一个类,如今分享给大家:

    package com.tgb.util;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * 检測是否为移动端设备訪问
     * 
     * @author  	: Cuichenglong
     * @group   	: tgb8
     * @Version 	: 1.00
     * @Date    	: 2014-7-7 下午01:34:31
     */
    public class CheckMobile {
    	
    	//  是单词边界(连着的两个(字母字符 与 非字母字符) 之间的逻辑上的间隔),  
    	// 字符串在编译时会被转码一次,所以是 "\b"  
    	// B 是单词内部逻辑间隔(连着的两个字母字符之间的逻辑上的间隔)  
    	static String phoneReg = "\b(ip(hone|od)|android|opera m(ob|in)i"  
    	        +"|windows (phone|ce)|blackberry"  
    	        +"|s(ymbian|eries60|amsung)|p(laybook|alm|rofile/midp"  
    	        +"|laystation portable)|nokia|fennec|htc[-_]"  
    	        +"|mobile|up.browser|[1-4][0-9]{2}x[1-4][0-9]{2})\b";  
    	static String tableReg = "\b(ipad|tablet|(Nexus 7)|up.browser"  
    	        +"|[1-4][0-9]{2}x[1-4][0-9]{2})\b";  
    	
    	//移动设备正则匹配:手机端、平板
    	static Pattern phonePat = Pattern.compile(phoneReg, Pattern.CASE_INSENSITIVE);  
    	static Pattern tablePat = Pattern.compile(tableReg, Pattern.CASE_INSENSITIVE);  
    	  
    	/**
    	 * 检測是否是移动设备訪问
    	 * 
    	 * @Title: check
    	 * @Date : 2014-7-7 下午01:29:07
    	 * @param userAgent 浏览器标识
    	 * @return true:移动设备接入,false:pc端接入
    	 */
    	public static boolean check(String userAgent){  
    	    if(null == userAgent){  
    	        userAgent = "";  
    	    }  
    	    // 匹配  
    	    Matcher matcherPhone = phonePat.matcher(userAgent);  
    	    Matcher matcherTable = tablePat.matcher(userAgent);  
    	    if(matcherPhone.find() || matcherTable.find()){  
    	        return true;  
    	    } else {  
    	        return false;  
    	    }  
    	}
    }
    

           使用方式:

    	/**
    	 * 检查訪问方式是否为移动端
    	 * 
    	 * @Title: check
    	 * @Date : 2014-7-7 下午03:55:19
    	 * @param request
    	 * @throws IOException 
    	 */
    	public boolean check(HttpServletRequest request,HttpServletResponse response) throws IOException{
    		boolean isFromMobile=false;
    		
    		HttpSession session= request.getSession();
        //检查是否已经记录訪问方式(移动端或pc端)
    		if(null==session.getAttribute("ua")){
    			try{
    				//获取ua,用来推断是否为移动端訪问
    				String userAgent = request.getHeader( "USER-AGENT" ).toLowerCase();  
    				if(null == userAgent){  
    				    userAgent = "";  
    				}
    				isFromMobile=CheckMobile.check(userAgent);
    				//推断是否为移动端訪问
    				if(isFromMobile){
    					System.out.println("移动端訪问");
    					session.setAttribute("ua","mobile");
    				} else {
    					System.out.println("pc端訪问");
    					session.setAttribute("ua","pc");
    				}
    			}catch(Exception e){}
    		}else{
    			isFromMobile=session.getAttribute("ua").equals("mobile");
    		}
    		
    		return isFromMobile;
    	}
    	

           在登录的时候。或者在action的execute中调用这种方法。不用修改原先的业务逻辑,就可以推断请求的是否为移动端。然后再依据结果去做对应处理,应该就简单多了。

           事实上我在做的过程中,还是遇到了一个比較头疼的问题。经理说移动端的应用要求使用json格式,所以我想统一做一个处理,假设是从移动端訪问。那么就把request和session中设置的Attribute所有读取到map或者list中,然后再转化为json格式输出。

    想法的美好的,结果有点小残酷。就拿登录来说。登录以后要跳转到list.jsp页,结果如今直接输出list中的数据了,可是页面没有跳转。页面跳转和返回json是冲突的。输出json的话。输出流就会关闭,不让再跳转,否则会提示错误。

    不知道大家有没有好的解决方式,假设不行的话,仅仅能每一个请求单独处理了。


  • 相关阅读:
    建立自己的开发知识库?分享制作电子书的经验
    海量Office文档搜索
    为什么要检测数据库连接是否可用
    多年的.NET开发,也只学会了这么几招
    总结一下ERP .NET程序员必须掌握的.NET技术
    菜单设计器(Menu Designer)及其B/S,C/S双重实现(B/S开源)
    软件公司为什么要加密源代码
    .NET开发中经常用到的扩展方法
    在Win8 Mertro 中使用SQLite
    SQLite
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7066269.html
Copyright © 2011-2022 走看看