在Java框架中,常见的几个过滤器包括:
今天我们来具体看看这几个过滤器的使用和区别。
JSP过滤器是在JSP页面生成之前或之后执行的一种过滤器,它可以对请求进行拦截、处理和转发,还可以对响应进行修改和过滤。使用JSP过滤器可以实现很多功能,例如字符编码转换、登录验证、请求日志记录等。
图——来自菜鸟教程 JSP过滤器的实现需要实现javax.servlet.Filter接口,该接口定义了三个方法:
在web.xml中进行配置
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
MyFilter是自定义的过滤器类名,/*表示对所有的请求进行过滤处理。
常见的JSP过滤器包括:
我们挑一个写一下案例:登录验证过滤器
public class LoginFilter implements Filter {
private FilterConfig filterConfig = null;
private String loginPage = null;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.loginPage = filterConfig.getInitParameter("loginPage");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = req.getSession(false);
String requestURI = req.getRequestURI();
if (session == null || session.getAttribute("user") == null) {
res.sendRedirect(req.getContextPath() + loginPage + "?redirect=" + requestURI);
} else {
chain.doFilter(req, res);
}
}
public void destroy() {
this.filterConfig = null;
}
}
loginPage是登录页面的URL,可以通过web.xml文件进行配置。在doFilter方法中,首先获取当前请求的HttpSession对象,然后判断用户是否已经登录,如果未登录则将请求重定向到登录页面,否则将请求传递给下一个过滤器或Servlet处理。
web.xml中的配置:
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.example.LoginFilter</filter-class>
<init-param>
<param-name>loginPage</param-name>
<param-value>/login.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/secure/*</url-pattern>
</filter-mapping>
LoginFilter是自定义的过滤器类名,loginPage是登录页面的URL,/secure/*表示只对以/secure开头的URL进行过滤处理。
Spring Boot中的过滤器是通过实现javax.servlet.Filter接口来实现的。具体来说,需要编写一个类,实现doFilter、init和destroy方法,然后在Spring Boot应用程序中配置该过滤器即可,下面我们来看一个案例。
@Component
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;
// 判断用户是否已登录
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("user") == null) {
// 用户未登录,跳转到登录页面
response.sendRedirect("/login");
} else {
// 用户已登录,放行请求
filterChain.doFilter(request, response);
}
}
@Override
public void destroy() {
// 销毁方法
}
}
在配置登录过滤器时,需要将登录页面和登录控制器的请求路径排除在过滤器拦截范围之外,否则会出现登录页面无限重定向的问题。可以使用注解@WebFilter的urlPatterns属性或在配置类中使用FilterRegistrationBean的addUrlPatterns方法来设置过滤器拦截的URL路径。
这个其实和上面俩个基本是一样的,这个是基本。
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;
// 判断用户是否已登录
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("user") == null) {
// 用户未登录,跳转到登录页面
response.sendRedirect("/login");
} else {
// 用户已登录,放行请求
filterChain.doFilter(request, response);
}
}
@Override
public void destroy() {
// 销毁方法
}
}
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.example.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
使用<url-pattern标签设置过滤器拦截的URL路径
Struts中的拦截器是通过实现org.apache.struts2.interceptor.Interceptor接口来实现的。
public class LoginInterceptor implements Interceptor {
@Override
public void init() {
// 初始化方法
}
@Override
public void destroy() {
// 销毁方法
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
// 判断用户是否已登录
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("user") == null) {
// 用户未登录,跳转到登录页面
return "login";
} else {
// 用户已登录,放行请求
return invocation.invoke();
}
}
}
<interceptors>
<interceptor name="loginInterceptor" class="com.example.LoginInterceptor"/>
<interceptor-stack name="defaultStack">
<interceptor-ref name="loginInterceptor"/>
<interceptor-ref name="basicStack"/>
</interceptor-stack>
</interceptors>
如果本文对你有所帮助,还请三连支持一下博主!