一点一滴开始搭建自己的项目框架之框架篇 加密

       对于大部分商城类项目来说  加密都是一个比较头疼的事情了   我采用的加密相对来说是比较安全的了  拥有RSA和MD5的加签比对  还有加盐处理  不过这次我只讲加密处理的框架级思想  对于加密算法与比对 还是大家自己去摸索吧   找出一套适合自己的才是对的 好了 不多说了  直接将原理

       我是将request放到了filter里面 再filter里面将request替换成了 自定义的request  好了 直接上源码

       ModifyParametersFilter(过滤器)

       

package com.bing.myFilter;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;

import com.bing.util.StrUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import net.sf.json.JSONObject;
import org.apache.log4j.Logger;
import org.springframework.web.filter.OncePerRequestFilter;

public class ModifyParametersFilter extends OncePerRequestFilter {
    private static final Logger log = Logger.getLogger(MyFilter.class);
    public static final Gson gson = new GsonBuilder().serializeNulls().create();

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        ModifyParametersWrapper mParametersWrapper = new ModifyParametersWrapper(request);
        filterChain.doFilter(mParametersWrapper, response);
    }

    /**
     * 继承HttpServletRequestWrapper,创建装饰类,以达到修改HttpServletRequest参数的目的
     */
    private class ModifyParametersWrapper extends HttpServletRequestWrapper {
        private Map<String, String[]> parameterMap; // 所有参数的Map集合

        public ModifyParametersWrapper(HttpServletRequest request) {
            super(request);
            if(request.getContentType() == null){
                parameterMap = request.getParameterMap();
            }else if(request.getContentType().contains("application/x-www-form-urlencoded")){
                /**
                 * x-www-form-urlencoded POST提交参数加密验证
                 */
                parameterMap = new HashMap(request.getParameterMap());
                if(parameterMap.get("Jiang")!=null){
                    try {
                        String Jiang = modifyForRsa(parameterMap.get("Jiang")[0]);
                        JSONObject jb = JSONObject.fromObject(Jiang);
                        Map<String, Object> map = (Map<String, Object>) jb;
                        for (Map.Entry<String, Object> entry : map.entrySet()) {
                            String str = String.valueOf(entry.getValue());
                            String[] strs = new String[]{str};
                            parameterMap.put(entry.getKey(), strs);
                        }
                    }catch (Exception e){
                        log.debug("错误:"+ e);
                    }
                }
            }else if(request.getContentType().contains("json")){
                /**
                 * json提交
                 */
                parameterMap = new HashMap(request.getParameterMap());
                try{
                    BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
                    String body = reader.readLine();
                    Map<String, Object> map = new HashMap<>();
                    map = gson.fromJson(body, map.getClass());
                    if(map.get("Jiang") != null){
                        String Jiang = modifyForRsa(String.valueOf(map.get("Jiang")));
                        JSONObject jb = JSONObject.fromObject(Jiang);
                        map = (Map<String, Object>) jb;
                    }
                    for (Map.Entry<String, Object> entry : map.entrySet()) {
                        String str = String.valueOf(entry.getValue());
                        String[] strs = new String[]{str};
                        log.debug("key:"+entry.getKey()+"  value:"+str);
                        parameterMap.put(entry.getKey(),strs);
                    }
                }catch (Exception e){
                    log.debug("错误:"+ e);
                }
            }else{
                parameterMap = request.getParameterMap();
            }
            log.debug("成功");
        }

        // 重写几个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 (results == null || results.length <= 0)
                return null;
            else {
                log.debug("修改之前: " + results[0]);
                return modify(results[0]);
            }
        }

        /**
         * 获取指定参数名的所有值的数组,如:checkbox的所有数据
         * 接收数组变量 ,如checkobx类型
         */
        @Override
        public String[] getParameterValues(String name) {
            String[] results = parameterMap.get(name);
            if (results == null || results.length <= 0)
                return null;
            else {
                int length = results.length;
                for (int i = 0; i < length; i++) {
                    log.debug(name + ":" + results[i]);
                    results[i] = modify(results[i]);
                }
                return results;
            }
        }

        /**
         * 自定义的一个简单修改原参数的方法,即:给原来的参数值前面添加了一个修改标志的字符串
         *
         * @param string
         *            原参数值
         * @return 修改之后的值
         */
        private String modify(String string) {
            return string;
        }

        /**
         * RSA解密方法
         * @param string
         * @return
         */
        private String modifyForRsa(String string) {
            if(StrUtils.isBlankStr(string)){
                return "";
            }
            string = StrUtils.getParamRASE(string);
//            if(StrUtils.compareMD5(string)){
//                logger.debug("MD5加签错误");
//            }
            return string;
        }
    }
}

这个是我的加密拦截器  关键字为Jiang 只要参数中又Jiang我就认为他是加密请求 自动进入解密程序

接下来web.xml配置

 默认全部拦截

<filter>
    <filter-name>ParFilter</filter-name>
    <filter-class>com.bing.myFilter.ModifyParametersFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>ParFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

接口


    /**
     * 接收from格式数据
     * @param mobile
     * @param password
     * @return
     */
    @RequestMapping(value = "/test", method = RequestMethod.POST,produces = "application/x-www-form-urlencoded;charset=UTF-8")
    @ResponseBody
    public String test(String mobile,String password) {
        log.debug("进入方法内部");
        log.debug("mobile:"+mobile);
        log.debug("password:"+password);
        return JsonUtil.toJson("成功");
    }

默认是form-urlencoded其实拦截器中已经进行处理  json格式也可以直接用

请求

我直接使用的application/json请求

请求结果

好的 接下来 form-urlencoded 试试

请求结果

OK 代码没动 但是结果完全可以接收  完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值