登陆成功后返回前一个页面
来源:互联网 发布:marva collins 知乎 编辑:程序博客网 时间:2024/05/21 10:07
原文地址:http://blog.csdn.net/alanzyy/article/details/50562362
之前自己写了一个Web日志工具,使用Spring MVC+mybatis进行实现。由于我自己一天到晚都要使用,而有时页面会放在那里一段时间,就常会遇到session过期后跳转到登陆界面进行登陆。但是登陆后是转向了一个默认界面,这样我每次都还在多一次点击才能来到目标页面。于是,我必须要解决登陆之后跳转到前一个页面的问题以提高效率。
首先,我使用了SessionFilter对Session进行过滤,在Session过期时就会在这个方法中转向到login界面。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpSession session = ((HttpServletRequest) request).getSession(); HttpServletResponse rep = (HttpServletResponse) response; HttpServletRequest req = (HttpServletRequest) request; String url = req.getRequestURI(); if (url.contains("user/login") || url.endsWith(".css") || url.endsWith(".js") || url.endsWith(".png") || url.endsWith(".jpg")) { chain.doFilter(request, response); } else if ((session == null || session.getAttribute("user") == null)) { rep.sendRedirect(req.getContextPath() + "/user/login); } else { chain.doFilter(request, response); }}
然后,在LoginController中分GET和POST对用户登陆进行处理。
@RequestMapping(value = "/login", method = RequestMethod.GET)public ModelAndView login() { final ModelAndView m = new ModelAndView("login"); return m;}@RequestMapping(value = "/login", method = RequestMethod.POST)public ModelAndView login(HttpSession session, String userName, String password) { ReturnStatus rs = service.login(userName, MD5Tool.getMD5(password.getBytes())); if (rs.getCode() == 1) { session.setAttribute("user", service.get(userName)); return new ModelAndView("redirect:/task/week"); } else { final ModelAndView m = new ModelAndView("login"); m.addObject("message", "用户名或者密码不正确,请重新输入"); return m; }}
解决方案
我首先想到的就是在filter中转向到login页面时,将登陆成功后要转向的页面fromUrl传过去。假设原始链接是:http://localhost:8084/personal/task/update?id=DTASK1167778733413045&mode=week。
req.getRequestURI()
,获取到的是/personal/task/update,不带query string,不符合req.getRequestURL()
,获取到的是http://localhost:8084/personal/task/update,也不带query string,不符合- 于是我百度了一下,找到一下方法可以获得完整的请求url(http://localhost:8084/personal/task/update?id=DTASK1167778733413045&mode=week),但是遗憾的是POST过来的数据还是无法
public static String getUrl(HttpServletRequest req) { String reqUrl = req.getRequestURL().toString(); String queryString = req.getQueryString(); if (queryString != null) { reqUrl += "?" + queryString; } return reqUrl;}
- 我试图从request中把POST过来的数据设置到response的Header中,但是在login页面经过SpringMVC后再次分发我又不会(感觉会很麻烦)
private void setHeader(HttpServletRequest req, HttpServletResponse rep) { for (Map.Entry<String, String[]> entry : req.getParameterMap().entrySet()) { try { String name = entry.getKey(); String value = new String(req.getParameter(name).getBytes("ISO8859-1"), "UTF8"); rep.setHeader(name, value); } catch (UnsupportedEncodingException ex) { Logger.getLogger(SessionFilter.class.getName()).log(Level.SEVERE, null, ex); } }}
- 于是决定,在POST的情况下就不再做POST操作,而是转向到POST之前的界面(这样有丢失数据的危险,暂时先这样吧)
from Url = req.getHeader("Referer")
最终,思路确定如下:Session过滤时,如果是POST过来的,就取前一个页面的url(第5点中的方法),如果是其他请求方式过来的(主要是GET),就使用当前要转向的url(第3点中的方法)。将url通过GET方式传入到login页面后,POST login时也带到后台,待确认登陆成功后转向到该url。
最终代码
SessionFilter
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpSession session = ((HttpServletRequest) request).getSession(); HttpServletResponse rep = (HttpServletResponse) response; HttpServletRequest req = (HttpServletRequest) request; String url = req.getRequestURI(); if (url.contains("user/login") || url.endsWith(".css") || url.endsWith(".js") || url.endsWith(".png") || url.endsWith(".jpg")) { chain.doFilter(request, response); } else if ((session == null || session.getAttribute("user") == null)) { String fromUrl; if ("POST".equalsIgnoreCase(req.getMethod())) { fromUrl = req.getHeader("Referer"); } else { fromUrl = getUrl(req); } rep.sendRedirect(req.getContextPath() + "/user/login?fromUrl=" + URLEncoder.encode(fromUrl, "UTF8")); } else { chain.doFilter(request, response); }}public static String getUrl(HttpServletRequest req) { String reqUrl = req.getRequestURL().toString(); String queryString = req.getQueryString(); if (queryString != null) { reqUrl += "?" + queryString; } return reqUrl;}
LoginController
@RequestMapping(value = "/login", method = RequestMethod.GET)public ModelAndView login(HttpServletRequest request, @RequestParam(defaultValue = "") String fromUrl) { final ModelAndView m = new ModelAndView("login"); m.addObject("fromUrl", fromUrl); return m;}@RequestMapping(value = "/login", method = RequestMethod.POST)public ModelAndView login(HttpSession session, String userName, String password, @RequestParam(defaultValue = "") String fromUrl) { ReturnStatus rs = service.login(userName, MD5Tool.getMD5(password.getBytes())); if (rs.getCode() == 1) { session.setAttribute("user", service.get(userName)); if (fromUrl.equals("")) { return new ModelAndView("redirect:/task/week"); } else { return new ModelAndView("redirect:" + fromUrl); } } else { final ModelAndView m = new ModelAndView("login"); m.addObject("message", "用户名或者密码不正确,请重新输入"); m.addObject("fromUrl", fromUrl); return m; }}
阅读全文
0 0
- 登陆成功后返回前一个页面
- 登陆成功后返回前一个页面
- 登陆成功后自动跳转到登录页面的前一个页面
- php执行成功后返回前一页并刷新页面
- 当客户访问一个需登陆的页面时会转到登陆页面,当客户登陆成功后会自动跳转到客户登陆前的那个页面,请问该如何实现?
- 登陆后返回原页面
- WordPress登陆之后返回登陆前的页面
- 登陆后返回正在游览页面
- android 页面返回刷新前一个页面
- 跳到登陆页面,要求登陆成功后跳回来
- PHP登陆后跳转到登陆前页面
- 登录后返回登录前的页面
- php返回前一个页面的代码
- 用javascript返回前一个页面
- 页面登录成功后返回原始页面的实现
- 页面登录成功后返回原始页面的实现
- login控件的登陆成功后跳转到哪个页面
- discuz 注册和登陆成功后跳转页面修改
- 一句话详细题解+优质题目及其博客(清真代码)链接 (持续更新)+知识点讲解汇总
- LDAP学习笔记(二)LDAP安装配置
- WCF分布操作-如何判断通道关闭并再次创建通道
- Linux操作快捷键整理
- maven : Failed to load class "org.slf4j.impl.StaticLoggerBinder"
- 登陆成功后返回前一个页面
- Java 基础之 DecimalFormat 用法
- 我遗憾的事情
- springMVC:HandlerInterceptor拦截器的使用
- 自带cookie的httpClient请求
- CodeForces 279A Point on Spiral
- JSON传数组给前端遇到的问题
- Oracle数据库常用命令(草稿)
- 框架整合之--------spring2.5+struts2.1+hibernate3.6