ajax (get方法) 使用base64 加密參數,后台攔截request 統一解密。
1>ajax 統一對參數進行base64加密
$.ajaxSetup({
contentType: "application/x-www-form-urlencoded;charset=utf-8",
beforeSend: function() { //發送前執行的函數
try {
if(arguments[1].type.toLocaleLowerCase()=="get"){
var url = arguments[1].url;
if(url.indexOf("?")){
split = url.split("?");
arguments[1].url = split[0]+"?xssContent="+BASE64.encode(split[1]);
}
}
var params = arguments[1].data; //arguments是一個兩個值的數組分別是0和1
} catch(e) {
console.log(e);
//請求方法記錄相關日志
}
},
processData: true,
});
2>后台解密
LangFilter.java
public class LangFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
ChangeRequestWrapper changeRequestWrapper = new ChangeRequestWrapper((HttpServletRequest) servletRequest);
Map<String, String[]> parameterMap = new HashMap<>(changeRequestWrapper.getParameterMap());
String[] strings = parameterMap.get("xssContent");
if(!StringUtils.isEmpty(strings)){
String encoder = strings[0];
//解碼
String decode = BASE64Util.decode(encoder);
//拆分
if(!StringUtils.isEmpty(decode)){
Map<String, Object> map = MapUtil.formSerializeToMap(decode);
if(!StringUtils.isEmpty(map)){
parameterMap.clear();
for(String keys:map.keySet()){
String[] values = new String[]{map.get(keys)+""};
parameterMap.put(keys,values);
}
}
}
changeRequestWrapper.setParameterMap(parameterMap);
}
//使用復寫后的wrapper
filterChain.doFilter(changeRequestWrapper, servletResponse);
}
@Override
public void destroy() {
}
}
ChangeRequestWrapper.java
public class ChangeRequestWrapper extends HttpServletRequestWrapper {
private Map<String, String[]> parameterMap; // 所有參數的Map集合
public ChangeRequestWrapper(HttpServletRequest request) {
super(request);
parameterMap = request.getParameterMap();
}
// 重寫幾個HttpServletRequestWrapper中的方法
/**
* 獲取所有參數名
*
* @return 返回所有參數名
*/
@Override
public Enumeration<String> getParameterNames() {
Vector<String> vector = new Vector<String>(parameterMap.keySet());
return vector.elements();
}
/**
* 獲取指定參數名的值,如果有重復的參數名,則返回第一個的值 接收一般變量 ,如text類型
*
* @param name 指定參數名
* @return 指定參數名的值
*/
@Override
public String getParameter(String name) {
String[] results = parameterMap.get(name);
if(!StringUtils.isEmpty(results)){
return results[0];
}
return null;
}
/**
* 獲取指定參數名的所有值的數組,如:checkbox的所有數據
* 接收數組變量 ,如checkobx類型
*/
@Override
public String[] getParameterValues(String name) {
return parameterMap.get(name);
}
@Override
public Map<String, String[]> getParameterMap() {
return parameterMap;
}
public void setParameterMap(Map<String, String[]> parameterMap) {
this.parameterMap = parameterMap;
}
}
編寫web.xml
<filter> <filter-name>RequestlFilter</filter-name> <filter-class>com.xxxx.xxxx.filter.LangFilter</filter-class> </filter> <filter-mapping> <filter-name>RequestlFilter</filter-name> <url-pattern>*</url-pattern> </filter-mapping>
工具類
Base64 加解密
public final class BASE64Util {
/**
* 采用BASE64算法對字符串進行加密
* @param base 原字符串
* @return 加密后的字符串
*/
public static final String encode(String base){
return BASE64Util.encode(base.getBytes());
}
/**
* 采用BASE64算法對字節數組進行加密
* @param baseBuff 原字節數組
* @return 加密后的字符串
*/
public static final String encode(byte[] baseBuff){
return new BASE64Encoder().encode(baseBuff);
}
/**
* 字符串解密,采用BASE64的算法
* @param encoder 需要解密的字符串
* @return 解密后的字符串
*/
public static final String decode(String encoder){
try {
BASE64Decoder decoder = new BASE64Decoder();
byte[] buf = decoder.decodeBuffer(encoder);
return new String(buf);
} catch (Exception e) {
return null;
}
}
}
MapUtils.java
public class MapUtil {
/** 記錄日志 */
private static Logger logger = LoggerFactory.getLogger(MapUtil.class);
/**
* 頁面form序列化提交過來的數據轉換為Map
* @param args
* @return
*/
public static Map<String, Object> formSerializeToMap(String args){
Map<String, Object> map = new HashMap<String, Object>();
String[] kvs = null;
if(args == null || args.length() == 0){
return map;
}
if(args.contains("&")){
kvs = args.split("&"); //先嘗試用&分割
}else{
kvs = args.split("&"); //先嘗試用&分割
}
if(kvs.length <= 1){
kvs = args.split("#"); //先嘗試用#分割
}
for(String kv : kvs){
if(kv == null || kv.length() == 0){
continue;
}
String[] kvAry = kv.split("=");
if(kvAry.length == 2){
map.put(kvAry[0].trim().replaceAll("\\+", ""), kvAry[1].trim().replaceAll("\\+", ""));
}
}
return map;
}
/**
* 功能描述: 將Form提交過來的的值全部連接為字符串,不包含URL后面的參數<br>
*
* @param parameterMap 提交過來的全部數據
* @param queryString URL后面的參數
* @return String
*/
public static String getFormAllValues(Map<String, String[]> parameterMap, String queryString) {
if (parameterMap == null || parameterMap.isEmpty()) {
return "";
}
StringBuilder sb = new StringBuilder();
String[] qs = getQueryStringKey(queryString);
boolean hasKey;
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
hasKey = false;
for (String s : qs) {
if (s.equalsIgnoreCase(entry.getKey())) {
hasKey = true;
break;
}
}
if (hasKey) {
continue;
}
if (entry.getValue() != null && entry.getValue().length > 0) {
sb.append(entry.getValue()[0]);
}
}
return sb.toString();
}
/**
* 功能描述: 將queryString中的key取出<br>
* @param queryString
* @return
*/
private static String[] getQueryStringKey(String queryString) {
if (queryString == null || queryString.trim().length() == 0) {
return new String[0];
}
String[] qs = queryString.split("&");
for (int i = 0; i < qs.length; i++) {
qs[i] = qs[i].substring(0, qs[i].indexOf("="));
}
return qs;
}
}
