过滤器

什么是过滤器?
Javaweb过滤器是一种用于在Servlet处理请求之前或之后对请求进行预处理或后处理的组件。过滤器可以用于拦截请求、修改请求参数、过滤响应内容等操作 。

为什么使用过滤器
我们之前编写代码,有些资源需要登录后才允许访问。之前我们是在响应的资源处判断。 需要在很多地方都要添加判断。我们就可以使用过滤器对请求做统一判断。

我们之前在接受参数时,都需要进行编码的设置。需要在任何接受参数的位置加入编码设置。 也可以通过过滤器完成编码设置。


以后只要在访问资源前做一些公共的操作内容时,都可以使用过滤器完成。
如何使用过滤器
创建一个类并实现Filter接口和重写接口方法

public class MyFilter implements Filter {
    //初始化---可以获取初始化参数---只会执行一次
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化过滤器");
    }

    //过滤方法---可以处理请求的方法
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器的过滤方法");
    }

    //销毁方法---tomcat关闭时
    @Override
    public void destroy() {
        System.out.println("销毁方法。");
    }
}

注册过滤器和配置过滤规则


    <!--注册过滤器-->
     <filter>
         <filter-name>MyFilter</filter-name>
         <filter-class>com.ykq.filter.MyFilter</filter-class>
     </filter>

    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <!--拦截views请求路径下的资源/views/*-->
<!--        <url-pattern>/views/*</url-pattern>-->
        <!--拦截所有的请求资源-->
        <url-pattern>/*</url-pattern>
        <!--拦截所有后缀为jsp的资源-->
<!--        <url-pattern>/*.jsp</url-pattern>-->
    </filter-mapping>

测试
随便在浏览器输入资源路径
根据注解模式来注册和配置过滤器规则

案例1
使用过滤器完成统一认证的功能。

package com.ykq.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(urlPatterns = "/*")
public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request= (HttpServletRequest) servletRequest;
        HttpServletResponse response= (HttpServletResponse) servletResponse;
        //认证判断
        //1.获取请求资源
        String path = request.getRequestURI();
        //2.获取请求的标识符
        String method = request.getParameter("method");
        //3.判断是否为放行资源---是否为匿名访问资源。
        if("/login.jsp".equals(path)
                || ("/UserServlet".equals(path) && "login".equals(method))
                ||"/register.jsp".equals(path)
                || ("/UserServlet".equals(path)&&"register".equals(method))
        ){
             filterChain.doFilter(request,response);
        }else{
             //登录后允许访问的资源.
            Object user = request.getSession().getAttribute("user"); //获取当前登录者的信息
            if(user!=null){//已经登录
                filterChain.doFilter(request,response);
            }else{
                response.sendRedirect("/login.jsp");
            }
        }
    }

    @Override
    public void destroy() {

    }
}

乱码
设置一个编码过滤器

posted on 2024-12-21 14:56  小木不痞  阅读(31)  评论(0)    收藏  举报

导航