前言:
眼前朋友们对“java的过滤器获取请求参数”大约比较关注,同学们都需要知道一些“java的过滤器获取请求参数”的相关知识。那么小编在网络上网罗了一些有关“java的过滤器获取请求参数””的相关知识,希望同学们能喜欢,你们快快来了解一下吧!Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:比如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。比如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
一、实现拦截器
import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import java.io.IOException;public class ParamsFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) servletRequest; ParamsRequestWrapper requestWrapper = new ParamsRequestWrapper(httpRequest); filterChain.doFilter(requestWrapper, servletResponse); } @Override public void destroy() { }}
二、继承HttpServletRequestWrapper
import com.alibaba.fastjson.JSON;import lombok.extern.slf4j.Slf4j;import org.apache.commons.io.IOUtils;import org.apache.commons.lang3.StringUtils;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import java.io.ByteArrayInputStream;import java.io.IOException;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;@Slf4jpublic class ParamsRequestWrapper extends HttpServletRequestWrapper { private Map<String, String[]> params = new HashMap<>(); private static final String ENCODING = "UTF-8"; private static final String CLASSTYPE = "java.lang.String"; public ParamsRequestWrapper(HttpServletRequest request) { super(request); // 将参数表,赋予给当前的Map以便于持有request中的参数 Map<String, String[]> requestMap = request.getParameterMap(); this.params.putAll(requestMap); this.modifyParameters(); if(!params.isEmpty()){ log.info("请求参数:" + JSON.toJSONString(params)); } } /** * 重写getInputStream方法 post请求参数必须通过流才能获取到值 */ @Override public ServletInputStream getInputStream() throws IOException { ServletInputStream stream = super.getInputStream(); //非json类型,直接返回 if (!super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)) { return stream; } String json = IOUtils.toString(stream, ENCODING); if (StringUtils.isBlank(json)) { return stream; } Map<String, Object> map = modifyParams(json); ByteArrayInputStream bis = new ByteArrayInputStream(JSON.toJSONString(map).getBytes(ENCODING)); return new ParamsServletInputStream(bis); } private static Map<String, Object> modifyParams(String json) { Map<String, Object> params = JSON.parseObject(json); Map<String, Object> maps = new HashMap<>(params.size()); for (String key : params.keySet()) { Object value = getValue(params.get(key)); maps.put(key, value); } return maps; } private static Object getValue(Object obj) { if (obj == null) { return null; } if(obj.equals("undefined,undefined")){ return ""; } if(obj.equals("undefined")){ return ""; } String type = obj.getClass().getName(); // 对字符串的处理 if (CLASSTYPE.equals(type)) { obj = obj.toString().trim(); } return obj; } /** * 将parameter的值去除空格后重写回去 */ private void modifyParameters() { Set<String> set = params.keySet(); Iterator<String> it = set.iterator(); while (it.hasNext()) { String key = it.next(); String[] values = params.get(key); values[0] = values[0].trim().replaceAll("undefined,undefined",""); params.put(key, values); } } /** * 重写getParameter 参数从当前类中的map获取 */ @Override public String getParameter(String name) { String[] values = params.get(name); if (values == null || values.length == 0) { return null; } return values[0]; } @Override public String[] getParameterValues(String name) {//同上 String[] values = params.get(name); if (values == null || values.length == 0) { return null; } return values; }}
import javax.servlet.ReadListener;import javax.servlet.ServletInputStream;import java.io.ByteArrayInputStream;import java.io.IOException;public class ParamsServletInputStream extends ServletInputStream { private ByteArrayInputStream bis; public ParamsServletInputStream(ByteArrayInputStream bis) { this.bis = bis; } @Override public boolean isFinished() { return true; } @Override public boolean isReady() { return true; } @Override public void setReadListener(ReadListener readListener) { } @Override public int read() throws IOException { return bis.read(); }}
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #java的过滤器获取请求参数 #java的过滤器