过滤器实战代码讲解

package com.gaze.filter;

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

@WebFilter(filterName = "LoginFilter", urlPatterns = {"/user/*", "/order/*"}, initParams = {
        @WebInitParam(name = "login_url", value = "login.jsp"),
        @WebInitParam(name = "encoding", value = "UTF-8")
})
public class LoginFilter implements Filter {
    private FilterConfig filterConfig;
    private String encoding;
    private String loginPage;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CustomFilter init ");
        this.filterConfig = filterConfig;
        this.encoding = filterConfig.getInitParameter("encoding");
        this.loginPage = filterConfig.getInitParameter("login_url");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("CustomFilter doFilter ");
        request.setCharacterEncoding(encoding);
        response.setCharacterEncoding(encoding);
        response.setContentType("text/html;charset=utf-8");
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse =
                (HttpServletResponse) response;
//session⾥里里⾯面有⽤用户信息
        if (httpServletRequest.getSession().getAttribute("loginUser") != null) {
            chain.doFilter(request, response);
        } else {
            httpServletRequest.setAttribute("msg", "⾮非法访问,请登录");
            httpServletRequest.getRequestDispatcher(loginPage).forward(
                    httpServletRequest, httpServletResponse);
        }
    }

    @Override
    public void destroy() {
        System.out.println("CustomFilter destroy ");
        Filter.super.destroy();
    }
}
@WebFilter(filterName = "LoginFilter", urlPatterns = {"/user/*", "/order/*"}, initParams = {
        @WebInitParam(name = "login_url", value = "login.jsp"),
        @WebInitParam(name = "encoding", value = "UTF-8")
})
  1. @WebFilter:这是一个注解,用于声明一个过滤器。它告诉Servlet容器这个类是一个过滤器。

  2. filterName = "LoginFilter":这是过滤器的名称。在这个例子中,过滤器的名称被设置为"LoginFilter"。

  3. urlPatterns = {"/user/*", "/order/*"}:这个属性定义了过滤器应该拦截哪些URL模式。在这个例子中,过滤器会拦截所有以"/user/“和”/order/"开头的请求。

  4. initParams = { ... }:这个属性用于定义初始化参数,这些参数可以在过滤器初始化时使用。

    • @WebInitParam(name = "login_url", value = "login.jsp"):这是一个初始化参数,它的名字是"login_url",值是"login.jsp"。这意味着如果用户未登录尝试访问被拦截的URL,过滤器可以将用户重定向到"login.jsp"页面。

    • @WebInitParam(name = "encoding", value = "UTF-8"):这是另一个初始化参数,它的名字是"encoding",值是"UTF-8"。这通常用于设置请求和响应的字符编码。

@Override
public void init(FilterConfig filterConfig) throws ServletException {
    System.out.println("CustomFilter init ");
    this.filterConfig = filterConfig;
    this.encoding = filterConfig.getInitParameter("encoding");
    this.loginPage = filterConfig.getInitParameter("login_url");
}
  1. 存储配置信息filterConfig 变量用于存储过滤器的配置信息。这些信息通常在Web应用程序的部署描述符(web.xml)或者通过注解(如 @WebFilter)中指定。

  2. 获取初始化参数:通过 filterConfig 对象,可以在过滤器的 init 方法中获取初始化参数。这些参数在过滤器初始化时设置,可以在整个过滤器生命周期中使用

  3. 获取过滤器名称:可以通过 filterConfig 获取在部署描述符中指定的过滤器名称。

  4. String filterName = filterConfig.getFilterName();

  5. 获取ServletContextfilterConfig 提供了一个方法来获取 ServletContext 对象,该对象代表了Web应用程序的上下文。

  6. ServletContext context = filterConfig.getServletContext();
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;

public interface A {
    void eat();
}

package com.gaze.test;

public interface B extends A{

}
    /**
         * 向上转型是指将一个子类型(在这里是 B)的对象转换为父类型(在这里是 A)的引用。向上转型总是安全的,因为子类型保证实现了父类型的所有方法。
         *
         */
              B b =  new ImpB();
            //向上转型不需要显示转换
              A a = b;
        //向下转型是指将一个父类型(在这里是 A)的对象转换为子类型(在这里是 B)的引用。向下转型是不安全的,因为父类型的对象可能并不是子类型的实例
              B b = (B) new ImpA();
              
  1. 为什么要进行类型转换

    • 访问HTTP特定的功能HttpServletRequest 和 HttpServletResponse 接口提供了对HTTP协议特定功能的访问,这些功能超出了 ServletRequest 和 ServletResponse 接口提供的通用功能。例如,HttpServletRequest 提供了访问HTTP请求头、cookies、请求参数、会话管理等功能。同样,HttpServletResponse 提供了设置HTTP状态码、HTTP响应头、重定向等功能。
    • 代码清晰性:通过显式地转换到 HttpServletRequest 和 HttpServletResponse,代码的意图更加明确,表明你打算处理HTTP请求和响应。

子类实现父类更多功能,应该把父类转子类处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值