问题背景:
做电商项目,有些操作需要登录才能进行,一个url被session过滤器拦截后,被链接到登录界面,输入账号、密码等信息后,登录成功,还需回到用户请求的url,并且需要此url携带登录前的参数
1、session过滤器获取参数
//获取用户请求的url
String pathInfo = request.getRequestURI();
//获取URL携带的参数
StringBuffer params=new StringBuffer();
Map<String, String[]> map = request.getParameterMap();
Set<Entry<String, String[]>> set = map.entrySet();
Iterator<Entry<String, String[]>> it = set.iterator();
while (it.hasNext()) {
Entry<String, String[]> entry = it.next();
params.append(entry.getKey());
params.append("=");
for (String i : entry.getValue()) {
params.append(i);
}
params.append("&");
}
request.getSession().setAttribute("redirectUrl", pathInfo.substring(pathInfo.indexOf(request.getContextPath())+request.getContextPath().length()));
request.getSession().setAttribute("params", params.toString());
response.sendRedirect(request.getContextPath()+"/member/login.html")
2、登录成功后,回到url,并携带参数
方法一:用ModelAndView传递参数
@RequestMapping(value={"login"},method={RequestMethod.POST})
public ModelAndView login(HttpServletRequest request){
//登录操作
.....
//用户请求的url
String redirectUrl=(String) session.getAttribute("redirectUrl");
if(StringUtils.isNotEmpty(redirectUrl)){
//获取url携带的参数
String params=(String)
request.getSession().getAttribute("params");
ModelAndView model=new ModelAndView("redirect:"+redirectUrl);
for(String param:params.split("&")){
model.addObject(param.split("=")[0],param.split("=")[1]);
}
return model;
}
方法二:用RedirectAttributes传递参数
@RequestMapping(value={"login"},method={RequestMethod.POST})
public String login(HttpServletRequest request,RedirectAttributes attr){
//登录操作
.....
//用户请求的url
String redirectUrl=(String) session.getAttribute("redirectUrl");
//获取url携带的参数
String params=(String) request.getSession().getAttribute("params");
for(String param:params.split("&")){
attr.addAttribute(param.split("=")[0],param.split("=")[1]);
}
//回到用户请求的url
return "redirect:"+redirectUrl;
}