过滤器
什么是过滤器?
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() {
}
}
乱码
设置一个编码过滤器

浙公网安备 33010602011771号