1.拦截器
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
String url = request.getRequestURL().toString();
if(url.endsWith("/")){
return true;
}
User user =(User) request.getSession().getAttribute(Constants.SESSION_USER_KEY);
if(user!=null){
return true;
}else{
// String path = request.getContextPath();
// String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
response.sendRedirect(getBasePath(request)+"/web/login?from="+this.getRedirectUrl(request));
return false;
}
}
private String getRedirectUrl(HttpServletRequest request) {
StringBuilder url = new StringBuilder(request.getRequestURL().toString());
Map<String, String[]> paraMap = request.getParameterMap();
int i=0;
for(Map.Entry<String, String[]> kv : paraMap.entrySet()){
for(String val : kv.getValue()){
if((i++)==0){
url.append("?");
}else {
url.append("&");
}
url.append(kv.getKey());
url.append("=");
if(val==null || val.matches(ALPHANUM_REGEX)) {
url.append(val);
}else {
url.append(CharCode.toUTF8(val));
}
}
}
return CharCode.encodeTwice(url.toString());
}
/**
* encode twice
* @param value
* @author kq
* @return
*/
public static String encodeTwice(String value) {
if(StringUtils.isNotBlank(value)) {
try {
return URLEncoder.encode(URLEncoder.encode(value.toString(), CharCode.UTF8),CharCode.UTF8);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return value.toString();
}
}
return value;
}
/**
* decode
* @param param
* @return
*/
public static String decodeOne(String param) {
if(StringUtils.isNotBlank(param)) {
try {
param = URLDecoder.decode(param, CharCode.UTF8);
} catch (UnsupportedEncodingException e) {
}
}
return param;
}
2. client
function login(){
//alert(window.location.href);
var from = window.location.href;
window.location.href = "../web/login?from="+encodeURIComponent(encodeURIComponent(from));
}
function logout(){
var from = window.location.href;
window.location.href = "../member/loginOut?from="+encodeURIComponent(encodeURIComponent(from));
}
3.login
@RequestMapping("/web/login")
public ModelAndView showLogin(String from) {
ModelAndView mv = new ModelAndView("/web/login");
mv.addObject("from", CharCode.decodeOne(from));
return mv;
}
4. logout
@RequestMapping("/member/loginOut")
public String loginOut(String from,HttpSession session){
session.invalidate();
from = CharCode.decodeOne(from);
from = CharCode.encodeTwice(from);
String redirectUrl = "redirect:/web/login?from="+from;
return redirectUrl;
}