需求
-
访问服务器资源。验证其是否登录
-
如果登录了,则直接放行。
-
如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录"。
分析
注意
:如果是跟登录相关的资源要直接放行,不然会形成死循环。比如说:index.jsp、LoginServlet、验证码和登录相关的CSS、JS等资源。
注意
:Filter的request和response对象分别是
ServletRequest
和
ServletResponse
,而非Servlet里面的
HttpServletRequest
和
HttpServletResponse
不能直接获取路径,需要这样获取,如下:
//1.强制转换
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
实现
/**
* 登录验证的过滤器
*/
@WebFilter("/*")
public class Filter implements javax.servlet.Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//1.强制转换
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//2.获取资源请求路径
String requestURI = request.getRequestURI();
//3.判断是否包含登录相关资源路径
if (requestURI.contains("login.jsp") || requestURI.contains("/loginServlet")) {
//包含,用户想登录,放行
chain.doFilter(req, resp);
} else {
//不包含,需要验证用户是否登录
//4.从session中获取user
Object user = request.getSession().getAttribute("user");
if (user != null) {
//登录了。放行
chain.doFilter(req, resp);
} else {
//没有登录。跳转到登录页面。
request.setAttribute("login_msg", "您尚未登录,请登录");
request.getRequestDispatcher("/login.jsp").forward(request, resp);
}
}
}
@Override
public void init(FilterConfig config) throws ServletException {
}
}
注意
:如果出了BUG大概率是
这一步没有排除掉相关的资源,比如说跟登录相关的,并且是存放在服务器的CSS、JS等等。这里仅仅是代码演示,不考虑太多。