內容提要:創建一個Servlet過濾器,使用過濾器進行過濾http請求。
正文:
第一步,編寫一個Filter。(帶註釋)
package com.marks.javaweb.servlet;
/**
* author @marks
*/
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
/**
* Servlet Filter implementation class NoteFilter
*/
public class NoteFilter implements Filter {
private FilterConfig config = null;
private String blacklist = null;
/**
* Default constructor.
*/
public NoteFilter() {
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// Filter跟web应用一起启动
System.out.println("NoteFilter initing...");
// 初始化Filter时,调用config.getInitParameter()方法,从web.xml文件中读取初始化参数blacklist
this.config = fConfig;
blacklist = this.config.getInitParameter("blacklist");
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// 当web应用重新启动或销毁时,Filter也被销毁
System.out.println("NoteFilter destroying...");
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 从request对象中读取用户名,并转化成中文字符编码
String userName = ((HttpServletRequest) request)
.getParameter("userName");
if (userName != null) {
userName = new String(userName.getBytes("ISO-8859-1"), "GB2312");
}
//若用户名被包含在黑名单中,则直接返回一个拒绝网页
if (userName != null && userName.indexOf(blacklist) != -1) {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html><head></head></html>");
out.println("<h1>对不起," + userName + ",你没有权限留言.</h1>");
out.flush();
return;
}
//用户名没有被包含在黑名单中,则调用chain.doFilter()方法,进行转发
long before = System.currentTimeMillis();
config.getServletContext().log("NoteFilter:before call chain.doFilter()");
// pass the request along the filter chain: 轉發
chain.doFilter(request, response);
config.getServletContext().log("NoteFilter:after call chain.doFilter()");
long after = System.currentTimeMillis();
String name = "";
if (request instanceof HttpServletRequest) {
name = ((HttpServletRequest) request).getRequestURI();
}
config.getServletContext().log("NoteFilter:" + name + ":" + (after - before) + "ms");
}
}
第二步:在web.xml中配置發佈過濾器。
<filter>
<display-name>NoteFilter</display-name>
<filter-name>NoteFilter</filter-name>
<filter-class>com.marks.javaweb.servlet.NoteFilter</filter-class>
<init-param>
<param-name>blacklist</param-name>
<param-value>黑客</param-value> //黑名單為:黑客
</init-param>
</filter>
<filter-mapping>
<filter-name>NoteFilter</filter-name>
<url-pattern>/*</url-pattern> //對所用請求進行過濾
</filter-mapping>
第三步:測試效果。
1.不符合過濾條件的請求,進行轉發:
2.符合過濾條件,進行攔截:
- 大小: 22.2 KB
- 大小: 19.4 KB
分享到:
相关推荐
- 创建一个过滤器,检查用户名是否符合特定规则(例如第一个字符不能是数字、不能包含空格、长度在8-16个字符之间)。 - 如果不符合规则,则阻止请求继续传递给Servlet,并返回错误信息给客户端。 2. **解决乱码...
Servlet技术是Java EE(之前称为J2EE)中用于构建动态Web应用程序的核心技术之一,它允许...随着学习的深入,你还将了解到过滤器(Filter)、监听器(Listener)等高级特性,进一步提升Web应用的灵活性和可维护性。
随后,随着Servlet 3.0版本的发布,过滤器技术继续获得增强,新特性包括异步处理、注解支持和可插拔性支持等,这些都进一步简化了Java Web应用的开发和部署过程。 过滤器技术的核心是Filter接口,该接口定义了三个...
总结来说,【新闻发布系统(jsp-servlet-javabean)】是一个基于经典Java Web技术构建的简单应用,通过Servlet、JSP和JavaBean实现了新闻的CRUD操作,并借助MySQL数据库存储数据。这种系统设计易于理解和维护,对于...
Servlet 2.5是Java Servlet规范的一个版本,它在2006年发布,是对Servlet 2.4的升级,引入了一些新特性以提升Web应用的开发效率和灵活性。在这个源码包中,你将能够深入理解Servlet的工作原理以及如何在实际开发中...
- 支持注解(Annotation),简化了Servlet、过滤器和监听器的配置。 - 引入了统一的表达式语言(EL,Expression Language),简化了从JSP页面访问JavaBean属性。 - 提供了更强大的过滤器链和会话管理功能。 总之...
Servlet 2.5是Java Servlet技术的一个重要版本,它在2006年发布,是Java EE 5规范的一部分。这个版本对之前的Servlet规范进行了增强和优化,为Web开发提供了更多的功能和灵活性。以下是Servlet 2.5的一些关键知识点...
Servlet是Java编程语言中的一个接口,由Java Servlet API提供,它允许程序员创建能够处理HTTP请求的服务器端程序。Servlet 2.4 API是Java Servlet规范的第三个版本,发布于2003年,它在Servlet 2.3的基础上增加了新...
本项目“S2 使用JSP/Servlet技术开发新闻发布系统”就是这样一个示例,它旨在帮助开发者理解如何利用这两种技术来创建功能完备的新闻发布平台。 【描述】:“S2 使用JSP/Servlet技术开发新闻发布系统,希望可以帮助...
这个版本发布于2006年,是Servlet技术的一个关键里程碑,为开发者提供了更强大和灵活的服务器端编程能力。下面将详细讨论Java Servlet API 2.5中的核心概念和特性。 1. **Servlet接口**:Servlet是Java编程语言中的...
- **单线程模型和多线程模型**:Servlet可以配置为每个请求创建一个新的Servlet实例(单线程模型),或者所有请求共享同一个Servlet实例(多线程模型)。单线程模型更安全,但效率较低;多线程模型则相反。 4. **...
#### 三、创建和发布Servlet过滤器 1. **实现接口**:所有Servlet过滤器都必须实现`javax.servlet.Filter`接口,其中包含了三个核心方法:`init()`、`doFilter()`和`destroy()`。 - `init(FilterConfig config)`:...
- **web-fragment元素**:为了支持这种模块化结构,Servlet 3.0引入了一个新的元素`<web-fragment>`,它可以用来定义Servlet、过滤器和监听器等组件。例如: ```xml <servlet> <servlet-name>name</servlet-...
3. **Servlet-API 2.4**:发布于2002年,这个版本对Filter和Listener的API进行了增强,增加了更多预定义的监听器接口。同时,它改进了部署描述符(web.xml)的结构,使其更加模块化和可扩展。此外,2.4版还支持了...
Servlet 2.5是Java Servlet规范的一个版本,它在2006年发布,是对Servlet 2.4的升级,提供了许多新特性和改进。这个版本的Servlet规范是基于Java EE 5平台的,旨在提高Web应用程序的开发效率和可维护性。下面将详细...
4. **部署描述符(web.xml)**:解释如何在`web.xml`文件中配置Servlet,包括Servlet的映射、初始化参数、过滤器和监听器等。 5. **Servlet容器**:讨论Servlet运行的环境——Servlet容器(如Tomcat、Jetty等),...
3. **过滤器(Filters)**:Servlet 2.3引入了过滤器的概念,允许开发者在请求到达Servlet之前对请求和响应进行拦截、修改或转发。过滤器可以用来实现认证、字符集转换、内容压缩等多种功能。 4. **注解...
在本源码包中,我们很可能是得到了Servlet 2.5版本的源代码,这是一个重要的里程碑版本,它在2006年发布,引入了许多新特性和改进。 1. **Servlet接口**:Servlet的核心接口是`javax.servlet.Servlet`,它定义了...
2. **过滤器(Filter)**:过滤器是一个强大的工具,允许在请求到达Servlet之前或响应离开Servlet之后对请求和响应进行拦截和处理。过滤器可以用于内容转换、登录检查、日志记录等多种用途,极大地增强了Web应用的...