最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot異常處理器的使用與添加員工功能實(shí)現(xiàn)流程介紹

 更新時(shí)間:2022年10月12日 14:57:50   作者:懶羊羊.java  
設(shè)計(jì)完了登錄與退出功能還只完成了冰山一角,經(jīng)過測試發(fā)現(xiàn),我們以url的方式來訪問網(wǎng)站時(shí)可以直接跳過登陸頁面進(jìn)入后臺頁面,這樣顯然是不合理的,下面我們通過異常攔截器+boot來做到訪問限制,以及實(shí)現(xiàn)新增員工功能,制作全局異常處理器

承接上文 傳送門

一.完善登錄功能

按照常理,只有登陸過后才能進(jìn)入首頁,若沒有登陸則應(yīng)當(dāng)直接跳轉(zhuǎn)到登陸頁面,這樣的場景不就完美契合過濾器的功效嗎

下面,針對此功能來設(shè)計(jì)一個(gè)過濾器

@Slf4j
@WebFilter(filterName = "loginFilterCheck", urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        log.info("攔截到請求:{}", request.getRequestURI());//{}相當(dāng)于一個(gè)占位符 可以實(shí)現(xiàn)動態(tài)變更
        filterChain.doFilter(request,response);
    }
}

通過它可以攔截到來自頁面的請求

對于攔截的請求,我們要做如下的處理:

1、獲取本次請求的URI,并定義不需要放行的資源路徑

        //獲取本次請求的uri
        String requestURI = request.getRequestURI();
        //定義不需要處理的資源路徑
        String[] urls=new String[]{
          "/employee/login",
                "/employee/logout",
                "/backend/**",
                "/front/**"
        };

為了解決通配符的引入而造成的路徑比較問題,我們可以通過路徑匹配器AntPathMatcher()來解決(由Spring為我們提供的工具)

2、判斷本次請求是否需要處理

當(dāng)我們拿到工具對象之后,就可以通過遍歷字符串?dāng)?shù)組的方式,將請求中的uri與事先設(shè)定中不需要攔截資源路徑進(jìn)行對比,然后封裝成一個(gè)check方法,就像這樣:

    public boolean check(String[] urls,String requestURI){
        for (String url : urls) {
            boolean match = PATH_MATCHER.match(url, requestURI);
            if (match){
                return true;
            }
        }
        return false;
    }

3.如果是不需要處理的資源路徑則直接放行

        //判斷是否需要處理
        boolean check = check(urls, requestURI);
        //如果不需要處理就直接放行
        if (check){
            filterChain.doFilter(request,response);
            return;
        }

4、判斷登錄狀態(tài),如果已登錄,則直接放行,如果未登錄則返回未登錄結(jié)果(通過從Session里獲得對象,查看是否為空來進(jìn)行評判)

        //查看登陸狀態(tài) 如果已登錄 則直接放行
        if (!(request.getSession().getAttribute("employee") == null)) {
            filterChain.doFilter(request, response);
            return;
        }
        //如果未登錄,則通過輸出流的方式向客戶端頁面響應(yīng)數(shù)據(jù)
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));

二.添加員工功能

前端頁面已將寫好,,當(dāng)用戶錄入信息,就伴隨著一次請求,而后端要做的就是將在請求中將表單里的數(shù)據(jù)保存到數(shù)據(jù)庫中

新增員工,其實(shí)就是將我們添加頁面錄入的員工數(shù)據(jù)插入到employee表。需要注意,employee表中對username字段加入了唯一約束,因?yàn)閡sername是員工的登錄賬號,必須是唯一的

我們該如何實(shí)現(xiàn)?

1、當(dāng)頁面發(fā)送ajax請求,表單中輸入的數(shù)據(jù)以json的形式提交到服務(wù)器端

2、服務(wù)端Controller層接收頁面提交的數(shù)據(jù)并調(diào)用Service層將數(shù)據(jù)進(jìn)行保存

3、Service調(diào)用Mapper操作數(shù)據(jù)庫,保存數(shù)據(jù)

Controller層如何設(shè)計(jì)呢?

1.毋庸置疑的是,首先要封裝一個(gè)用于保存的方法save()

2.其次HttpServletRequest里已經(jīng)封裝了表單的數(shù)據(jù),當(dāng)一次請求發(fā)生其中的數(shù)據(jù)就被當(dāng)作形參傳入了方法內(nèi),隨即就是設(shè)置表單中沒有的屬性,比如:setCreateTime,setUpdateTime,setCreateUser,setUpdateUser

