JavaWeb简单实例——Filter链

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。JavaWeb简单实例——Filter链,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

简单介绍:

在我们的JavaWeb应用中,可能会用多个过滤器实现多层过滤,就会定义多个过滤器,这些过滤器组合在一起就形成了一个过滤器链(Filter链),可以在不同的拦截器内部实现不同的过滤条件并层层传递,那么接下来就用具体的代码实现来具体的看看多个过滤器是如何协作的:

代码实现:

Filter1:

package Semester_3.src.Util_9;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class FilterDemo1 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter1");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("goFilter1");
    }

    @Override
    public void destroy() {

    }
}

Filter2:

package Semester_3.src.Util_9;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class FilterDemo2 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter2");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("goFilter2");
    }

    @Override
    public void destroy() {

    }
}

运行结果:

JavaWeb简单实例——Filter链

多个过滤器的执行顺序:

可以看到,当我们请求资源的时候,多个过滤器之间会依次执行,这个依次就是按照过滤器名字的字典顺序来执行的,也就是说,在案例中,Filter1比Filter2的字典顺序靠前,所以就会先执行Filter1,再执行Filter2。在执行完放行前的语句之后,在执行放行后的语句的时候,是和之前的执行顺序是相反的,也就是说,多个过滤器链遵循先进先出,后进后出的原则,有点类似于我们的栈数据类型。

简单案例:创建一个过滤器实现自动登录,并且当关闭浏览器后,直接访问页面也会显示登陆后的页面

User类:

public class User {
    private String username;
    private String password;

    public User() {
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

LoginSevrvlet类:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "LoginServlet" , value = "/LoginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if(username.equals("张三")&&password.equals("123456")){
            User u = new User();
            u.setUsername(username);
            u.setPassword(password);
            req.getSession().setAttribute("User",u);
            if(req.getParameter("time")!=null) {
                Cookie cookie = new Cookie("autologin", username + "-" + password);
                cookie.setMaxAge(Integer.parseInt(req.getParameter("time")));
                resp.addCookie(cookie);
            }
            resp.sendRedirect("/show.jsp");
        }else {
            resp.setContentType("text/html;charset=utf-8");
            resp.getWriter().write("用户名或密码错误,三秒后回到登陆界面重新输入");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            resp.sendRedirect("/login.jsp");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

AutoLoginServlet:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter("/show.jsp")
public class AutoLoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        String value = null;
        for (Cookie cookie : req.getCookies()) {
            if(cookie.getName().equals("autologin")){
                value = cookie.getValue();
            }
        }
        if(value!=null){
            String[] split = value.split("-");
            String username = split[0];
            String password = split[1];
            if(username.equals("张三")&&password.equals("123456")){
                User u = new User();
                u.setUsername(username);
                u.setPassword(password);
                req.getSession().setAttribute("User",u);
            }
        }
        filterChain.doFilter(req,resp);
    }
    @Override
    public void destroy() {

    }
}

Login.jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/10/11
  Time: 18:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录界面</title>
    <style>
        .ta1{
            border: 1px solid black;
            text-align: center;
            width: 500px;
        }
        td{
            border: 1px solid black;
            text-align: center;
        }
        .div1{
            text-align: center;
            display: block;
            margin: 0 auto;
            height: 300px;
            width: 500px;
        }
    </style>
</head>
<body>
<div class="div1">
    <h1>用户登录</h1>
    <c:if test="${index == 1}">
        <h1 style="color: red;">登陆失败,请重新登录</h1>
    </c:if>
    <c:if test="${Filter_index == 1}">
        <h1 style="color: red;">你没有登录请登录</h1>
    </c:if>
    <form action="<c:url value="/LoginServlet"/>" method="get">
        <table class="ta1">
            <tr>
                <td>用户名</td> <td colspan="4"> <input type="text" name="username"></td>
            </tr>
            <tr>
                <td>密码</td> <td colspan="4"><input type="password" name="password"></td>
            </tr>
            <tr>
                <td>自动登陆时间:</td>
                <td>
                    <input type="radio" name="time" value="${60*60*24*30}">一个月
                    <input type="radio" name="time" value="${60*60*24*30*3}">三个月
                    <input type="radio" name="time" value="${60*60*24*30*6}">半年
                    <input type="radio" name="time" value="${60*60*24*30*12}">一年
                    <input type="radio" name="time" value="${60*60*24*30*30}">两年半
                </td>
            </tr>
            <tr>
                <td colspan="5"><button type="submit">登录</button> <button type="reset">重置</button> </td>
            </tr>
        </table>
    </form>
</div>
</body>
</html>

show.jsp:

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/10/11
  Time: 18:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录成功</title>
    <style>
        .div1{
            width: 800px;
            height: 300px;
            border: 1px solid black;
            text-align: center;
        }
        .div2{
            margin-top: 100px;
        }
    </style>
</head>
<body>
<div class="div1">
    <div class="div2">
        <h1>欢迎光临<br></h1>
        <h3>${sessionScope.User.username}</h3>
    </div>
</div>
</body>
</html>

注意点:

值得注意的是,在使用Filter类中的servletRequest和servletResponse对象的时候,需要先转成HttpServletRequest和HttpServletResponse对象才能调用获取cookie对象的方法。在展示登陆界面的时候,需要使用sessionCope对象调用存入session对象的key值再调用对象的属性值:sessionCope.sessionKey值.属性,需要确保这个key值对应的属性值是一个对象,并且对象中具有相应的属性值才能正常的获取到。比如在案例中,我们存入session域中的User值对应的属性是一个User对象,User对象具有username属性,所以可以通过:sessionCopy.User.username的方法获取到存入里面的用户名属性

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153340.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!