在学习javax.servlet.http包中发现两个类:
HttpServeltRequestWrapper
HttpServletResponseWrapper:
这两个类的方法跟HttpServletRequest/HttpServletResponse的方法基本相同。
可以理解为这两个类是包装类。
可以按照业务需求重写里面的方法,然后将request/response进行包装后,满足具体功能。
实际用例:
过滤中文参数乱码。
具体思路是:
建立filter过滤器和自定义包装类。
在filter过滤的时候对request和response进行过滤和包装,起到让乱码转换成中文的功能。
代码如下:
package demo.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;
import demo.wrapper.MyHttpServletRequestWrapper;
public class ContentTypeFilter implements Filter {
private String charset = "UTF-8";
private FilterConfig config;
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println(config.getFilterName() + "被销毁");
charset = null;
config = null;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
request.setCharacterEncoding(charset);
response.setCharacterEncoding(charset);
//response.setContentType("text/html;charset=UTF-8");
HttpServletRequest req = (HttpServletRequest) request;
if (req.getMethod().equalsIgnoreCase("get")) {
req = new MyHttpServletRequestWrapper(req, charset);
}
System.out.println("----请求被" + config.getFilterName() + "过滤");
chain.doFilter(req, response);
System.out.println("----相应" + config.getFilterName() + "过滤");
}
@Override
public void init(FilterConfig config) throws ServletException {
// TODO Auto-generated method stub
this.config = config;
String charset = config.getServletContext().getInitParameter("charset");
if (charset != null && charset.trim().length() != 0) {
this.charset = charset;
}
}
}
package demo.wrapper;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {
private String charset = "UTF-8";
public MyHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
// TODO Auto-generated constructor stub
}
public MyHttpServletRequestWrapper(HttpServletRequest request,
String charset) {
super(request);
this.charset = charset;
}
@Override
public String getParameter(String name) {
String value = super.getParameter(name);
value = value == null ? null : convert(value);
return value;
}
private String convert(String value) {
System.out.println("编码转换之前:" + value);
try {
return new String(value.trim().getBytes("ISO-8859-1"), charset);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
System.out.println("转换失败");
return value;
}
}
}
<filter>
<filter-name>ContentTypeFilter</filter-name>
<filter-class>demo.filter.ContentTypeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ContentTypeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在完成小例子的时候 要到一个bug就是一直显示乱码。找了半天才发现。
我的包装类的功能实现了。
但是因为没有给jsp和response的ContentType设置utf-8导致的。
response.setContentType("text/html;charset=UTF-8");
分享到:
相关推荐
这是一个关于HttpServletRequestWrapper使用的列子,工作需要,所以传上来的。
NULL 博文链接:https://fishhappy365.iteye.com/blog/484185
NULL 博文链接:https://rensanning.iteye.com/blog/1706208
NULL 博文链接:https://jiaguwen123.iteye.com/blog/714139
继承HttpServletRequestWrapper实现类,重新相关方法,实现自定义增加请求参数,通常是由于需要对参数进行特殊业务处理,然而HttpServletRequest的request.getPrameterMap是不允许修改的(被锁,可查看底层源码),...
XssHttpServletRequestWrapper.java
除了添加两个JsFilter.java和GetHttpServletRequestWrapper.java之外,需要在web.xml添加对应的配置。 <!-- 特殊字符过滤 --> <filter-name>sqlFilter <filter-class>weixin.idea.waiting.cq.controller.Js...
输入转义 对用户输入的所有数据进行拦截,检测是否含有XSS攻击关键字,如果... 方法是实现一个自定义的 HttpServletRequestWrapper ,然后在 Filter 里面调用它,重写getParameter, getParameterValues 函数即可。
继承实现分页的抽象类AbstractPage 的两个抽象方法; 2.调用WebPageUtils.doAction方法传入参数即可 3.直接获取需要满足条件的记录 <br/> 下面举了一个例子来说明使用方法: <br/>package org....
* 从HttpServletRequestWrapper包装类中取出我们要进行转码的request; * * @return */ public HttpServletRequest getHttpServletRequest() { return (HttpServletRequest) super.getRequest(); ...
class Request extends HttpServletRequestWrapper { public Request(HttpServletRequest request) { super(request); } public String toChi(String input) { try { byte[] bytes=...
通用签名SDK源码+使用教程.zip 软件架构说明 双向加密解密:AES,DES3,RSA的工具类 通过继承HttpServletRequestWrapper,配置过滤器的方式实现签名校验 目前只支持post请求类型签名校验 只会对请求体的参数验签 对于...
5.4,public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper 6,服务器白名单校验的java文件: 6.1,public class ServerWhiteListUtil 7,如果不要需要使用服务器白名单功能,那么,注释...
5.4,public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper 6,服务器白名单校验的java文件: 6.1,public class ServerWhiteListUtil 7,如果不要需要使用服务器白名单功能,那么,注释...
request 对象是 HttpServletRequestWrapper 类的实例。它的继承体系如下: _request 对象继承层次结构图.png ServletRequest 接口的唯一子接口是 HttpServletRequest ,HttpServletRequest 接口的唯一实现类 ...
Overview Package Class Tree Deprecated Index Help PREV NEXT FRAMES NO FRAMES A B C D E F G H I J L P R S U V -------------------------------------------------------------------------------- ...
J2EE 类库文档 ...HttpServletRequestWrapper HttpServletResponse HttpServletResponseWrapper HttpSession HttpSessionActivationListener HttpSessionAttributeListener HttpSessionBindingEvent ...
对项目中的所有参数去除前后空格过滤,统一处理参数!可以基于此过滤器实现过滤跨站脚本攻击,参数的增加,...实现原理为重写HttpServletRequestWrapper,获取参数的方法。include和 Forwarded 内部转发不在过滤之内。
javax.servlet.http.HttpServletRequestWrapper javax.servlet.ServletContextAttributeListener javax.servlet.ServletRequestAttributeListener javax.servlet.http.HttpServletResponseWrapper javax.servlet....
org.jasig.cas.client.util.HttpServletRequestWrapperFilter <!-- CAS SINGLE SIGN OUT FILTER --> <filter-name>CAS Single Sign Out Filter org.jasig.cas.client.session.SingleSignOut...