filter拦截后,登录也跳转回login页面了。

filter拦截后,登录也跳转回login页面了。

Listener

package com.imooc.web.listener;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import com.imooc.domain.User;

@WebListener
public class InitServletContextListener implements ServletContextListener {


    public void contextDestroyed(ServletContextEvent sce)  { 
    }

    public void contextInitialized(ServletContextEvent sce)  { 
    	System.out.println("项目中数据初始化了....");
    	// 创建一个用于保存用户信息的List集合
    	List<User> userList = new ArrayList<User>();
    	User user = new User();
    	user.setUsername("m0001");
    	user.setPassword("123123");
    	userList.add(user);
    	// 将List集合存入到ServletContext域中
    	sce.getServletContext().setAttribute("userList", userList);
    }
	
}

loginServlet

package com.imooc.servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.imooc.domain.User;
import com.imooc.service.UserService;
import com.imooc.serviceimpl.UserServiceImpl;

@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("进入登录servlet");
		// 完成验证码的校验:
		// 获得session中保存的验证码的信息
		String code1 = (String) request.getSession()
				.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
		// 接收前台表单提交的验证码的信息
		String code2 = request.getParameter("verifyCode");
		if (code2 == null || !code2.equalsIgnoreCase(code1)) {
			request.setAttribute("msg", "验证码输入不正确!");
			request.getRequestDispatcher("/login.jsp").forward(request, response);
			return;
		}
		// 接收数据
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		// 封装数据
		User user = new User();
		user.setPassword(password);
		user.setUsername(username);
		UserService userService = new UserServiceImpl();
		// 获取用户列表
		List<User> userList = (List<User>) getServletContext().getAttribute("userList");
		User existUser = userService.login(userList, user);
		if (existUser == null) {
			// 登录失败
			request.setAttribute("msg", "账号或密码输入错误!");
			request.getRequestDispatcher("login.jsp").forward(request, response);
		} else {
			// 登录成功
			request.setAttribute("msg", "登录成功!");
			//存储登录用户信息
			request.setAttribute("existUser", existUser);
			response.sendRedirect(request.getContextPath() + "/categoryList.jsp");
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

filter

package com.imooc.filter;

import java.io.IOException;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.imooc.domain.User;
@WebFilter(filterName = "loginFilter",urlPatterns = "*.jsp")
public class LoginFilter implements Filter {

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("注解形式过滤器已生效");
		HttpServletRequest Httprequest = (HttpServletRequest)request;
		HttpServletResponse Httpresponse = (HttpServletResponse)response;
		User user = (User) Httprequest.getAttribute("existUser");
		String uri = Httprequest.getRequestURI();
		if(user!=null) {
			//用户已经登录
			chain.doFilter(request, response);
			return;
		}if(uri!=null&&uri.indexOf("login")==-1){
			//用户没有登录且uri不是登录页面
			Httprequest.setAttribute("msg", "尚未登录,请先登录!");
			Httpresponse.sendRedirect(Httprequest.getContextPath()+"/login.jsp");
		}else {
			chain.doFilter(request, response);
		}
	}

}


正在回答

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

4回答

同学你好,

1、关于index.jsp页面放行,同学可以在LoginFilter中根据请求路径判断是否放行。

参考代码如下:

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

2、同学可以将Filter的msg放在session作用域。

参考代码如下:

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

检查一下login.jsp中获得msg是否拼写错误。

如下:

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

如果问题没有解决,建议同学贴一下login.jsp代码,方便老师检查。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

提问者 wacky1 2020-06-11 16:40:23

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
<link rel="stylesheet" href="css/login.css">
<script type="text/javascript">
	function changeImg() {
		var codeImg = document.getElementById("codeImg");
		codeImg.src = "${pageContext.request.contextPath }/KaptchaServlet?time="
				+ new Date().getTime();
	}
</script>
</head>
<body>
	<div class="login">
		<div class="header">
			<h1>
				<a href="/login.do">登录</a>
				<P>${msg }</P>
			</h1>
			<button></button>
		</div>
		<form action="${pageContext.request.contextPath }/login.do" method="post">
			<div class="name">
				<input type="text" id="name" name="username">
				<p></p>
			</div>
			<div class="pwd">
				<input type="password" id="pwd" name="password">
				<p></p>
			</div>
			<div class="code">
				<input type="text" id="code" name="verifyCode" style="width: 150px">
				&nbsp;&nbsp;&nbsp;&nbsp; <img id="codeImg" onclick="changeImg()"
					style="width: 150px; height: 42px; vertical-align: middle;"
					src="${pageContext.request.contextPath }/KaptchaServlet">
				<p></p>
			</div>
			<div class="btn-red">
				<input type="submit" value="登录" id="login-btn">
			</div>
		</form>
	</div>
</body>
</html>


好帮手慕阿慧 2020-06-11 15:40:05

同学你好,登陆成功后同学将User对象放在了request作用域中。request域中的数据作用范围是一次请求。第二次请求及以后的请求中获取不到User对象,所以登陆也跳转回login页面。

同学可以将User对象放在Session或application作用域。以Session作用域为例,参考代码如下:

LoginServlet.java:

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

LoginFilter.java:

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

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 wacky1 #1
    我刚刚也发现了。老师还有一个问题,我这里是用Index.jsp跳转到login.jsp的,用注解的形式如何放行index.jsp页面啊?
    2020-06-11 15:42:51
  • 提问者 wacky1 #2
    还有,filter的msg没法传递过去
    2020-06-11 15:50:35
提问者 wacky1 2020-06-11 15:19:30

http://img1.sycdn.imooc.com//climg/5ee1da410904f14d14290187.jpg在代码里面加了System.out.println看看步骤,发现是登录验证成功了,但是页面跳转回login.jsp了。filter里面走了if(user!=null&&uri.indexOf("login")==-1)的条件

  • 提问者 wacky1 #1
    还有,filter的msg没法传递过去
    2020-06-11 15:50:20
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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