通过 servlet程序的请求转发命令,访问被Filter过滤器保护的目标资源,会不会经过Filter过滤?

遇到的问题:

  • 通过 servlet程序的请求转发命令,访问被Filter过滤器保护的目标资源。

  • 希望通过Filter内添加的打印语句,查看是否会经过过滤器。但是不生效,不会打印任何结果。也无法调转到目标资源

下为jsp页面代码


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<a href="admin/a.jsp">点击跳转</a>
<form action="http://localhost:8080/_15_Filter/clickServlet" method="get">
    用户名:<input type="text" name="username" id="username"><br>&nbsp;&nbsp;码:<input type="password" name="password" id="password"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

下为Servlet程序
通过页面代码的表单提交到该Servlet程序,不存储user到Session中。

public class ClickServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 解决响应的数据中文乱码
        resp.setContentType("text/html; charset=UTF-8");
        // 获取参数username
        String username = req.getParameter("username");
        // 获取参数password
        String password = req.getParameter("password");
        // 判断用户,密码是否匹配
        if ("123".equals(username) && "123".equals(password)){
            req.getRequestDispatcher("admin/a.jsp").forward(req, resp);
        } else {
            // 不匹配,返回登录界面
            req.getRequestDispatcher("login.jsp").forward(req, resp);
        }
    }
}

下为 Filter程序
作用:想要过滤没有登陆过的用户访问
使用 Session域中是否存在'user',来判断是否登录

public class AdminFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 类型转换成HttpServletRequest、HttpServletResponse
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;

        // 对用户是否登录做一个筛选
        Object user = httpServletRequest.getSession().getAttribute("user");
        if (user == null){
            // 如果用户没有登录,则跳转到登陆界面
            System.out.println("被拦截了!!");
            httpServletRequest.getRequestDispatcher("/logina.jsp").forward(httpServletRequest, httpServletResponse);
        } else{
           // 让程序继续往下访问用户的目标资源
            System.out.println("访问成功!!");
            filterChain.doFilter(servletRequest, servletResponse);
        }

    }

    @Override
    public void destroy() {

    }
}

只要实现了Filter接口,所有的请求都会被拦截