總而言之,方法里涵蓋了表單里提交的數(shù)據(jù)和請求發(fā)生后動態(tài)變更的數(shù)據(jù),而我們寫好了save()方法之后,就得去用Service層(employeeService)來執(zhí)行這個(gè)方法將數(shù)據(jù)保存到數(shù)據(jù)庫中,就像這樣:

    @PostMapping //前端的請求路徑為employee,而上述@RequestMapping("/employee")已寫好
    public R<String> save(HttpServletRequest request, @RequestBody Employee employee) {
        log.info("新增員工:{}", employee.toString());
        //設(shè)置初始默認(rèn)密碼
       employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
        //設(shè)置更新時(shí)間
        employee.setCreateTime(LocalDateTime.now());//創(chuàng)建時(shí)間
        employee.setUpdateTime(LocalDateTime.now());//更新時(shí)間
        //獲取當(dāng)前登錄用戶的id
        Long empID = (Long) request.getSession().getAttribute("employee");
        employee.setCreateUser(empID);
        employee.setUpdateUser(empID);
        return R.success("添加員工成功!");
    }

當(dāng)我們在前端表單中填好了新增員工的信息后,點(diǎn)擊保存,后臺就執(zhí)行如下的SQL:

三.異常處理的運(yùn)用

寫好了添加的方法,我激動得添加了好幾個(gè)員工,但是當(dāng)我添加了一個(gè)同名員工之后,程序運(yùn)行的戛然而止,后臺竟然拋出了異常:java.sql.SQLIntegrityConstraintViolationException

前端也報(bào)出了接口錯(cuò)誤500,結(jié)合之前的表設(shè)計(jì),不難想到我的username索引設(shè)置的是unique呀!唯一約束!

很顯然

我們需要處理這個(gè)異常,很多人第一時(shí)間想到的可能是:這則錯(cuò)誤是service層調(diào)用save()方法所導(dǎo)致的,那我把save()方法try-catch不就行了嗎?

這樣想確實(shí)沒毛病是我的話我也這樣,可是以后業(yè)務(wù)一旦復(fù)雜起來,需要這樣處理的方法多了怎么辦呢?我要去一個(gè)一個(gè)try-catch嗎?多麻煩??!

這不就是所謂的硬編碼問題嘛!處理這種問題咱們在一個(gè)地方統(tǒng)一配置一下不久統(tǒng)統(tǒng)解決啊,跟MyBatis解決JDBC硬編碼問題是一個(gè)道理!

所以,我們使用異常攔截器進(jìn)行全局異常捕獲,這樣設(shè)置就輕松化解:

/**
 * 全局異常處理
 */
@ControllerAdvice(annotations = {RestController.class, Controller.class}) //攔截有指定注解類的Controller
@Slf4j
@ResponseBody
public class GlobalExceptionHandler {
    /**
     * 異常處理方法,一旦Controller發(fā)生此異常就會被攔截到
     * @return
     */
    @ExceptionHandler({SQLIntegrityConstraintViolationException.class})
    public R<String>  excpHandler(SQLIntegrityConstraintViolationException exception) {//捕獲到的異常被傳到方法的形參里
       log.info("異常信息:"+exception.getMessage());
        //細(xì)化添加失敗后的返回信息
        if (exception.getMessage().contains("Duplicate entry")){
            String[] s = exception.getMessage().split(" ");
            String msg=s[2]+"已存在!";
            return R.error(msg);
        }
        return R.error("發(fā)生異常!添加失??!");
    }
}

一旦Controller層發(fā)生此異常就會被攔截到!

通過Debug,當(dāng)程序出現(xiàn)因?yàn)橹貜?fù)添加而引起的異常時(shí)我們的msg就被細(xì)化了出來

到此這篇關(guān)于SpringBoot異常處理器的使用與添加員工功能實(shí)現(xiàn)流程介紹的文章就介紹到這了,更多相關(guān)SpringBoot異常處理器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

当雄县| 宜州市| 青田县| 兴隆县| 蓝田县| 阿克陶县| 大新县| 华亭县| 海兴县| 蓬安县| 德昌县| 福贡县| 甘孜| 寿宁县| 封丘县| 水城县| 夹江县| 花莲县| 和政县| 莱阳市| 元江| 鹤峰县| 定边县| 淮安市| 阳高县| 盐亭县| 天津市| 甘泉县| 巴彦县| 淮滨县| 将乐县| 贡嘎县| 和平区| 获嘉县| 周口市| 玉田县| 阳原县| 巴林左旗| 资阳市| 同仁县| 镇安县|