http://peacherdiy.iteye.com/blog/430057
近来做项目需要在服务器端根据请求来判断是PC或手机,也就是该项目需要同时支持手机和PC,根绝上两个网站的参考,可以通过 请求中的 User_Agent来进行判断。
1. Before we move on to discuss how to detect user agents, let’s first have a look at the steps involved in a typical request-response cycle between a server and a client browser:
The WAP browser requests an XHTML MP page from the server.
The server receives the request and delivers the XHTML MP document to the WAP browser.
The WAP browser receives the XHTML MP document and finds that it contains a <link> tag that references to an external cascading style sheet.
The WAP browser sends another request to the server in order to obtain the WAP CSS cascading style sheet.
The server receives the request and delivers the WAP CSS cascading style sheet to the WAP browser.
The WAP browser receives the WAP CSS file and displays the XHTML MP page according to the style information contained in the WAP CSS file.
The steps repeat when the user selects an anchor link or types a new URL in the WAP browser.
As you can see from above, the only thing that the server receives from the client is the HTTP request. So, to determine the client’s user agent, the server needs to rely on the information included in the HTTP request. Below shows a HTTP request example. It is a HTTP request generated by the Nokia 6230 emulator (some headers that are irrelevant to user agent detection are omitted).
GET /example.xhtml HTTP/1.1
…
x-wap-profile: “http://nds1.nds.nokia.com/uaprof/N6230r200.xml”
User-Agent: Nokia6230/2.0 (03.14) Profile/MIDP-2.0 Configuration/CLDC-1.1
…
Both the profile header and the user-agent header can be used for user agent detection.
The profile header holds the URL to the UAProf (User Agent Profile) document of the wireless device. The UAProf document contains information about the wireless device’s characteristics and capabilities such as screen size, character sets supported, number of softkeys supported, etc. The details of the profile header and the UAProf document is out of the scope of this section and it will be covered in a future article.
The user-agent header includes information like the wireless device’s name, platform, Java capabilities, etc. The format of the user-agent header value is different for different brands of browsers. For example, the user-agent header format generated by Nokia mobile phone browsers are different from that generated by Sony Ericsson mobile phone browsers. Here is a user-agent header generated by Sony Ericsson Z1010:
User-Agent: SonyEricssonZ1010/R1A SEMC-Browser/4.0
Note that the user-agent header format may also vary among browsers of the same brand, although the variations are usually small.
Below is the user-agent header found in a HTTP request generated by Microsoft Internet Explorer 6 on Windows 2000:
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
As a general rule, you should find the brand name of a mobile phone in its user-agent header value. For example, you should find the brand name “Nokia” in the user-agent header generated by a Nokia mobile phone, and you should find the brand name “SonyEricsson” in the user-agent header generated by a Sony Ericsson mobile phone.
If you find the word “Mozilla” in the user-agent header value, then the client browser should be a desktop web browser like Mozilla and Microsoft Internet Explorer. (Note that we have simplified things a bit here. Actually, the existence of the word “Mozilla” in the user-agent header value only indicates that it is very likely that the user agent is a desktop web browser, but does not mean it must be a desktop web browser. For example, some Nokia Series 60 mobile phones include the word “Mozilla” in their user-agent header to indicate that they are web-capable. However, note that the brand name “Nokia” is still present in their user-agent header value.)
To read the value of a HTTP header, you need to use a server-side technology like ASP, Java Servlet, JSP, Perl, PHP, etc.
For example, to read the user-agent header value and store it into a variable uaheader with JSP, use the following code:
String uaheader = request.getHeader(“user-agent”);
For ASP (VBScript), use the following code to read the user-agent header value:
dim uaheader
uaheader = Request.ServerVariables(“http_user_agent”)
For ASP (JScript), use the following code to read the user-agent header value:
var uaheader = Request.ServerVariables(“http_user_agent”);
For PHP, use the following code to read the user-agent header value:
$uaheader = $_SERVER[“HTTP_USER_AGENT”];
2.Java代码
/**
* 传入http请求的UserAgent
* 根据它判断是手机还是电脑发送过来的请求
* @param userAgent
* @return
*/
public static boolean choose(String userAgent) {
if (userAgent.indexOf(“Noki”) > -1 || // Nokia phones and emulators
userAgent.indexOf(“Eric”) > -1 || // Ericsson WAP phones and emulators
userAgent.indexOf(“WapI”) > -1 || // Ericsson WapIDE 2.0
userAgent.indexOf(“MC21”) > -1 || // Ericsson MC218
userAgent.indexOf(“AUR”) > -1 || // Ericsson R320
userAgent.indexOf(“R380”) > -1 || // Ericsson R380
userAgent.indexOf(“UP.B”) > -1 || // UP.Browser
userAgent.indexOf(“WinW”) > -1 || // WinWAP browser
userAgent.indexOf(“UPG1”) > -1 || // UP.SDK 4.0
userAgent.indexOf(“upsi”) > -1 || //another kind of UP.Browser
userAgent.indexOf(“QWAP”) > -1 || // unknown QWAPPER browser
userAgent.indexOf(“Jigs”) > -1 || // unknown JigSaw browser
userAgent.indexOf(“Java”) > -1 || // unknown Java based browser
userAgent.indexOf(“Alca”) > -1 || // unknown Alcatel-BE3 browser (UP based)
userAgent.indexOf(“MITS”) > -1 || // unknown Mitsubishi browser
userAgent.indexOf(“MOT-“) > -1 || // unknown browser (UP based)
userAgent.indexOf(“My S”) > -1 ||// unknown Ericsson devkit browser
userAgent.indexOf(“WAPJ”) > -1 ||//Virtual WAPJAG www.wapjag.de
userAgent.indexOf(“fetc”) > -1 ||//fetchpage.cgi Perl script from www.wapcab.de
userAgent.indexOf(“ALAV”) > -1 || //yet another unknown UP based browser
userAgent.indexOf(“Wapa”) > -1 || //another unknown browser (Web based “Wapalyzer”)
userAgent.indexOf(“Oper”) > -1) {
return true;
} else {
return false;
}
}
/**
* 传入http请求的UserAgent
* 根据它判断是手机还是电脑发送过来的请求
* @param userAgent
* @return
*/
public static boolean choose(String userAgent) {
if (userAgent.indexOf(“Noki”) > -1 || // Nokia phones and emulators
userAgent.indexOf(“Eric”) > -1 || // Ericsson WAP phones and emulators
userAgent.indexOf(“WapI”) > -1 || // Ericsson WapIDE 2.0
userAgent.indexOf(“MC21”) > -1 || // Ericsson MC218
userAgent.indexOf(“AUR”) > -1 || // Ericsson R320
userAgent.indexOf(“R380”) > -1 || // Ericsson R380
userAgent.indexOf(“UP.B”) > -1 || // UP.Browser
userAgent.indexOf(“WinW”) > -1 || // WinWAP browser
userAgent.indexOf(“UPG1”) > -1 || // UP.SDK 4.0
userAgent.indexOf(“upsi”) > -1 || //another kind of UP.Browser
userAgent.indexOf(“QWAP”) > -1 || // unknown QWAPPER browser
userAgent.indexOf(“Jigs”) > -1 || // unknown JigSaw browser
userAgent.indexOf(“Java”) > -1 || // unknown Java based browser
userAgent.indexOf(“Alca”) > -1 || // unknown Alcatel-BE3 browser (UP based)
userAgent.indexOf(“MITS”) > -1 || // unknown Mitsubishi browser
userAgent.indexOf(“MOT-“) > -1 || // unknown browser (UP based)
userAgent.indexOf(“My S”) > -1 ||// unknown Ericsson devkit browser
userAgent.indexOf(“WAPJ”) > -1 ||//Virtual WAPJAG www.wapjag.de
userAgent.indexOf(“fetc”) > -1 ||//fetchpage.cgi Perl script from www.wapcab.de
userAgent.indexOf(“ALAV”) > -1 || //yet another unknown UP based browser
userAgent.indexOf(“Wapa”) > -1 || //another unknown browser (Web based “Wapalyzer”)
userAgent.indexOf(“Oper”) > -1) {
return true;
} else {
return false;
}
}
参数userAgent:
Java代码
String userAgent = request.getHeader(“User-Agent”);