关于视频3-8的“用户登录安全控制过滤器实现”中的代码问题。

关于视频3-8的“用户登录安全控制过滤器实现”中的代码问题。

老师好,在3-8的“用户登录安全控制过滤器实现”这个视频里面,您的代码经我执行后出现了 多次重定向无法访问页面 的情况。

我比对了一下自己的代码和您的代码,似乎没有什么出入。于是自己分析了一下,推测是页面陷入了重定向的死循环。而且认为应该是(图1)中的判断语句有问题,自己测试了一下达到了预设,因此更加觉得有问题,故特来请教一下您。

Index.jsp的form内容紧接着是由login.jsp进行处理的,在login.jsp中设置了一个sessoin值,我推测是用来过渡一下,目的是在用户点击index.jsp页面中的登录按钮后再进行下一步的判断,若帐号为空则返回index.jsp,直到用户填写了帐号为止。这个任务给到了过滤器。

http://img1.sycdn.imooc.com//climg/5a7bc29b0001baba05580335.jpg

                                                            图1.

但问题是,用户第一次输入网址到达index.jsp页面时,还未进行操作,帐号自然是空着的,但是此时Filter已经在执行doFilter了,这个时候用户还没有点击登录按钮,还没轮到login.jsp在session里面设置loginUser给到Filter进行判断,就已经在执行doFilter了,因为session里面尚未设置loginUser但doFilter已经在使用session的loginUser即使这个loginUser尚未存在,但此时确实是可以执行的,因为不存在的东西值为null,刚好符合判断条件。于是就直接往后执行,重定向回到了当前页面,用户依然什么也没来得及干,就陷入了重定向的死循环。为了测试,我随便输出了session里根本不存在的东西,结果输出的结果为Null,并没有报错。似乎真的就是我推测的这样。

    但是为什么您的代码不会出现这个情况,而我的却陷入了死循环无法进入该页面?

http://img1.sycdn.imooc.com//climg/5a7bc35000010b5105580318.jpg

                                                         图2.

 http://img1.sycdn.imooc.com//climg/5a7bc36300017d9c05580298.jpg

                                                      图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>&nbsp;</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

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕珊 2018-02-08 14:48:40

程序的执行流程是这样的: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>

如果还有问题请继续提问。祝学习愉快!

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java Web基础入门2018版
  • 参与学习       716    人
  • 提交作业       185    份
  • 解答问题       1363    个

会Java?懂前端基础?想学后台开发?那么,赶快来学习《Java Web入门》路径吧。本路径主要介绍Java Web的基础知识,并配有大量案例,定会让你收获多多!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师