关于视频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 星