zoukankan      html  css  js  c++  java
  • 快速构建一个权限项目(六)

    今天我们讲解的是Http请求前后监听工具

    首先得创建一个类用来做处理:HttpInterceptor.class:

    package cn.oyc.common;

    import cn.oyc.util.JsonMapper;
    import lombok.extern.slf4j.Slf4j;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.util.Map;

    @Slf4j
    public class HttpInterceptor extends HandlerInterceptorAdapter {
    private final Logger logger = LoggerFactory.getLogger(HttpInterceptor.class);

    private static final String START_TIME = "requestStartTime";
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    String url = request.getRequestURL().toString();
    Map parameterMap = request.getParameterMap();
    logger.info("request start. utl:{},params:{}",url, JsonMapper.obj2String(parameterMap));
    long start = System.currentTimeMillis();
    request.setAttribute(START_TIME,start);
    return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    // String url = request.getRequestURL().toString();
    // long start = (Long) request.getAttribute(START_TIME);
    // long end = System.currentTimeMillis();
    // logger.info("request finished. utl:{},cost:{}",url, end - start);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    String url = request.getRequestURL().toString();
    long start = (Long) request.getAttribute(START_TIME);
    long end = System.currentTimeMillis();
    logger.info("request completed. utl:{},cost:{}",url, end - start);
    }
    }

    做完这些别忘记配置一下spring-servlet.xml,配置一段bean:

     <mvc:interceptors>
            <bean class="cn.oyc.common.HttpInterceptor"/>
        </mvc:interceptors>

    接下来我们这个类就编写完了,大家要记住,这个类可以拦截我们系统的url,可以在url请求之前可以做些事情,然后在请求处理完之后依旧可以做一些事情,这里我们基本的工具就配置好了,接下来就是编写我们

    的部门接口的一个实现了,跟着下面来:

    首先在param包下编写一个部门类DeptParam:

    package cn.oyc.param;
    
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    import org.hibernate.validator.constraints.Length;
    import org.hibernate.validator.constraints.NotBlank;
    
    import javax.validation.constraints.NotNull;
    
    @Getter
    @Setter
    @ToString
    public class DeptParam {
    
        private Integer id;
        @NotBlank(message = "部门名称不可以为空")
        @Length(max = 15,min = 2,message = "部门名称需要在2-15个字之间")
        private String name;
    
        private Integer parentId;
        @NotNull(message = "展示顺序不可以为空")
        private Integer seq;
        @Length(max = 150,message = "备注的长度需要在150个字以内")
        private String remark;
    }

    在编写一个controller,SysDeptController:

    package cn.oyc.controller;
    
    import cn.oyc.common.JsonData;
    import cn.oyc.param.DeptParam;
    import cn.oyc.service.SysDeptService;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.annotation.Resource;
    
    @Controller
    @RequestMapping("/sys/dept")
    @Slf4j
    public class SysDeptController {
        @Resource
        private SysDeptService sysDeptService;
        @RequestMapping("/save.json")
        public JsonData saveDept(DeptParam param){
            sysDeptService.save(param);
            return JsonData.success("");
        }
    }

    在这之前我们还得创建他的Service:

    package cn.oyc.service;
    
    import cn.oyc.dao.SysDeptMapper;
    import cn.oyc.entity.SysDept;
    import cn.oyc.exception.ParamException;
    import cn.oyc.param.DeptParam;
    import cn.oyc.util.BeanValidator;
    import cn.oyc.util.LevelUtil;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    import java.util.Date;
    
    @Service
    public class SysDeptService {
    
        @Resource
        private SysDeptMapper sysDeptMapper;
    
        public void save(DeptParam param) {
            BeanValidator.check(param);
            if (checkExist(param.getParentId(),param.getName(),param.getId())){
                throw new ParamException("同一层级下存在相同名称的部门");
            }
            SysDept dept = SysDept.builder().name(param.getName()).parentId(param.getParentId())
                    .seq(param.getSeq()).remark(param.getRemark()).build();
            dept.setLevel(LevelUtil.calculateLevel(getLevel(param.getParentId()),param.getParentId()));
            dept.setOperator("system");//TODO:
            dept.setOperateIp("127.0.0.1"); //TODO
            dept.setOperateTime(new Date());
            sysDeptMapper.insertSelective(dept);
        }
    
        private boolean checkExist(Integer parentId,String deptName,Integer deptId){
            // TODD:
            return true;
        }
        private String getLevel(Integer deptId){
            SysDept dept = sysDeptMapper.selectByPrimaryKey(deptId);
            if (dept == null){
                return null;
            }
            return dept.getLevel();
        }
    }

    在创建一个层级状态的类:

    package cn.oyc.util;
    
    import org.apache.commons.lang3.StringUtils;
    
    public class LevelUtil {
    
        public final static String SEPARATOR = ".";
    
        public final static String ROOT = "0";
    
        //0
        //0.1
        //0.1.2
        //0.1.3
        //0.4
        public static String calculateLevel(String parentLevel,int parentId){
            if (StringUtils.isBlank(parentLevel)){
                return ROOT;
            }else{
                return StringUtils.join(parentLevel,SEPARATOR,parentId);
            }
        }
    }

    在我们的SysDept实体中添加注解

    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
  • 相关阅读:
    分页小算法
    幻影粒子游戏开发
    X文件的导出系列1——静态模型
    JavaScript 强行弹出窗口 与 无提示关闭页面
    SqlHelper中使用事务
    一个不错的WEB打印解决方案!
    【转载】3层架构应用AspNetPager分页 GridView分页
    c#操作在word指定书签插入文字
    多数据库事务处理[改写]
    rdlc报表使用技巧一(转)
  • 原文地址:https://www.cnblogs.com/Myoyc/p/12239392.html
Copyright © 2011-2022 走看看