关于过滤器基本思想的理解

1.登录页面login.jsp

<form action="doLogin.jsp" method="post">
    <table border="1px" width="500px" align="center">
        <tr>
            <td colspan="2" bgcolor="#7fffd4">登录</td>
        </tr>
        <tr>
            <td>用户:</td><%--文本框--%>
            <td><input type="text" name="username"></td>
        </tr>
        <tr>
            <td>密码:</td><%--密码框--%>
            <td><input type="password" name="password"></td>
        </tr>
        <tr>
            <td></td><%--提交按钮submit--%>
            <td><input type="submit" value="确定"></td>
        </tr>
    </table>
</form>

2.对login.jsp的数据进行操作的页面:doLogin.jsp

<%@ page import="com.pro.domain.Permission" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    //1.进行登录
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    Users users = new Users();
    users.setUsername(username);
    users.setPassword(password);
    //2.将登录后的结果集封装,得到该用户所有的详细信息
    UsersService usersService = new UsersServiceImpl();
    Users user1 = usersService.login(users);
    String path = "login.jsp";
    if (user1 != null) {
        Users user2 = usersService.getUsersAllDetails(user1);
        session.setAttribute("user2",user2);
        path = "index.jsp";
    }
    //3
    response.sendRedirect(path);
%>

3.过滤器代码

@Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //向下转型,让request既有自己的方法又有servletRequest的方法(应该是这么理解的),response同理
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //1.获取网络地址,取最后一个“/”后面的字符串
        String path = request.getRequestURI();
        path = path.substring(path.lastIndexOf("/"));
        path = path.substring(1);

        //2.将公共访问资源与path进行比较,如果path访问的是公共资源,则可以进行公共资源的访问
        if ("login.jsp".equals(path) || "doLogin.jsp".equals(path) || "noPermission.jsp".equals(path)) {
            filterChain.doFilter(request, response);
            return;
        }

        //3.如果不是访问的公共资源,则需要进行用户验证,即进行访问权限设置
        //3.1 获取session作用域对象
        HttpSession session = request.getSession();
        //3.2 从doLogin.jsp文件中得到User对象
        Users user = (Users) session.getAttribute("user2");
        boolean flag = false;
        /*3.2 当存在这个用户时,先遍历访问权限,然后根据flag判断,如果用户权限中包含了path,则可以访问path,否则跳转到noPermission.jsp页面中*/
        if (user != null) {
            for (Permission s : user.getRole().getPermissionList()){
                if (s.getUrl().equals(path)) {
                    flag = true;
                    break;
                }
                if ("index.jsp".equals(path)) {
                    flag = true;
                    break;
                }
            }
            if (flag) {
                filterChain.doFilter(request, response);
                return;
            } else {
                response.sendRedirect("noPermission.jsp");
                return;
            }
        }
        //4.如果path既不是访问公共资源,也不是访问所在权限资源,则回到login.jsp中
        response.sendRedirect("login.jsp");
        //记得在web.xml文件中对过滤器进行配置!
        /*
            <filter>
                <filter-name>filter</filter-name>
                <filter-class>com.pro.util.MyFilter</filter-class>
            </filter>
            <filter-mapping>
                <filter-name>filter</filter-name>
                <url-pattern>/*</url-pattern>  所有页面跳转都会触发过滤器
            </filter-mapping>
        */
    }

通过编码可以看出servlet过滤器的基本思想:

1.获得要访问的网页,截取最后一个"/"的后面部分

2.和可以访问的公共资源进行对比,符合就可以访问

3.访问的页面不是公共资源:先遍历该用户的权限,如果用户权限中有该页面,则可以访问,否则就是非法访问

4.既不是访问公共资源也不是访问权限资源,此处是跳转到了login.jsp,这个根据实际情况而定

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值