使用过滤器不能改变HttpServletRequest对象的参数确实大大缩减了filter的应用范围,幸运的是,可以通过使用装饰模式来改变其状态
下面就是一个HttpServletRequest装饰类的样例:
一个删除空白字符的Filter
通过实现一个删除空白字符的filter,来演示如何使用javax.servlet.http.HttpServletRequestWrapper类来装饰HttpServletRequest对象,在本例中,这个filter将删除所传来的参数中多余的空白字符,这在许多servlet/JSP应用中是很有用的,包括Struts及JavaServer Faces等应用。例如,Struts通过调用HttpServletRequest对象的getParameterValues()对象来处理action表单。通过覆盖装饰类中此方法,你可以改变当前HttpServletRequest对象的状态。要创建HttpServletRequest的装饰类,需要继承HttpServletRequestWrapper并且覆盖希望改变的方法。
package trimmer.filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public final class MyRequestWrapper extends HttpServletRequestWrapper {
public MyRequestWrapper(HttpServletRequest servletRequest) {
super(servletRequest);
}
public String[] getParameterValues(String parameter) {
String[] results = super.getParameterValues(parameter);
if (results == null)
return null;
int count = results.length;
String[] trimResults = new String[count];
for (int i = 0; i < count; i++) {
trimResults[i] = results[i].trim();
}
return trimResults;
}
}
filter
package trimmer.filter;
import java.io.IOException;
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;
public class MyFilter implements Filter {
private FilterConfig filterConfig;
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter initialized");
this.filterConfig = filterConfig;
}
public void destroy() {
System.out.println("Filter destroyed");
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
chain.doFilter(new MyRequestWrapper((HttpServletRequest) request),
response);
}
}
web.xml
<filter>
<filter-name>TrimmerFilter</filter-name>
<filter-class>trimmer.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TrimmerFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
启动这个应用后,在表单中输入一些值,提交表单,看看这个filter是如何修整输入数值的。这是一个实用的装饰模式的应用。
分享到:
相关推荐
在Java Web开发中,`HttpServletRequestWrapper` 是一个非常重要的工具,它允许我们在过滤器(Filter)中对HTTP请求(Request)进行拦截和修改。...通过学习和实践这些知识点,开发者可以提高其在Web应用开发中的能力。
过滤链包含了如`HttpServletRequestWrapper`、`UsernamePasswordAuthenticationFilter`等,它们负责处理请求,进行身份验证和授权。 接下来是`ch02`,这个章节可能会涉及Spring Security的认证过程。Spring ...
根据给定的文件信息,我们可以提炼出与IT...以上知识点不仅涵盖了310-084考试的主要内容,也深入探讨了Java Web开发中的一些核心概念和技术细节,对于准备该认证的IT专业人士而言,具有很高的学习价值和实践指导意义。
**描述**:本练习资源旨在帮助学习者检测自己在Java 2平台企业版(J2EE)方面掌握的程度,并找出可能存在的知识盲点。 #### 知识点一:关于Tag Files的真实陈述 1. **经典标签处理器与标签文件共存性**:经典标签...
关键过滤器包括 `DelegatingFilterProxy`、`HttpServletRequestWrapper` 和 `FilterSecurityInterceptor`。通过分析示例代码,我们可以了解每个过滤器的作用和它们如何协同工作。 4. **配置**:Spring Security ...
- Spring Security通过一系列过滤器链(Filter Chain)来处理请求,如`HttpServletRequestWrapper`和`HttpServletRequestFilter`。 5. **错误处理** - 定义未认证和未授权的处理页面,例如401和403错误页面。 6....
例如,`HttpServletRequestWrapper`过滤器用于包装请求,`UsernamePasswordAuthenticationFilter`处理登录请求,`AnonymousAuthenticationFilter`处理匿名用户,`RememberMeAuthenticationFilter`处理记住我功能,`...
例如,`HttpServletRequestWrapperFilter`用于包装请求,`UsernamePasswordAuthenticationFilter`处理登录请求,`AnonymousAuthenticationFilter`为未认证用户提供匿名身份,`ExceptionTranslationFilter`处理安全...
6. **SecurityContextHolderAwareRequestFilter**:将 SecurityContextHolder 的信息转换为 HttpServletRequestWrapper 的属性,以便于其他过滤器或控制器访问。 **配置 Spring Security** Spring Security 的配置...
5. 装饰器模式:在J2EE中,装饰器模式常用于动态地给对象添加新的行为或责任,例如HttpServletRequestWrapper和HttpServletResponseWrapper。 6. 适配器模式:在与不同标准或接口进行集成时,适配器模式可以帮助...
首先,创建XssHttpServletRequestWrapper类继承自HttpServletRequestWrapper。在这个类中,需要重写getParameter()、getParameterValues()和getHeader()等方法,以确保对请求中的参数、参数值和请求头进行清理,防止...
例如,`HttpServletRequestWrapper`被用来包装原始请求,以便在请求处理之前或之后进行修改。 4. **角色与权限**:Spring Security支持角色和权限的概念,可以将权限分配给不同的角色。这使得你可以设置细粒度的...
每个过滤器都有特定的任务,如`HttpServletRequestWrapper`用于包装请求,`DelegatingFilterProxy`用于委托到Spring的Bean。 2. **Authentication Manager**:负责处理认证请求,可以自定义认证策略,例如基于...
过滤器链包含多个预定义的过滤器,如`HttpServletRequestWrapperFilter`、`AnonymousAuthenticationFilter`、`RememberMeAuthenticationFilter`等,它们按顺序执行,处理身份验证、会话管理、CSRF保护等功能。...
每个过滤器都有特定的任务,如`HttpServletRequestWrapperFilter`用于包装请求,`DelegatingFilterProxy`用于委托给Spring Bean。 5. **访问决策管理器(Access Decision Manager)**:这个组件负责决定用户是否...
这通常通过过滤器(Filter)来实现,例如在JSP应用中使用`HttpServletRequestWrapper`。 4. **安全考虑**:SSO系统必须确保票据的安全性,防止中间人攻击。通常采用HTTPS协议加密通信,并且对票据进行签名,以验证...
如`HttpServletRequestWrapper`、`FilterSecurityInterceptor`等。 - **AuthenticationManager**:管理认证过程,处理登录请求,验证用户凭证。 - **AccessDecisionManager**:负责授权决策,根据安全配置和用户...
每个过滤器都有特定的职责,如`HttpServletRequestWrapper`、`DelegatingFilterProxy`等。 2. **配置** - **XML配置**: 传统的Spring Security配置方式,通过XML文件设置安全规则,定义过滤器链和安全元数据。 - ...
这些过滤器包括`DelegatingFilterProxy`(用于配置Spring Security过滤器链)、`HttpServletRequestWrapper`(用于修改请求)和`FilterSecurityInterceptor`(执行访问决策)等。 2. **认证**: 用户尝试访问受保护...