使用DelegatingFilterProxy实现AuthFilter
Topic source@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(){}
- 1
净净一隅
感觉【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];
}
}