通用頁面跳轉Controller
阿新 • • 發佈:2019-01-26
在服務端解決jquery下ajax無法跳轉頁面的問題
服務端本來是全Json的,通過Rest分配URL。
原計劃頁面跳轉都在前端完成,結果在jquery的post請求中反覆嘗試也無法完成頁面跳轉,推測是跨域的情況下瀏覽器攔截了。怎麼辦,還沒去到服務端呢。
如果把方案調整成同域,那麼前端就必然和後端耦合在一個工程中了。如果改成用form發HttpRequest請求,為每個跳轉都寫一份請求又實在麻煩。
思考可以用反射來解決大部分的引數問題,那麼可以在form中加入幾個跳轉頁面的url,在服務端統一解析,這樣就可以完成通用的頁面跳轉了。
前面廢話多,能看懂需求就好,不要在意細節改造如下
頁面,裡面的${}是freemarker的標籤,用來寫絕對地址的;{id}是活動地址,服務端會替換掉,當然也可以不用這麼麻煩
<form action="${base}/redirect" method="post"> <input type="hidden" name="cpath" value="${domain}/app/user/login"/> <input type="hidden" name="cbsuccess" value="/{id}/home"/> <input type="hidden" name="cbfail" value="/login.html"/> <div class="form-group input-group"> <span class="input-group-addon" ><i class="fa fa-user" ></i></span> <input type="text" name="email" class="form-control" placeholder="郵箱"> </div> <div class="form-group input-group"> <span class="input-group-addon" ><i class="fa fa-user" ></i></span> <input type="password" name="password" class="form-control" placeholder="密碼"> </div> <div class="form-group input-group pull-right"> <a href="${base}/register.html">註冊</a> <button type="submit" class="button">登入</button> </div> </form>
服務端,CallPath類
服務端 Controller跳轉處理類class CallPath{ private String cpath; private String cbsuccess; private String cbfail; /** * @return cpath */ public String getCpath() { return cpath; } /** * @param cpath 要設定的 cpath */ public void setCpath(String cpath) { this.cpath = cpath; } /** * @return cbsuccess */ public String getCbsuccess() { return cbsuccess; } /** * @param cbsuccess 要設定的 cbsuccess */ public void setCbsuccess(String cbsuccess) { this.cbsuccess = cbsuccess; } /** * @return cbfail */ public String getCbfail() { return cbfail; } /** * @param cbfail 要設定的 cbfail */ public void setCbfail(String cbfail) { this.cbfail = cbfail; } }
@Controller
public class RedirectController {
public static final String CALLBACK_SUCCESS="cbsuccess";
public static final String CALLBACK_FAIL="cbfail";
public static final String CALL_PATH="cpath";
@RequestMapping(value = "/redirect", method = RequestMethod.POST)
public String redirect(CallPath cp, ModelAndView model,HttpServletRequest req){
Map map = reducedLatitude(req.getParameterMap());
String callpath = callpath(cp, map);
return "redirect:"+callpath;
}
private String callpath(CallPath cp,Map map){
String result=null;
try{
HttpRequest request = HttpRequest.post(cp.getCpath());
request.form(map);
request.trustAllCerts();
request.trustAllHosts();
JSONObject json = new JSONObject(request.body());
/*
*這個是我在相關業務返回值中固定宣告的,客官根據自己的情況修改
*/
if("100000".equals(json.getString("status"))){
result=cp.getCbsuccess();
if(result.contains("{id}")){
JSONObject getResult = json.getJSONObject("result");
String id = getResult.getString("_id");
result = result.replace("{id}", id);
System.out.println(result);
}
}else{
result=cp.getCbfail();
}
}catch(Exception ex){
result=cp.getCbfail();
}
if(StringUtils.isEmpty(result)){
result="/";
}
return result;
}
private Map reducedLatitude(Map<String, String[]> map){
Map<String,Object> result = new HashMap<String,Object>();
for(Iterator<String> itor = map.keySet().iterator();itor.hasNext();){
String key = itor.next();
String[] values = map.get(key);
if(values==null){
continue;
}
else if(values.length==1){
result.put(key, values[0]);
}
else{
result.put(key, values);
}
}
return result;
}
}
其中HttpRequest的原始碼在
https://github.com/bperin/HttpRequest/blob/master/com/github/kevinsawicki/http/HttpRequest.java
我就不橫刀奪愛了,去github上面下載吧