zoukankan      html  css  js  c++  java
  • spring boot项目增加过滤器、Filter、拦截、统一处理

    就是在访问接口前增加一个统一处理器,可以用来过滤拦截非法调用,也可以统一处理请求头中一些数据例如解密、验证签名等操作,以下是代码:

    import com.google.gson.Gson;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.io.UnsupportedEncodingException;
    import java.util.Enumeration;
    import java.util.Map;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    @Component
    public class ApiFilter implements Filter {
        private Logger LOG = Logger.getLogger(ApiFilter.class.getName());
    
        @Autowired
        private ApiService ApiService;
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    //        chain.doFilter(request,response);
           // ResponseEntity<Map<String,Object>> resr = null;
    
            HttpServletRequest httpRequest = (HttpServletRequest) request;
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            String uri = httpRequest.getRequestURI();
            MyHttpServletRequestWrapper requestWrapper = new MyHttpServletRequestWrapper((HttpServletRequest) request);
            httpResponse.setCharacterEncoding("UTF-8");
            httpResponse.setContentType("application/json; charset=utf-8");
    
            String method = httpRequest.getMethod();
            LOG.log(Level.INFO,"================request mathod is "+ method);
            LOG.log(Level.INFO,"================request mathod is "+ uri);
            if(method.equals("OPTIONS")){
                chain.doFilter(request,response);
            }else {
                if(uri.contains("/clpcApi") ){
                    String responseMsg = "";
                    String responseCod = "3001";
                    int statusCode = 403;
                    boolean flag = false;
                    Enumeration<String> headersNames = httpRequest.getHeaderNames();
                    while(headersNames.hasMoreElements()){
                        String element = headersNames.nextElement();
                        LOG.log(Level.INFO,"================request header "+element+" is "+ httpRequest.getHeader(element));
                    }
    //                LOG.log(Level.INFO,"================request header headersNames is "+ gson.toJson(headersNames));
                    ResponseEntity responseEntity = new ResponseEntity();
                    String VendorsID = httpRequest.getHeader("VendorsID");
                    String EncryptType = httpRequest.getHeader("EncryptType");
                    String Sign = httpRequest.getHeader("Sign");
                    String Timestamp = httpRequest.getHeader("Timestamp");
    
                    LOG.log(Level.INFO,"================request header VendorsID    is "+ VendorsID);
                    LOG.log(Level.INFO,"================request header EncryptType  is "+ EncryptType);
                    LOG.log(Level.INFO,"================request header Sign         is "+ Sign);
                    LOG.log(Level.INFO,"================request header Timestamp    is "+ Timestamp);
                    if(Tools.checkValue(Sign)){
                        String userStr = ApiService.checkSign(Sign);//验证签名
                        if(userStr==null){
                            responseMsg = "无调用权限!";
                        }else{
                            if (Tools.checkNullValue(VendorsID)){
    //                            responseMsg = "Request header No VendorsID!";
                                statusCode = 401;
                                responseMsg = "验签失败!";
                            }else if(Tools.checkNullValue(EncryptType)){
    //                            responseMsg = "Request header No EncryptType!";
                                statusCode = 401;
                                responseMsg = "验签失败!";
                            }else if(Tools.checkNullValue(Timestamp)){
    //                            responseMsg = "Request header No Timestamp!";
                                responseMsg = "验签失败!";
                                statusCode = 401;
                            }else{
                                flag = true;
                            }
                        }
                    } else {
                        responseMsg = "验签失败!";
                        statusCode = 401;
                    }
    
                    responseEntity.setRsCode(responseCod);
                    responseEntity.setRsDesc(responseMsg);
    
                    PrintWriter writer = null;
                    OutputStreamWriter osw = null;
                    if(flag){
                        chain.doFilter(requestWrapper, response);
                    }else{
                        try {
    
                            ((HttpServletResponse) response).setStatus(statusCode);
                            //response.set
                            osw = new OutputStreamWriter(response.getOutputStream(),"UTF-8");
                            writer = new PrintWriter(osw, true);
                            String jsonStr = new Gson().toJson(responseEntity);
                            writer.write(jsonStr);
                            writer.flush();
                            writer.close();
                            osw.close();
                        } catch (UnsupportedEncodingException e) {
                            LOG.log(Level.INFO,"过滤器返回信息失败:" + e.getMessage(), e);
                        } catch (IOException e) {
                            LOG.log(Level.INFO,"过滤器返回信息失败:" + e.getMessage(), e);
                        } finally {
                            if (null != writer) {
                                writer.close();
                            }
                            if (null != osw) {
                                osw.close();
                            }
                        }
                    }
                }else if(uri.contains("/swagger-ui")){
                    chain.doFilter(requestWrapper, response);
                }else {
                    chain.doFilter(requestWrapper, response);
                }
    
            }
        }
    
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
            System.out.println("AllianzAPIFilter init============================================");
    
        }
    
    
    
        @Override
        public void destroy() {
    
            System.out.println("AllianzAPIFilter destroy============================================");
        }
    
    
        public static void main(String[] args) {
    
        }
    }

    其中返回报文格式可以自定义也可以用系统格式返回都可以。

    标红的是我自己自定义的返回格式,如果想了解可以看下另一篇随笔:https://www.cnblogs.com/yangchengdebokeyuan/p/13684583.html

  • 相关阅读:
    flex 只显示年、月的日期选择控件(TimeChooser)
    SQL 实现统计业务
    SQL 时间函数详解
    我与计算机
    ISE中FPGA的实现流程
    总结Verilog中always语句的使用
    VGA 时序标准
    ChipScope软件使用
    FIFO的使用场景
    Verilog 初级入门概念
  • 原文地址:https://www.cnblogs.com/yangchengdebokeyuan/p/13684597.html
Copyright © 2011-2022 走看看