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);
}
}
}20
收起
正在回答
4回答
同学你好,
1、关于index.jsp页面放行,同学可以在LoginFilter中根据请求路径判断是否放行。
参考代码如下:

2、同学可以将Filter的msg放在session作用域。
参考代码如下:

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

如果问题没有解决,建议同学贴一下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">
<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>
2. 从网页搭建入门JavaWeb
- 参与学习 人
- 提交作业 676 份
- 解答问题 9666 个
本阶段将从前端网页搭建入手,到Java Web基础,前后端结合助你完成Java Web小白的蜕变!
了解课程


在代码里面加了System.out.println看看步骤,发现是登录验证成功了,但是页面跳转回login.jsp了。filter里面走了if(user!=null&&uri.indexOf("login")==-1)的条件
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星