字符编码拦截器延伸出的拦截器
方案一
AdviceAdapter+Interceptor
get使用拦截器校验,post请求使用
@ControllerAdvice
https://cloud.tencent.com/developer/article/1516443
package com.shendi.dolphin.common.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdviceAdapter;
import java.lang.reflect.Type;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ControllerAdvice
@Slf4j
public class MyRequestBodyAdviceAdapter extends RequestBodyAdviceAdapter {
private static final Pattern FULL_CHARACTER = Pattern.compile("[^\\x00-\\xff]");
@Override
public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
return true;
}
@Override
public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
if (body == null) {
return true;
}
log.info("POST请求体:{}", body);
if (StringUtils.isEmpty(body)) {
return true;
}
Matcher matcher = FULL_CHARACTER.matcher(body.toString());
Assert.isTrue(!matcher.find(), "请使用半角输入法输入,重新提交");
return super.afterBodyRead(body, inputMessage, parameter, targetType, converterType);
}
}
package com.shendi.dolphin.common.interceptor;
import com.shendi.dolphin.common.wrapper.BodyReaderWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.Assert;
import org.springframework.util.StreamUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Slf4j
public class CharacterInterceptor implements HandlerInterceptor {
private static final Pattern FULL_CHARACTER = Pattern.compile("[^\\x00-\\xff]");
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("-----------------------进入字符编码拦截器--------------------------");
// String contentType = request.getContentType();
String method = request.getMethod();
if ("GET".equals(method)) {
//获取请求参数
String queryString = request.getQueryString();
log.info("GET请求参数:{}", queryString);
if (StringUtils.isEmpty(queryString)) {
return true;
}
Matcher matcher = FULL_CHARACTER.matcher(queryString);
Assert.isTrue(!matcher.find(), "请使用半角输入法输入,重新提交");
}
return true;
}
}
方案二
Wrapper+Filter+Interceptor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!