一、登录验证
案例1_登录验证
- 需求:
- 访问day17_case案例(这里是https://blog.csdn.net/QLBFA/article/details/110428015)这个项目资源。验证其是否登录
- 如果登录了,则直接放行。
- 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录"。
在这个:(总)用户信息查询案例代码中在src建一个filter子包,建一个LoginFilter 的Filter:
package cn.itcast.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* 登录验证的过滤器
* @author QLBF
* @version 1.0
* @date 2020/12/1 22:25
*/
@WebFilter("/*")
public class LoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//0.强制转换,因为ServletRequest不是HttpServletRequest
HttpServletRequest request=(HttpServletRequest)req;
//1.获取资源请求路径
String uri = request.getRequestURI();
//2.判断是否包含登录相关资源路径,要注意排除掉 (web下的)css/js/图片/验证码等资源
if(uri.contains("/login.jsp") || uri.contains("/LoginServlet") || uri.contains("/css/")
|| uri.contains("/js/") || uri.contains("/fonts/") || uri.contains("/checkCodeServlet") ){
//包含,用户就是想登录。放行进上述uri.contains()里面写着的
chain.doFilter(req,resp);
}else {
//如果请求的不是登录有关的资源(则先叫他登录先),需要验证用户是否登录
//3.从获取session中获取user(loginServlet设置的)
Object user = request.getSession().getAttribute("user");
if (user!=null){
//登录了。放行(他想访问什么资源就访问什么资源)
chain.doFilter(req,resp);
}
else {
//没有登录。跳转登录页面,login_msg设置和loginServlet错误的一样,好在login.jsp统一展示
request.setAttribute("login_msg","您尚未登录,请登录!");
request.getRequestDispatcher("/login.jsp").forward(request,resp);
}
}
}
public void init(FilterConfig config) throws ServletException {
}
}
1.首次访问时,如果你没登录就想访问里面的add.jsp(不在排除的登录资源内),过滤器会把你拦截下来不给你访问(而是先跳转到登录页面叫你登录(自己过滤器定义的,见上)):
2.当登录后,只要你的session没清除掉(这里浏览器管了就清楚session了),你就可以访问你想的资源了,这是你访问add.jsp就可以访问了: