jfinal中用拦截器进行pc端和m端页面的跳转

请问一下各位   现在已经识别了是否为手机端和pc端  pc端页面为localhost/  m端页面为localhost/mobile/   如何拦截器中在判定是手机端后再url上添加mobile/让其跳转到手机端的页面呢?

评论区

lyh061619

2018-05-22 15:18

一个简单的做法,
1、前提是你去搜集这个User-Agent,形成一个数组待用。
2、创建一个拦截器,获取客户端代理,如:HttpServletRequest 的.getHeader("User-Agent"),拿到客户端代理name值 ,使用财1、步说的,做下判断,如果存在则跳转/mobile否则pc端面。

下面给个通用“User_agnet”:
String[] mobileAgents = { "iphone", "android", "phone", "mobile", "wap", "netfront", "java", "opera mobi",
"opera mini", "ucweb", "windows ce", "symbian", "series", "webos", "sony", "blackberry", "dopod",
"nokia", "samsung", "palmsource", "xda", "pieplus", "meizu", "midp", "cldc", "motorola", "foma",
"docomo", "up.browser", "up.link", "blazer", "helio", "hosin", "huawei", "novarra", "coolpad", "webos",
"techfaith", "palmsource", "alcatel", "amoi", "ktouch", "nexian", "ericsson", "philips", "sagem",
"wellcom", "bunjalloo", "maui", "smartphone", "iemobile", "spice", "bird", "zte-", "longcos",
"pantech", "gionee", "portalmmm", "jig browser", "hiptop", "benq", "haier", "^lct", "320x320",
"240x320", "176x220", "w3c ", "acs-", "alav", "alca", "amoi", "audi", "avan", "benq", "bird", "blac",
"blaz", "brew", "cell", "cldc", "cmd-", "dang", "doco", "eric", "hipt", "inno", "ipaq", "java", "jigs",
"kddi", "keji", "leno", "lg-c", "lg-d", "lg-g", "lge-", "maui", "maxo", "midp", "mits", "mmef", "mobi",
"mot-", "moto", "mwbp", "nec-", "newt", "noki", "oper", "palm", "pana", "pant", "phil", "play", "port",
"prox", "qwap", "sage", "sams", "sany", "sch-", "sec-", "send", "seri", "sgh-", "shar", "sie-", "siem",
"smal", "smar", "sony", "sph-", "symb", "t-mo", "teli", "tim-", "tosh", "tsm-", "upg1", "upsi", "vk-v",
"voda", "wap-", "wapa", "wapi", "wapp", "wapr", "webc", "winw", "winw", "xda", "xda-",
"Googlebot-Mobile", "MicroMessenger"};

暖色demon

2018-05-22 16:21

@lyh061619 您这个User-Agent我已经形成了一个数组,现在我是判断后添加的URL无法用重定向跳转过去会显示重定向过多,请问您一下,该如何跳转呢

或是的话

2018-05-22 17:39

@暖色demon handle 了解一下

JFinal

2018-05-22 21:57

@暖色demon 如果 pc 与移动端相同业务都跳到同一个 action ,那么你得使用 Handler 来改变一下 String target 值去跳过去

至于跳到不同的页面,使用拦截器就可以了,假定你的 action 中的 render 方法默认是针对 pc 端的大致代码如下:
inv.invoke();

if (isMobileRequest(inv.getController().getRequest()) {
Render render = inv.getController().getRender();
render.setView("/mobile/" + render.getView());
}

if 里头对于 setView 参数的细节你自己要调整一下,上面仅为演示如何调整 view 值

当然,还有一个更简单的办法是添加一个 public class BaseController extends Controller,在这个 BaseController 中覆盖掉父类中的 render 方法,大至如下:

public void render(String view) {
if (isPcRquest()) {
render("/pc/" + view);
} else {
render("/mobile/" + view);
}
}

然后让你的所有 controller 继承这个 BaseController 即可,在实际开发中引入 BaseController 极其有用

暖色demon

2018-05-24 09:20

谢谢各位的帮助 这个问题已经解决 再次感谢各位大大

热门反馈

扫码入社