Java Web开发中 的过滤器 ( filter ) 是 从Servlet 2.3规范开始增加 的 功能 , 并在Servlet 2.4规范中得到增强。 对Web应用来说 ,过滤器是 一个驻留在服务器端 的 Web组件 , 它可以截取客户端和服务器之间 的 请求与响应信息 , 并对这些信息进行过滤。
下面是创建一个基本过滤器的过程
首先创建一个类,并且实现Filter接口,这里要注意的是需要导入的是javax.servlet包
并且在类上加上注解@WebFilter(urlPatterns = "/*") urlPatterns指拦截的路径,/*表示所有路径
@WebFilter的常用属性
然后实现Filter接口的init(),doFilter(),destroy()方法
init()方法:初始化方法,加载时调用
destroy()方法:销毁时调用的方法
doFilter()方法:过滤方法
其中filterChain.doFilter(servletRequest,servletResponse);代码是放行的意思,进入下一个过滤器或Servlet。
一个过滤器的基本创建已经完成,下面是用过滤器实现的一个基本登录验证功能
JSP页面代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
登陆界面
LoginServlet页面代码
package xz.servlet;
import xz.service.accountInfoService;
import xz.service.impl.accountServiceImpl;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "LoginServlet", value = "/LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name=request.getParameter("name");//获取用户名
String pwd=request.getParameter("pwd");//获取密码
if(name.equals("admin")&&pwd.equals("admin")){//登录成功
request.getSession().setAttribute("name",name);//将用户名存入Session中
response.sendRedirect("index.jsp");//重定向
}else{//登录失败
request.setAttribute("err","用户名或密码错误!");//提示用户
request.getRequestDispatcher("Login.jsp").forward(request,response);//转发
}
}
}
LoginFilter过滤器页面
package xz.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebFilter("/*")
public class LoginFilter 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 {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String path=request.getServletPath();//获得请求路径
Object name = request.getSession().getAttribute("name");//获取用户名
if(path.indexOf("Login.jsp")==-1){//用户没有通过登录直接进入LoginServlet
if(name==null){//判断是否登录
out.print("");//提示用户并返回登录页面
}
}
//用户通过登录界面进入LoginServlet,则放行,进入LoginServlet
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
System.out.println("销毁");
}
}
执行效果:
用户没有登录直接访问index主页,进入过滤器doFilter()方法进行处理
如果你觉得本文对你有帮助,麻烦动动手指顶一下,可以帮助到更多的开发者,如果文中有什么错误的地方,还望指正,转载请注明转自 AnWen03的博客,谢谢!



