关于视频3-8的“用户登录安全控制过滤器实现”中的代码问题。
老师好,在3-8的“用户登录安全控制过滤器实现”这个视频里面,您的代码经我执行后出现了 多次重定向无法访问页面 的情况。
我比对了一下自己的代码和您的代码,似乎没有什么出入。于是自己分析了一下,推测是页面陷入了重定向的死循环。而且认为应该是(图1)中的判断语句有问题,自己测试了一下达到了预设,因此更加觉得有问题,故特来请教一下您。
Index.jsp的form内容紧接着是由login.jsp进行处理的,在login.jsp中设置了一个sessoin值,我推测是用来过渡一下,目的是在用户点击index.jsp页面中的登录按钮后再进行下一步的判断,若帐号为空则返回index.jsp,直到用户填写了帐号为止。这个任务给到了过滤器。
图1.
但问题是,用户第一次输入网址到达index.jsp页面时,还未进行操作,帐号自然是空着的,但是此时Filter已经在执行doFilter了,这个时候用户还没有点击登录按钮,还没轮到login.jsp在session里面设置loginUser给到Filter进行判断,就已经在执行doFilter了,因为session里面尚未设置loginUser但doFilter已经在使用session的loginUser即使这个loginUser尚未存在,但此时确实是可以执行的,因为不存在的东西值为null,刚好符合判断条件。于是就直接往后执行,重定向回到了当前页面,用户依然什么也没来得及干,就陷入了重定向的死循环。为了测试,我随便输出了session里根本不存在的东西,结果输出的结果为Null,并没有报错。似乎真的就是我推测的这样。
但是为什么您的代码不会出现这个情况,而我的却陷入了死循环无法进入该页面?
图2.
图3.测试图
我的index.jsp代码如下: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String flag = (String)request.getParameter("flag"); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <script type="text/javascript"> var flag = '<%=flag %>'; if('1'== flag){ alert('请登录系统!'); } </script> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>系统登录</title> </head> <link href="form.css" rel="stylesheet" type="text/css"/> <body> <form action="login.jsp" method="post" class="smart-green" > <h1>系统登录</h1> <label> <span>用户名:</span> <input id="username" type="text" name="username"/> </label> <lable> <span>密码</span> <input id="password" type="password" name="password"/> </lable> <span> </span> <label> <input type="submit" class="button" value="登录"/> </label> </form> </body> </html> 我的login.jsp代码如下: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String username = request.getParameter("username"); String password = request.getParameter("password"); session.setAttribute("loginUser", username); response.sendRedirect(request.getContextPath()+"/message.jsp"); %> 我的CharacterEncodingFilter代码如下: package cn.java.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import sun.misc.ObjectInputFilter.Config; public class CharacterEncodingFilter implements Filter { private FilterConfig config; @Override public void destroy() { System.out.println("characterEncoding Filter destroy ... ..."); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding(config.getInitParameter("charset")); HttpServletRequest hrequest = (HttpServletRequest)request; HttpServletResponse hresponse = (HttpServletResponse)response; String loginUser = (String)hrequest.getSession().getAttribute("loginUser"); String helloWeb = (String)hrequest.getSession().getAttribute("helloWeb");//实际上在session里面并未设置这个东西。 System.out.println("session中不存在的helloWeb,执行时并没有报错,而是打印了:"+helloWeb); System.out.println("loginUser当前的值为:"+loginUser); /** if(loginUser == null) { hresponse.sendRedirect(hrequest.getContextPath()+"/index.jsp?flag=1"); chain.doFilter(request, response); return; }else { chain.doFilter(request, response); return; } */ chain.doFilter(request, response); } @Override public void init(FilterConfig config) throws ServletException { this.config = config; System.out.println("Filter init ... ..."); } public FilterConfig getConfig() { return config; } public void setConfig(FilterConfig config) { this.config = config; } }
正在回答 回答被采纳积分+1
程序的执行流程是这样的:index.jsp中的表单提交后,请求发送给login.jsp进行处理,login.jsp将用户名和密码获取到后,把用户名存储到了session里,这时候就可以重定向到message.jsp。执行message.jsp前肯定会执行过滤器,在过滤器中判断loginUser是否为null,其实如果一直是这么执行过来的话,loginUser中是会有值的,所以过滤器就会通过。如果没有登录,直接访问message.jsp,此时经过过滤器的时候loginUser会为null,就会重定向到index.jsp,并带了flag的值,然后根据flag的值提示未登录。
“但问题是,用户第一次输入网址到达index.jsp页面时,还未进行操作,帐号自然是空着的,但是此时Filter已经在执行doFilter了,这个时候用户还没有点击登录按钮”,不是这样的,sessionFilter只过滤message.jsp,不过滤index.jsp,也就是执行index.jsp的时候是不执行过滤器的。你看一下web.xml文件,是否像老师这样设置的,注意
<url-pattern>/message.jsp</url-pattern>,这里只有message.jsp,不是/*
<!-- 用户登录安全控制过滤器配置 --> <filter> <filter-name>sessionFilter</filter-name> <filter-class>filter.SessionFilter</filter-class> </filter> <filter-mapping> <filter-name>sessionFilter</filter-name> <url-pattern>/message.jsp</url-pattern> </filter-mapping>
如果还有问题请继续提问。祝学习愉快!
- 参与学习 716 人
- 提交作业 185 份
- 解答问题 1363 个
会Java?懂前端基础?想学后台开发?那么,赶快来学习《Java Web入门》路径吧。本路径主要介绍Java Web的基础知识,并配有大量案例,定会让你收获多多!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星