• 在过滤器中验证接口中的Token


    一、web.xml

    在web.xml中增加以下代码

    <!--统一验证token值是否有效-->
    <filter>
    <filter-name>TokenFilter</filter-name> //过滤器名称
    <filter-class>com.seven.mp.contentmng.utils.TokenFilter</filter-class> //实现类路径
    </filter>
    <filter-mapping>
    <filter-name>TokenFilter</filter-name>
    <url-pattern>/conference/*</url-pattern> //目录前缀
    </filter-mapping>

    二、TokenFilter 实现类
    1. 过滤器必须实现Filter 接口 , 即TokenFilter implements Filter

    2.代码部分
    package com.seven.mp.contentmng.utils;
    import com.alibaba.fastjson.JSONObject;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.context.ApplicationContext;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.ValueOperations;
    import org.springframework.util.ObjectUtils;
    import org.springframework.web.context.support.WebApplicationContextUtils;

    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import java.io.*;


    public class TokenFilter implements Filter {
    private RedisTemplate redisTemplate;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(filterConfig.getServletContext());
    redisTemplate = (RedisTemplate) context.getBean("redisTemplate");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    String servletPath = httpServletRequest.getServletPath();
    //登录、登出接口直接放行
    if ("/auth/login".equalsIgnoreCase(servletPath)
    || "/auth/logout".equalsIgnoreCase(servletPath)
    || "/index".equalsIgnoreCase(servletPath)
    || "/index.html".equalsIgnoreCase(servletPath)
    || "/conference/entries/import_members".equalsIgnoreCase(servletPath)
    || "/conference/entries/import_dinner_members".equalsIgnoreCase(servletPath)
    || "/conference/picture/upload_file".equalsIgnoreCase(servletPath)
    || "/conference/mode/importFile".equalsIgnoreCase(servletPath)
    || "/conference/picture/upload".equalsIgnoreCase(servletPath)
    || "/conference/attendees/namelist/importList".equalsIgnoreCase(servletPath)
    || "/conference/app/attend/member/message".equalsIgnoreCase(servletPath)
    || "/conference/app/attend/member/list".equalsIgnoreCase(servletPath)
    || "/conference/app/attend/group/list".equalsIgnoreCase(servletPath)
    || "/conference/app/discipline/list".equalsIgnoreCase(servletPath)
    || "/conference/app/conferenceAgenda/list".equalsIgnoreCase(servletPath)
    || "/conference/app/logistics/list".equalsIgnoreCase(servletPath)
    || "/conference/app/meetActivity/getInfo".equalsIgnoreCase(servletPath)) {
    chain.doFilter(request, response);
    return;
    }

    //get方法直接放行
    if ("get".equalsIgnoreCase(httpServletRequest.getMethod())) {
    chain.doFilter(request, response);
    return;
    }
    //解析post的json参数
    String body = getBody(httpServletRequest);
    JSONObject jsonObject = JSONObject.parseObject(body);
    if (ObjectUtils.isEmpty(jsonObject)
    || ObjectUtils.isEmpty(jsonObject.get("accessToken"))) {
    PrintWriter out = response.getWriter();
    JSONObject json = new JSONObject();
    json.put("code", ResponseCode.PARAM_FAIL.code());
    json.put("msg", "accessToken为空");
    out.write(json.toString());
    out.flush();
    } else {
    //2.判断是否过期
    String accessToken = (String) jsonObject.get("accessToken");
    ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
    String userStr = valueOperations.get("MEETING_" + accessToken);
    if (StringUtils.isEmpty(userStr)) {
    PrintWriter out = response.getWriter();
    JSONObject json = new JSONObject();
    json.put("code", ResponseCode.TOKEN_PASS.code());
    json.put("msg", ResponseCode.TOKEN_PASS.msg());
    out.write(json.toString());
    out.flush();
    } else {
    //使用解析数据重新生成ServletRequest,供doChain调用
    request = getRequest(request, body);
    chain.doFilter(request, response);
    }
    }

    }

    @Override
    public void destroy() {

    }

    /**
    * 解析post的json参数
    *
    * @param request
    * @return
    * @throws IOException
    */
    private String getBody(HttpServletRequest request) throws IOException {
    String body = null;
    StringBuilder stringBuilder = new StringBuilder();
    BufferedReader bufferedReader = null;
    try {
    InputStream inputStream = request.getInputStream();
    if (inputStream != null) {
    bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    char[] charBuffer = new char[128];
    int bytesRead = -1;
    while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
    stringBuilder.append(charBuffer, 0, bytesRead);
    }
    } else {
    stringBuilder.append("");
    }
    } catch (IOException ex) {
    throw ex;
    } finally {
    if (null != bufferedReader) {
    bufferedReader.close();
    }
    }
    body = stringBuilder.toString();
    return body;
    }

    /**
    * 将post解析过后的request进行封装改写
    *
    * @param request
    * @param body
    * @return
    */
    private ServletRequest getRequest(ServletRequest request, String body) {
    String enctype = request.getContentType();
    if (StringUtils.isNotEmpty(enctype) && enctype.contains("application/json")) {
    return new PostServletRequest((HttpServletRequest) request, body);
    }
    return request;
    }

    }


  • 相关阅读:
    memcache启动程序/etc/sysconfig/memcached
    shell中的点号
    mysql监控
    secureCRT 中文乱码
    memcache key
    杀死所以数据库进程
    导出表记录
    重建二叉树
    从尾到头打印链表
    二维数组中的查找
  • 原文地址:https://www.cnblogs.com/fuqiang-terry/p/7927393.html
Copyright © 2020-2023  润新知