使用filter对请求设置编码
一、复习
加强方法:
1)继承
2)装饰模式
3)动态代理。
使用装饰模式:
1)要求装饰者和被装饰者实现同一个接口或者继承同一个类。
2)装饰者要求被装饰者的引用。
3)对于要加强的方法进行加强,对于不需要的加强,执行原先的方法。
二、需求分析
1)使用filter来对所有的请求进行过滤。需要设置的url-pattern设置成/* 并且位置是在所有的filter的过滤器(filter-mapping)的前面。
2)对原先的方法进行加强。
1、加强的方法---request类-->通过filter的放行方法 重写request。
自己写的版本:
package jd.com.coding; import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @WebFilter(filterName = "FilterAllSeting")
public class FilterAllSeting implements Filter {
public void destroy() {
} public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest re=(HttpServletRequest) req;
HttpServletResponse res=(HttpServletResponse) resp;
chain.doFilter(new SetCoding(re), resp);
} public void init(FilterConfig config) throws ServletException {
} } class SetCoding extends HttpServletRequestWrapper{
private HttpServletRequest request; public SetCoding(HttpServletRequest request){
super(request);
this.request=request;
} @Override
public String getParameter(String name) {
String method=request.getMethod();
String val=request.getParameter(name);
if( method.equalsIgnoreCase("get"))
{ try {
return new String(val.getBytes("ISO_8859_1"), "UTF-8");
}catch (IOException ex){
ex.printStackTrace();
}
} else if(method.equalsIgnoreCase("POST")){
try {
request.setCharacterEncoding("utf-8");
}catch (IOException ex){
ex.printStackTrace();
} }
return super.getParameter(name);
}
}
最终版本:
package cn.itcast.web.filter; import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map; 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 javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
/**
* 统一编码
* @author Administrator
*
*/
public class EncodingFilter implements Filter { @Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub } @Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
//1.强转
HttpServletRequest request=(HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse) resp; //2.放行
chain.doFilter(new MyRequest(request), response);
} @Override
public void destroy() {
// TODO Auto-generated method stub } }
class MyRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;
private boolean flag=true; public MyRequest(HttpServletRequest request) {
super(request);
this.request=request;
} @Override
public String getParameter(String name) {
if(name==null || name.trim().length()==){
return null;
}
String[] values = getParameterValues(name);
if(values==null || values.length==){
return null;
} return values[];
} @Override
/**
* hobby=[eat,drink]
*/
public String[] getParameterValues(String name) {
if(name==null || name.trim().length()==){
return null;
}
Map<String, String[]> map = getParameterMap();
if(map==null || map.size()==){
return null;
} return map.get(name);
} @Override
/**
* map{ username=[tom],password=[123],hobby=[eat,drink]}
*/
public Map<String,String[]> getParameterMap() { /**
* 首先判断请求方式
* 若为post request.setchar...(utf-8)
* 若为get 将map中的值遍历编码就可以了
*/
String method = request.getMethod();
if("post".equalsIgnoreCase(method)){
try {
request.setCharacterEncoding("utf-8");
return request.getParameterMap();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else if("get".equalsIgnoreCase(method)){
Map<String,String[]> map = request.getParameterMap();
if(flag){
for (String key:map.keySet()) {
String[] arr = map.get(key);
//继续遍历数组
for(int i=;i<arr.length;i++){
//编码
try {
arr[i]=new String(arr[i].getBytes("iso8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
flag=false;
}
//需要遍历map 修改value的每一个数据的编码 return map;
} return super.getParameterMap();
} }
使用filter对请求设置编码的更多相关文章
- UrlConnection doPost Https请求 、编码设置
UrlConnection doPost Https请求 .编码设置 UrlConnection doPost方法 /** * 发送POST请求 * * @param url 请求地址url * @p ...
- 使用filter统一设置编码
1.写一个类EncodingFilter.java,实现javax.servlet.Filter(文件命名做到见名知意) package com.filter; import java.io.IOEx ...
- 详解Spring中的CharacterEncodingFilter--forceEncoding为true在java代码中设置失效--html设置编码无效
在项目中有很多让人头疼的问题,其中,编码问题位列其一,那么在Spring框架中是如何解决从页面传来的字符串的编码问题的呢?下面我们来看看Spring框架给我们提供过滤器CharacterEncodin ...
- {Django基础七之Ajax} 一 Ajax简介 二 Ajax使用 三 Ajax请求设置csrf_token 四 关于json 五 补充一个SweetAlert插件(了解)
Django基础七之Ajax 本节目录 一 Ajax简介 二 Ajax使用 三 Ajax请求设置csrf_token 四 关于json 五 补充一个SweetAlert插件(了解) 一 Ajax简介 ...
- Java Servlet (1) —— Filter过滤请求与响应
Java Servlet (1) -- Filter过滤请求与响应 版本: Java EE 6 参考来源: Oracle:The Java EE 6 Tutorial: Filtering Reque ...
- java:(设置编码集,密码的加密,JSTL,EL表达式,权限设置)
1.设置编码集: package cn.zzsxt.lee.web.sevlet; import java.io.IOException; import javax.servlet.ServletEx ...
- {Django基础七之Ajax} 一 Ajax简介 二 Ajax使用 三 Ajax请求设置csrf_token 四 关于json 五 补充一个SweetAlert插件(了解)
{Django基础七之Ajax} 一 Ajax简介 二 Ajax使用 三 Ajax请求设置csrf_token 四 关于json 五 补充一个SweetAlert插件(了解) Django基础七之 ...
- MySql_设置编码
1.查看mysql编码(默认latin1) show variables like 'collation_%'; +--------------------------+--------------- ...
- QWebEngineView拦截Url请求设置
QWebEngineView拦截Url请求设置 QWebEngineUrlRequestInterceptor类提供了一个拦截URL请求抽象基类,可通过实现QWebEngineUrlRequestIn ...
随机推荐
- HDU4417(SummerTrainingDay08-N 主席树)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- Codeforces787D(SummerTrainingDay06-D 线段树+最短路)
D. Legacy time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- Linux 操作方法(一)
cd +地址 ->可进入地址 cd .. ->返回上级 ll ->显示当前目录下的所有文件(显示所有文件,包括隐藏,还有显示文件信息) ls ->显示当前目录下的所有文件 su ...
- JSP内置对象——application对象
下面来举个具体的实例: 运行结果: 其中,city,postcode,email是我自己保存的属性名称,然后最后一行还获取到了当前JSP或者SERVLET的引擎名及版本号.
- Laravel安装教程
1.Call to undefined function Illuminate\Encryption\openssl_cipher_iv_length() 报这个错是因为Apache/bin目录下 l ...
- selenium 校验文件下载成功
转自: http://www.seleniumeasy.com/selenium-tutorials/verify-file-after-downloading-using-webdriver-jav ...
- http请求工具-OkHttp用法
OKHttp介绍 okhttp是一个第三方类库,用于android中请求网络.这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCan ...
- Prometheus Node_exporter 之 Network Netstat TCP Linux MIPs
Network Netstat TCP Linux MIPs1. TCP Aborts / Tiemouts type: GraphUnit: shortLabel: ConnectionsTCPAb ...
- 调用百度翻译API接口功能
public string appid = "自己的APPID"; public string q = "要翻译的文本"; "; public str ...
- USB 相关笔记
1分析已有代码项目 Android从USB声卡录制高质量音频-----使用libusb读取USB声卡数据 github 项目:usbaudio-android-demo usb声卡取数据项目也是参考的 ...