JavaWeb简单实例——Filter过滤器

在JavaWeb中的过滤器的意义是在每次访问网页的时候都会先经过过滤器,所以在过滤器内部一般是配置一些每个页面中的国定的操作,比如登陆验证或编码格式的更改。

定义一个FIlter类:

Filter类的本质是一个实现了Filter接口的Java类,所以我们只需要定义一个Java类实现Filter接口,并重写内部的三个方法即可

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("放行前的逻辑");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("放行后的逻辑");
    }

    @Override
    public void destroy() {

    }
}

其中主要的方法是doFilter方法,这个方法内部是真正进行过滤的逻辑操作的语句,当我们访问一个页面时,会首先执行方姓钱的逻辑,然后使用方法中的参数:filterChain的方法doFilter方法将请求放行,在请求完之后,再执行放行后的逻辑。注意在此时,放行前主要对请求数据进行处理操作,放行后主要对响应数据进行处理和操作 

使用这个Filter:

 可以看到,当我启动服务的时候,则会出现预先设置好的在控制台打印出来的语句,说明这个过滤器已经在工作了

配置拦截路径:

在一个过滤器中,使用@WebFilter("/*")注解配置拦截路径,其中括号内的值就是拦截路径,需要用双引号包裹起来,其中的可配置项如下:

拦截具体的资源:“/index.jsp",当访问index.jsp这个文件的时候过滤器才会有效

目录拦截:”/User/*“,当访问User路径下的文件的时候过滤器才会有效

后缀名拦截:”*.jsp“,当访问后缀名为.jsp结尾的时候过滤器才会有效

拦截所有:”/*“,使用的频率最高,当访问所有的资源的时候过滤器都会生效

简单案例:

在了解了过滤器的基本实现的之后,做一个简单的案例:当我们在登陆的时候,如果不登录直接网站的其他资源只需要输入路径即可完成,这样肯定是不符合实际情况的,所以此时的需求就是利用过滤器,在每次访问资源的之后,都检查一下是否登录。

思路很简单,只需要在登陆的时候传入一个特殊的标记cookie,在过滤器中检查这个标记是否存在即可。

运行效果:

代码实现:

登录界面:

<%@ 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="/ProcessRequest"/>" 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="OneMonth">一个月
                    <input type="radio" name="time" value="trimester">三个月
                    <input type="radio" name="time" value="Half">半年
                    <input type="radio" name="time" value="OneYear">一年
                    <input type="radio" name="time" value="TwoAndAHalfYears">两年半
                </td>
            </tr>
            <tr>
                <td colspan="5"><button type="submit">登录</button> <button type="reset">重置</button> </td>
            </tr>
        </table>
    </form>
</div>
</body>
</html>

展示界面:

<%--
  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>${username}</h3>
    </div>
</div>
</body>
</html>

用来判断的Servlet:

package Semester_3.FilterChecking;

import javax.servlet.ServletException;
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;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet(name = "ProcessRequest" , value = "/ProcessRequest")
public class ProcessRequest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        User user = new User();
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日-HH时mm分ss秒");
        String time = sdf.format(date);
        Cookie cookie1 = new Cookie("username",username);
        Cookie cookie2 = new Cookie("mark","true");
        if(username.equals(user.getUsername())){
            resp.addCookie(cookie2);
            resp.addCookie(cookie1);
            user.setTime(time);
            req.setAttribute("username",username);
            req.getRequestDispatcher("/FilterChecking/index.jsp").forward(req,resp);
        }else {
            req.setAttribute("index",1);
            req.getRequestDispatcher("/FilterChecking/login.jsp").forward(req,resp);
        }
    }

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

过滤器:

package Semester_3.FilterChecking;

import Semester_3.ShoppingCart.cookie;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter("/FilterChecking/index.jsp")
public class intercept 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;
        Cookie[] cookies = req.getCookies();
        for(Cookie c : cookies){
            String value = c.getName();
            if(value.equals("mark")){
                filterChain.doFilter(servletRequest,servletResponse);
            }else {
                req.setAttribute("Filter_index",1);
                req.getRequestDispatcher("/FilterChecking/login.jsp").forward(req,resp);
            }
        }

    }

    @Override
    public void destroy() {

    }
}

用户类: 

package Semester_3.FilterChecking;

public class User {
    private String username = "张三";
    private String time;

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

    public User() {}

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

    public void setTime(String time) {
        this.time = time;
    }

    public String getUsername() {
        return username;
    }

    public String getTime() {
        return time;
    }
}

注意点:

这里的判断只是简单的判断了之前设定好的用户名,在实际操作用应该是判断更复杂的选项。而且在过滤器中的拦截路径也不仅仅是一个文件,而应该是一个路径拦截或是全部拦截

简单思路:

对于过滤器检查登录的简单逻辑介绍
当我们访问login.jsp时,会显示一个登陆用的表单,当我们填写完成并提交之后,数据会发送到ProcessRequest
这个Servlet类中进行判断,如果输入的用户名符合用户类中的预先设定好的用户名,则将标记用的cookie和
用户名转发到index.jsp并展示。
如果用户名错误,则将一个标记错误信息的变量存储到请求域中,并在index.jsp中解析错误信息并显示
相应的错误信息。
如果没有登录,也就是没用通过login.jsp登陆成功直接访问index.jsp则会经过过滤器intercept,当
检测到没有标记时,也会向请求域中传入一个标记错误信息的变量,并在index.jsp中解析错误信息并显示
相应的错误信息
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值