登录后如何返回登录前浏览的页面

本贴最后更新于 3377 天前,其中的信息可能已经时移俗易
配置过滤器,拦截用户请求,如果用户没有登录,就转到登录页面,登录成功后再返回到之前的页面
 
1 在web.xml中加入过滤器的配置
[html] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="GBK"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xmlns="http://java.sun.com/xml/ns/javaee"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
  5.     metadata-complete="true" version="3.0">  
  6.     <display-name>魔兽世界</display-name>  
  7.     <welcome-file-list>  
  8.         <welcome-file>index.html</welcome-file>  
  9.     </welcome-file-list>  
  10.     <servlet>  
  11.         <servlet-name>login</servlet-name>  
  12.         <servlet-class>servlet.LoginServlet</servlet-class>  
  13.     </servlet>  
  14.     <servlet-mapping>  
  15.         <servlet-name>login</servlet-name>  
  16.         <url-pattern>/login</url-pattern>  
  17.     </servlet-mapping>  
  18.     <!-- 定义Filter -->  
  19.     <filter>  
  20.         <filter-name>authority</filter-name>  
  21.         <filter-class>filter.AuthorityFilter</filter-class>  
  22.         <init-param>  
  23.             <param-name>encoding</param-name>  
  24.             <param-value>GBK</param-value>  
  25.         </init-param>  
  26.         <init-param>  
  27.             <param-name>loginPage</param-name>  
  28.             <param-value>/login</param-value>  
  29.         </init-param>  
  30.         <init-param>  
  31.             <param-name>ignoreTypes</param-name>  
  32.             <param-value>css</param-value>  
  33.         </init-param>  
  34.         <init-param>  
  35.             <param-name>proLogin</param-name>  
  36.             <param-value>/proLogin</param-value>  
  37.         </init-param>  
  38.     </filter>  
  39.     <filter-mapping>  
  40.         <filter-name>authority</filter-name>  
  41.         <url-pattern>/*</url-pattern>  
  42.     </filter-mapping>  
  43. </web-app>  
 
2 写过滤器AuthorityFilter.java

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. package filter;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.URLEncoder;  
  5.   
  6. import javax.servlet.Filter;  
  7. import javax.servlet.FilterChain;  
  8. import javax.servlet.FilterConfig;  
  9. import javax.servlet.ServletContext;  
  10. import javax.servlet.ServletException;  
  11. import javax.servlet.ServletRequest;  
  12. import javax.servlet.ServletResponse;  
  13. import javax.servlet.annotation.WebFilter;  
  14. import javax.servlet.http.HttpServletRequest;  
  15. import javax.servlet.http.HttpServletResponse;  
  16. import javax.servlet.http.HttpSession;  
  17.   
  18. /** 
  19.  * Servlet Filter implementation class AuthorityFilter 
  20.  */  
  21. @WebFilter("/AuthorityFilter")  
  22. public class AuthorityFilter implements Filter  
  23. {  
  24.   
  25.     private FilterConfig config;  
  26.     private String encoding;  
  27.     private String loginPage;  
  28.     private String ignoreType;  
  29.   
  30.     /** 
  31.      * Default constructor. 
  32.      */  
  33.     public AuthorityFilter()  
  34.     {  
  35.         // TODO Auto-generated constructor stub  
  36.     }  
  37.   
  38.     /** 
  39.      * @see Filter#destroy() 
  40.      */  
  41.     public void destroy()  
  42.     {  
  43.         config = null;  
  44.     }  
  45.   
  46.     /** 
  47.      * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) 
  48.      */  
  49.     public void doFilter(ServletRequest request, ServletResponse response,  
  50.             FilterChain chain) throws IOException, ServletException  
  51.     {  
  52.         long before = System.currentTimeMillis();  
  53.         System.out.println("/*******************/\nAuthorityFilter开始过滤...");  
  54.         HttpServletRequest hrequest = (HttpServletRequest) request;  
  55.         String requestPath = hrequest.getServletPath(); // 这里是不包含?以及?后面的字符串的  
  56.         System.out.println("AuthorityFilter截获到用户请求的地址:"  
  57.                 + hrequest.getServletPath());  
  58.           
  59.         // 设定编码  
  60.         request.setCharacterEncoding(encoding);  
  61.   
  62.         // 是否是要忽略的类型  
  63.         if (requestPath.endsWith(ignoreType))  
  64.         {  
  65.             chain.doFilter(request, response);  
  66.         } else  
  67.         {  
  68.             HttpSession session = hrequest.getSession();  
  69.             if (session.getAttribute("user") == null  
  70.                     && !requestPath.endsWith(loginPage))  
  71.             {  
  72.                 HttpServletResponse res = (HttpServletResponse) response;  
  73.                 String ReturnUrl = URLEncoder.encode(config.getServletContext().getContextPath() + requestPath,"GBK");   
  74.                 res.sendRedirect(config.getServletContext().getContextPath()  
  75.                         + loginPage + "?ReturnUrl=" + ReturnUrl);  
  76.                 //res.sendRedirect("http://www.baidu.com");  
  77.                 System.out.println("AuthorityFilter已经把页面重定向到登录页面");  
  78.             } else  
  79.             {  
  80.                 chain.doFilter(request, response);  
  81.                 System.out.println("AuthorityFilter过滤结束");  
  82.                 System.out.println("请求被AuthorityFilter定位到"  
  83.                         + hrequest.getRequestURI());  
  84.             }  
  85.         }  
  86.         long after = System.currentTimeMillis();  
  87.         System.out.println("AuthorityFilter所花时间为:" + (after - before)  
  88.                 + "\n/*******************/");  
  89.     }  
  90.   
  91.     /** 
  92.      * @see Filter#init(FilterConfig) 
  93.      */  
  94.     public void init(FilterConfig fConfig) throws ServletException  
  95.     {  
  96.         this.config = fConfig;  
  97.         encoding = config.getInitParameter("encoding");  
  98.         loginPage = config.getInitParameter("loginPage");  
  99.         ignoreType = config.getInitParameter("ignoreTypes");  
  100.     }  
  101.   
  102. }  

