BUG重现:在用户注销后,应用浏览器的前进后退按钮仍然可以看到以前的操作页面,但是再进行具体业务逻辑时由于一些对象已经销毁而产生错误,修改要求再进行具体业务操作时应该返回登录页面。
修改方案1:由于注销动作会销毁session,因此想到进行具体操作时根据session是否为空来判断是跳转到下一页面还是返回到登录页面。在jsp页面的代码中加入session是否为空的判断,但是发现不是每次都会读取那段代码,大部分为读取的缓存。所以禁止浏览器读取缓存,代码如下
<% response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.setHeader("Pragrma","no-cache");
response.setDateHeader("Expires",0);
%>
html中加入代码:
<meta http-equiv="Expires" content="0"/>
<meta http-equiv="Cache-Control" content="no-cache"/>
<meta http-equiv="Pragma" content="no-cache"/>
代码修改后发现并没有达到要求,还是会进行具体的业务逻辑。
修改方案2:在原来请求jsp页面前请求一个servlet,在servlet里面判断session是否为空,但是这样在传jsp所需要的参数时就很麻烦,需要自己拼装字符串。修改完以后发现仍然会进行具体的业务逻辑。然后看日志,打印sessionId,发现注销后点击后退,没有读取缓存,但是session确实不为空。为什么呢..查询代码发现在注销后会自动创建新的session,fuck.看来不能用session来判断是否已经注销了。转变思路,在注销后进行具体业务逻辑失败不是因为session为空,为是因为操作具体逻辑的对象被销毁了,而这些对象是在登录时创建的。所以有判断session是否为空改为判断这些重点的逻辑对象是否为空,这里为判断异步控制对象是否为空(AsynInfoControl),经过这样的修改后部分满足了要求。为什么这么说呢,应为这个servlet是针对某一个jsp页面的跳转写的验证程序,如果用户后退到其他操作页面则还会进行具体的业务操作,难道要为每个jsp页面写一个这样的验证程序吗?O,NO..
突然想到为什么不写一个类似与过滤器的东西呢,再所有的请求中都加上这个过滤器,这样还可以解决具体jsp参数传递的问题。GOOD,于是写了一个filter,过滤条件为*,因为程序中有直接访问jsp的,还有访问servlet的。代码改完后,登录,发现登录界面跳转后还是登录界面,恍然大悟,原来过滤器在过滤登录的servlet(loginservlet)时,正好这个servlet也满足了被滤掉的条件(具体的那个逻辑对象为空,因为此时还没到创建这些对象的地方,cause还没到loginservlet,只在过滤器上就被pass了,T_T)。于是想到主动让过滤器露掉登录的servlet,在请求的request中查询当前请求的URI,如果为loginservlet的URI,则为正常的登录,要结着跳转到后面的loginservlet,不能pass掉。所有代码改完后,测试,成功。ohyeah!
这次改bug最满足的地方是由刚开始的再别人写的代码上改,最后改成加过滤器,并没有修改别人的代码,这样安全性和代码的污染性要小很多很多。
写这个的目的只是记录下自己遇到问题分析问题的过程和思路的转变,因为以前没有特意用过过滤器,所以这次能想到这里还是挺兴奋的。尽管这是很基础的能力...
经验是一点一点积累起来的,在JAVA开发的路上我会慢慢成长,仅以此纪念。
分享到:
相关推荐
在深入分析和探讨过滤器在Java Web开发中的应用研究时,首先要了解过滤器的定义及其在Java Web开发中的重要作用。过滤器是一种设计模式,用于拦截请求和响应,以便执行某些预处理或后处理操作。在Java Web开发中,...
Java开发Web应用是一个广泛的主题,涵盖了许多核心技术。...后续章节通常会涵盖更高级的主题,如Struts 2的过滤器、监听器、自定义标签和更复杂的应用场景。学习这些内容将有助于开发者构建更加高效、可维护的Web应用。
开源项目如Jive PetStore是一个优秀的实战案例,它不仅展示了完整的Java Web应用架构,还包含了缓存管理、过滤器、XML配置等方面的知识点,非常适合用来巩固所学并拓展视野。 #### 面向未来的Java学习策略 随着...
Java语言的图像处理技术涉及的颜色模型、图像格式以及图像过滤器的扩增,为图像处理领域的发展提供了有力的支持。 文章接着详细分析了Java技术在图像处理领域的应用分为三个阶段: 1. Java AWT(Abstract Window ...
- **文件过滤器**:教授如何使用文件过滤器来筛选文件。 #### 十一、简单GUI编程 - **Swing/AWT组件**:介绍Swing和AWT组件库的基本组件及其使用方法。 - **事件监听器**:教授如何为组件添加事件监听器来响应用户...
Java 8是Java发展历程中的一个重要里程碑,引入了许多创新特性,极大地提升了开发效率和代码质量。在深入学习Java之前,理解并掌握Java 8的基础知识至关重要。这个名为"Java-8-jar包"的压缩文件,可能包含了JDK ...
- **解决方案**:介绍了函数式编程的核心概念,如映射(map)和过滤器(filter),并通过这些高级特性简化了常见的编程任务,使得代码更为简洁高效。 #### 如何在Android上编写高效的Java代码 - **资源管理**:针对...
7. **过滤器与监听器**:在Java Web中,过滤器(Filter)和监听器(Listener)是两个关键组件,用于拦截请求、修改响应,以及监听应用生命周期事件。源代码可能会包含自定义过滤器和监听器的实现。 8. **Web安全**...
Java SE 8是Java发展历程中的一个重要里程碑,引入了许多创新特性,提升了开发效率和代码质量。 1. **Lambda表达式**:Java SE 8最大的变革之一就是引入了Lambda表达式,它使得函数式编程风格在Java中成为可能。...
Java Workshop 允许程序员重新安排这些操作,甚至可以确定触发操作行为的过滤器。 3)此外,Java WorkShop 支持 JDK1.1.3 以及 JavaBeans 组件模型,API 和语言特征增加了编译 Java 应用程序的灵活性。 六、Java ...
Java SE 8 集成了Nashorn JavaScript引擎,允许Java应用程序直接执行JavaScript代码,促进了Java与JavaScript之间的互操作性。 八、Optional类 Optional 类是用来解决null值问题的容器对象。它可以防止...
Java 8是Java发展历程中的一个重要里程碑,引入了许多创新特性,极大地提升了开发效率和代码质量。本资料集“ikm java 8@www.java1234.com.zip”包含了对Java 8核心特性的深度解析,特别是其中的PDF文档,将帮助读者...
JDK(Java Development Kit)包含了Java运行环境(JRE)、编译器(javac)、Java文档生成器(javadoc)、Java调试器(jdb)以及其他工具,使得开发者能够编写、打包、测试和调试Java应用程序。这个zip文件“jdk8.zip...
2. **方法引用和构造器引用**:在Java 8中,可以使用方法引用或构造器引用直接传递方法或构造器作为参数,避免了Lambda表达式的冗余代码。 3. **Stream API**:Stream API 提供了一种新的数据处理方式,允许对集合...
Java开发工具包(Java Development Kit,简称JDK)是Java编程语言的软件开发工具包,是程序员编写、编译、调试Java应用程序所必需的。JDK1.8是Oracle公司发布的Java平台标准版(Java SE)的一个重要版本,它包含了...
4. **过滤器(Filter)**:利用Filter来实现统一的权限控制、输入验证和输出编码,提高代码复用性和安全性。 5. **权限控制**:使用如Spring Security这样的框架进行细粒度的访问控制,确保只有授权用户才能访问...
6. **Servlet 2.5** 和 **JSP 2.1**:这两个版本的更新增强了Web容器的功能,提供了更多的API和改进的性能,如动态包含、EL表达式语言增强以及更灵活的过滤器和监听器。 7. **Web Services**:Java EE 5支持基于...
JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的软件包。它包含了Java编译器、Java虚拟机(JVM)、调试器以及其他开发工具。JDK 1.8,也被称为Java 8,是Java发展历程中的一个重要里程...