Web三大组件之Filter, Listener和Servlet,是Java Web应用程序开发中不可缺少的三个组件。Servlet是用于处理请求的Java类,Listener是用于监听Web应用程序的状态变化的组件,而Filter是用于对请求和响应进行过滤处理的组件。
Filter详解
Filter是对请求和响应进行过滤处理的组件。它可以对请求参数、请求头、请求URL进行修改或拦截。Filter是在Servlet容器加载Servlet之前进行拦截处理的,与Servlet是一样级别的组件,不需要在web.xml配置中指定Filter,只需要在Filter类中使用@WebFilter()
注解即可。
示例1:过滤敏感词汇
@WebFilter(filterName = "SensitiveWordFilter", urlPatterns = {"/*"})
public class SensitiveWordFilter implements Filter {
private static final Logger logger = LoggerFactory.getLogger(SensitiveWordFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.info("SensitiveWordFilter init...");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String uri = request.getRequestURI();
if (uri.contains("sensitiveWord")) {
String content = request.getParameter("content");
String filter = "敏感词汇1,敏感词汇2,敏感词汇3"; // 假设这是过滤的词汇
String[] filters = filter.split(",");
for (String s : filters) {
content = content.replaceAll(s, "**");
}
request.setAttribute("content", content);
}
chain.doFilter(request, response);
}
@Override
public void destroy() {
logger.info("SensitiveWordFilter destroy...");
}
}
在上面的代码中,实现了对请求参数中包含特定关键字的拦截处理,将敏感词汇替换为**。
示例2:跨域请求
@WebFilter(filterName = "CorsFilter", urlPatterns = {"/*"})
public class CorsFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CorsFilter init...");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) resp;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept, X-Requested-With, remember-me");
chain.doFilter(req, resp);
}
@Override
public void destroy() {
System.out.println("CorsFilter destroy...");
}
}
在上面的代码中,实现了对跨域请求的拦截处理,允许前端发送跨域请求。
Listener详解
Listener是监听Web应用程序状态变化的组件,包括ServletRequest、HttpSession、ServletContext等的生命周期事件。Listener是一种特殊的Java类,需要实现Servlet规范中的javax.servlet.ServletContextListener、javax.servlet.http.HttpSessionListener、javax.servlet.ServletRequestListener等接口,用@WebListener()
标识。
示例1:监听Servlet上下文
@WebListener
public class MyServletContextListener implements ServletContextListener {
private static final Logger logger = LoggerFactory.getLogger(MyServletContextListener.class);
@Override
public void contextInitialized(ServletContextEvent sce) {
logger.info("ServletContextListener contextInitialized...");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
logger.info("ServletContextListener contextDestroyed...");
}
}
在上面的代码中,实现了对Servlet上下文状态变化的监听,包括ServletContext的初始化和销毁事件。
示例2:监听HttpSession
@WebListener
public class MySessionListener implements HttpSessionListener {
private static final Logger logger = LoggerFactory.getLogger(MySessionListener.class);
@Override
public void sessionCreated(HttpSessionEvent se) {
logger.info("SessionListener sessionCreated...");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
logger.info("SessionListener sessionDestroyed...");
}
}
在上面的代码中,实现了对HttpSession状态变化的监听,包括HttpSession的创建和销毁事件。
Servlet详解
Servlet是用于处理请求的Java类。它是一种基于Java的Web组件,用于扩展Web服务器的能力。实现Servlet需要扩展javax.servlet.http.HttpServlet类,同时需要在web.xml中进行配置。
示例1:Hello World Servlet
@WebServlet(name = "HelloWorldServlet", value = "/hello")
public class HelloWorldServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h3>Hello World Servlet!</h3>");
out.println("</body></html>");
}
}
在上面的代码中,实现了简单的Hello World Servlet,当浏览器请求/hello URL时,返回一个简单的HTML页面。
示例2:文件上传Servlet
@WebServlet(name = "FileUploadServlet", urlPatterns = {"/fileUpload"})
@MultipartConfig(location = "D:/temp")
public class FileUploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
String savePath = request.getServletContext().getRealPath("/upload");// 上传文件存储目录
File saveDir = new File(savePath);
if (!saveDir.exists() && !saveDir.isDirectory()) {
saveDir.mkdir();
}
// 消息提示
String message = "";
try {
Part part = request.getPart("file");// 获取上传文件
String fileName = getFileName(part);// 文件名
part.write(savePath + "\\" + fileName);
message = "文件上传成功!";
} catch (Exception e) {
e.printStackTrace();
message = "文件上传失败!";
}
request.setAttribute("message", message);
request.getRequestDispatcher(request.getContextPath() + "/index.jsp").forward(request, response);
}
// 获取文件名
private String getFileName(Part part) {
String header = part.getHeader("content-disposition");
String[] arr = header.split(";");
for (String s : arr) {
if (s.trim().startsWith("filename")) {
return s.substring(s.indexOf("=") + 2, s.length() - 1);
}
}
return "";
}
}
在上面的代码中,实现了一个文件上传Servlet,使用了@MultipartConfig
注解来配置文件上传的存储位置,当有文件上传时,将其保存到指定目录,并返回上传成功或失败的消息提示。
综上所述,Filter, Listener和Servlet是Java Web应用程序开发中不可缺少的三大组件。通过本文的介绍,相信您已经了解了它们的作用和使用方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Web三大组件之Filter,Listener和Servlet详解 - Python技术站