3 修改LoginServlet.java
[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. package servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.URLDecoder;  
  5. import java.sql.ResultSet;  
  6.   
  7. import javax.servlet.RequestDispatcher;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.annotation.WebServlet;  
  10. import javax.servlet.http.HttpServlet;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13. import javax.servlet.http.HttpSession;  
  14.   
  15. import dao.DbDao;  
  16.   
  17. /** 
  18.  * Servlet implementation class LoginServlet 
  19.  */  
  20. @WebServlet(description = "登录控制器", urlPatterns = { "/login" })  
  21. // 如果在web.xml中配置了,在Annotation中的配置就不会有效果  
  22. public class LoginServlet extends HttpServlet  
  23. {  
  24.     private static final long serialVersionUID = 1L;  
  25.   
  26.     /** 
  27.      * @see HttpServlet#HttpServlet() 
  28.      */  
  29.     public LoginServlet()  
  30.     {  
  31.         super();  
  32.         // TODO Auto-generated constructor stub  
  33.     }  
  34.   
  35.     /** 
  36.      * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse 
  37.      *      response) 
  38.      */  
  39.     protected void service(HttpServletRequest request,  
  40.             HttpServletResponse response) throws ServletException, IOException  
  41.     {  
  42.         System.out.println("LoginServlet开始处理用户登录请求:" + request.getRequestURI());  
  43.         String errMsg = "";  
  44.         HttpSession session = request.getSession(true);  
  45.         RequestDispatcher rd;  
  46.         String username = request.getParameter("username");  
  47.         String pass = request.getParameter("pass");  
  48.         String returnUrl = null;  
  49.         String rawQueryString = request.getQueryString();  
  50.         if (rawQueryString != null)  
  51.         {  
  52.             System.out.println("带有参数" + rawQueryString);  
  53.             try  
  54.             {  
  55.                 String queryString = URLDecoder.decode(rawQueryString, "GBK");  
  56.                 String[] paramPairs = queryString.split("&");  
  57.                 String[] nameValue = paramPairs[0].split("=");  
  58.                 if (nameValue[0].equalsIgnoreCase("ReturnUrl"))  
  59.                 {  
  60.                     returnUrl = nameValue[1];  
  61.                 }  
  62.             } catch (Exception e)  
  63.             {  
  64.                 e.printStackTrace();  
  65.                 returnUrl = null;  
  66.             }  
  67.         }  
  68.         if (returnUrl != null)  
  69.         {  
  70.             session.setAttribute("returnUrl", returnUrl);  
  71.         }  
  72.   
  73.         if (username != null)  
  74.         {  
  75.             try  
  76.             {  
  77.                 DbDao dd = new DbDao("oracle.jdbc.driver.OracleDriver",  
  78.                         "jdbc:oracle:thin:localhost:1521:orcl""system",  
  79.                         "abc123");  
  80.                 ResultSet rs = dd.query("select pass from user_table "  
  81.                         + "where name=?", username);  
  82.                 if (rs.next())  
  83.                 {  
  84.                     if (rs.getString("pass").equals(pass))  
  85.                     {  
  86.                         session.setAttribute("user", username);  
  87.                         String reUrl = (String) session.getAttribute("returnUrl");  
  88.                         if (session.getAttribute("returnUrl") == null)   
  89.                         {  
  90.                             System.out.println("登录成功,跳到欢迎页面");  
  91.                             ((HttpServletResponse) response)  
  92.                                     .sendRedirect(getServletContext()  
  93.                                             .getContextPath() + "/welcome.jsp");  
  94.                         } else  
  95.                         {  
  96.                             System.out.println("登录成功,返回之前的页面");  
  97.                             ((HttpServletResponse) response)  
  98.                                     .sendRedirect(reUrl);  
  99.                         }  
  100.                     } else  
  101.                     {  
  102.                         errMsg += "您的用户名密码不符合,请重新输入";  
  103.                     }  
  104.                 } else  
  105.                 {  
  106.                     errMsg += "您的用户名不存在,请先注册";  
  107.                 }  
  108.             } catch (Exception e)  
  109.             {  
  110.                 e.printStackTrace();  
  111.             }  
  112.         }  
  113.         if ((errMsg != null && !errMsg.equals("")) || username == null)  
  114.         {  
  115.             System.out.println("forward到login.jsp");  
  116.             rd = request.getRequestDispatcher("/login.jsp");  
  117.             request.setAttribute("err", errMsg);  
  118.             rd.forward(request, response);  
  119.             // (1)请求被redirect到/login?returnUrl...,让浏览器重新发送一个请求,这个请求为/login?returnUrl...  
  120.             // (2)浏览器发送这个请求,把地址刷新为/login?returnUrl...  
  121.             // (3)服务器记下returnUrl,把请求forword到login.jsp。login.jsp输出响应  
  122.             // (4)浏览器收到响应,渲染页面。地址栏还是login?returnUrl  
  123.             // (5)浏览器向服务器发送post请求,此时发的请求就是/login。  
  124.             // 浏览器的地址栏显示什么,是由浏览器根据它发送的请求决定的,此时它的请求是/login,所以它的地址栏就变成了/login  
  125.         }  
  126.     }  
  127.   
  128. }  
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3203 引用 • 8217 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 13 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 24 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 688 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    240 引用 • 224 回帖
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 112 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1708 回帖 • 2 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 686 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 450 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 566 关注
  • 叶归
    15 引用 • 66 回帖 • 28 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3203 引用 • 8217 回帖
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    17 引用 • 7 回帖 • 2 关注
  • Follow
    4 引用 • 12 回帖 • 11 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 677 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 507 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 1 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖 • 2 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 229 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    555 引用 • 675 回帖
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖 • 1 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    498 引用 • 934 回帖 • 1 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 3 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 92 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 237 关注