Discuss / Java / 使用DelegatingFilterProxy实现AuthFilter

使用DelegatingFilterProxy实现AuthFilter

Topic source

净净一隅

#1 Created at ... [Delete] [Delete and Lock User]

感觉【web开发】使用fileter的那种不是更方便些,用@WebFilter注解

package com.filter;

import com.entity.User;

import com.service.UserService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

import javax.servlet.*;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.net.URLDecoder;

import java.nio.charset.StandardCharsets;

import java.sql.SQLException;

import java.util.Base64;

import java.util.Map;

@Component

public class AuthFilter implements Filter {

    @Autowired

    UserService userService;

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

            throws IOException, ServletException{

        HttpServletRequest req = (HttpServletRequest) request;

        HttpServletResponse resp=(HttpServletResponse) response;

        // 获取Authorization头:

        String authHeader = req.getHeader("Authorization");

        if (authHeader != null && authHeader.startsWith("Basic ")) {

//base64解码

            byte[] decode= Base64.getDecoder().decode(authHeader.substring(6).replaceAll(" ","+"));

//url解码

            authHeader=URLDecoder.decode(new String(decode),String.valueOf(StandardCharsets.UTF_8));

// 解码后提取email和password:

            String email = prefixFrom(authHeader);

            String password = suffixFrom(authHeader);

            // 登录:

            User user = null;

            Map<String,Object> model= null;

            try {

                user = userService.login(email, password);

                // 放入Session:

                req.getSession().setAttribute("user", user);

            } catch (SQLException e){

                e.printStackTrace();

                resp.sendRedirect("/signin");

                return;

            }catch (RuntimeException e){

                e.printStackTrace();

                resp.sendRedirect("/signin");

                return;

            }catch (Exception e){

                e.printStackTrace();

                resp.sendRedirect("/signin");

                return;

            }

        }

        // 继续处理请求:

        chain.doFilter(req, resp);

    }

    @Override

    public void destroy() {

    }

    public String prefixFrom(String str){

        String[] list=str.split(":");

        return list.length>=1?list[0]:null;

    }

    public String suffixFrom(String str){

        String[] list=str.split(":");

        return list.length>=2?list[list.length-1]:list[0];

    }

}

@WebFilter是来自于jakarta.servlet的包,也就是说使用了@WebFilter其实和在web.xml中配置了一个普通的servlet没有区别,只不过方便配置,但是这里使用了SpringMVC框架的前提,使用filter的关键点就在于servlet容器和IOC容器的交互的问题。一个servlet如果只注册在servlet容器中,那么IOC容器是察觉不到的,比如说encodingFilter,只是用encodingFilter,IOC容器察觉不到也没有关系,但是如果对于某些验证类filter,比如authFilter,需要通过自动装配获取UserService,那么这个filter只能放在IOC容器中,加上@Component表示这是一个Bean,会交给IOC容器进行初始化,但是这样的话servlet又获取不到这个filter了,整个web应用程序的入口在servlet容器。所以springMVC提供了一个类叫做Delagatgingfilterproxy,通过这个类,它会首先在servlet中注册一个filter,然后找到servlet容器中的IOC容器,再找到IOC容器中对应的filter。本质上是代理模式。总的总的来说,javaweb的基础就是servletAPI,对应的提供了常用的servlet,filter,listener,一个web应用程序使用纯servlet开发过于繁琐。所以有了MVC模式。MVC只是一个开发模式。将页面显示,业务逻辑,数据模型分开,然后加上Spring其实就构成SpringMVC。那么SpringMVC框架必然要去适应javaweb的servlet容器。所以像Delegatingfilerproxy和DispatcherServlet都是webmvc包提供的。

。嗯,通过@WebFilter配置还是可以的,这个看个人喜好。配置一个filter

@WebFilter(urlPattern="/*",initParam={@WebInitParam=(name="targetBeanName",value="authFilter")})

public class forauthfilter extends DelegatingFilterProxy(){}

波鲁克

#4 Created at ... [Delete] [Delete and Lock User]

总结的不错


  • 1

Reply