SpringBoot臟話(huà)過(guò)濾、登陸攔截?一看就會(huì)!

在這里小小推薦下我的個(gè)人博客

csdn:雷園的csdn博客

個(gè)人博客:雷園的個(gè)人博客

簡(jiǎn)書(shū):雷園的簡(jiǎn)書(shū)

前言

首先我們來(lái)說(shuō)一下兩者的應(yīng)用場(chǎng)景。

1.相信大家有大部分人都往過(guò)英雄聯(lián)盟或者是其他的什么游戲,他們都有這不盡相同的臟話(huà)過(guò)濾系統(tǒng)。當(dāng)你打游戲輸了氣的要死的時(shí)候,總想罵隊(duì)友或者是隊(duì)友幾句,但是更可氣的事情發(fā)生了!別人只能看到被過(guò)濾后的**。快來(lái)了解一下在Java中臟話(huà)過(guò)濾是怎么實(shí)現(xiàn)的吧。

2.大家一定都上過(guò)博客、貼吧等等一系列的平臺(tái),當(dāng)你覺(jué)得文章很好,或者很爛的時(shí)候,你可能會(huì)想要發(fā)布一下自己的評(píng)論。但是如果你沒(méi)有登陸,不管你怎么點(diǎn)擊、點(diǎn)擊哪里,他都只會(huì)跳轉(zhuǎn)到登陸或者是注冊(cè)的頁(yè)面,這就是攔截器的功勞了,防止為登陸用戶(hù)或者是無(wú)權(quán)用戶(hù)進(jìn)行胡亂的操作影響系統(tǒng)的正常運(yùn)行,也來(lái)了解一下攔截器的實(shí)現(xiàn)吧!

首先我們來(lái)說(shuō)一下臟話(huà)過(guò)濾

1.首先我們創(chuàng)建我們的過(guò)濾類(lèi)TestFilter.java

import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
// 過(guò)濾路徑,過(guò)濾器名稱(chēng)
@WebFilter(urlPatterns = "/*", filterName = "testFilter")
public class TestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    // 過(guò)濾
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        // 獲取request
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        // 獲取response
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        // 創(chuàng)建臟話(huà)過(guò)濾規(guī)則
        DirtyWordsHttpServletRequest dirtyWordsHttpServletRequest = new DirtyWordsHttpServletRequest(request);
        // 執(zhí)行
        filterChain.doFilter(dirtyWordsHttpServletRequest, response);
    }
    @Override
    public void destroy() {
    }
    // 內(nèi)部類(lèi)臟話(huà)過(guò)濾規(guī)則
    class DirtyWordsHttpServletRequest extends HttpServletRequestWrapper {
        // 臟話(huà)字典、可以直接搜索臟話(huà)字典,然后通過(guò)io流進(jìn)行讀取和過(guò)濾
        private String[] words = {"傻", "禽", "畜"};
        // 夠臟方法
        public DirtyWordsHttpServletRequest(HttpServletRequest request) {
            super(request);
        }
        // 充血getParameter方法
        @Override
        public String getParameter(String name) {
            // 獲取傳來(lái)的參數(shù)值
            String value = super.getParameter(name);
            // 判斷
            if (value == null) return "沒(méi)有值";
            // 執(zhí)行臟話(huà)轉(zhuǎn)換
            for (String dword : words) {
                if (value.contains(dword)) value = value.replace(dword, "**");
            }
            // 返回過(guò)濾有的值
            return value;
        }
    }
}

2.在我們的啟動(dòng)類(lèi)中加入我們的過(guò)濾器!


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
@ServletComponentScan("com.blogproject.utils.TestFilter")
public class BlogProjectApplication {
    public static void main(String[] args) {
        SpringApplication.run(BlogProjectApplication.class, args);
    }
}

3.編寫(xiě)、運(yùn)行控制層代碼查看我們的過(guò)濾結(jié)果!


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping("/test")
public class TestController {
    @RequestMapping("/")
    public String test(HttpServletRequest request) {
        System.out.println(request.getParameter("name"));
        return request.getParameter("name");
    }
}

4.啟動(dòng)項(xiàng)目,打開(kāi)瀏覽器在地址欄中輸入localhost:8080/test/?name=傻112233就可以看到如圖效果以及控制臺(tái)結(jié)果打印,可以很清晰的看到我們輸入的臟話(huà)被過(guò)濾掉了!

屏幕快照 2018-11-15 下午3.23.14

屏幕快照 2018-11-15 下午3.23.27

接下來(lái),我們就來(lái)說(shuō)一下攔截器的實(shí)現(xiàn)

1.創(chuàng)建一個(gè)攔截器并實(shí)現(xiàn)HandlerInterceptor接口

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 攔截器
public class MyHandlerInterceptor implements HandlerInterceptor {
    /**
     * 攔截(Controller方法調(diào)用之前)
     *
     * @param request  request
     * @param response response
     * @param o        o
     * @return 通過(guò)與否
     * @throws Exception 異常處理
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object
            o) throws Exception {
        // TODO 我這里是通過(guò)用戶(hù)是否登陸進(jìn)行攔截,我的用戶(hù)信息存儲(chǔ)在session中,名稱(chēng)為userSession,大家可以自行實(shí)現(xiàn)
        if (request.getSession().getAttribute("userSession") == null) {
            // 攔截至登陸頁(yè)面
            request.getRequestDispatcher("/user/toLogin").forward(request, response);
            // false為不通過(guò)
            return false;
        }
        // true為通過(guò)
        return true;
    }

    // 此方法為處理請(qǐng)求之后調(diào)用(調(diào)用過(guò)controller方法之后,跳轉(zhuǎn)視圖之前)
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o,
                           ModelAndView modelAndView) throws Exception {

    }

    // 此方法為整個(gè)請(qǐng)求結(jié)束之后進(jìn)行調(diào)用
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
                                Object o, Exception e) throws Exception {

    }
}

2.創(chuàng)建一個(gè)配置類(lèi)MyHandlerInterceptorConfig并繼承WebMvcConfigurerAdapter類(lèi)重寫(xiě)addInterceptors(InterceptorRegistry registry)方法

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
// 攔截器配置類(lèi)
@Component
public class MyHandlerInterceptorConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        /**
         * 這里的addPathPatterns("/**")為配置需要攔截的方法“/**”代表所有,而后excludePathPatterns("/user/toLogin")等方法為排除哪些方法不進(jìn)行      攔截
         */
        registry.addInterceptor(new MyHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/user/toLogin").excludePathPatterns
                ("/user/login").excludePathPatterns("/user/toNewUser").excludePathPatterns("/user/newUser");
        super.addInterceptors(registry);
    }
}

啟動(dòng)項(xiàng)目后,就可以看到攔截效果了?。?!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,917評(píng)論 25 709
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 13,949評(píng)論 2 59
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評(píng)論 19 139
  • 為了能夠支持鐵桿群的家人成長(zhǎng),定于晚上給大家做一個(gè)沙龍~如何認(rèn)識(shí)自己!讓我們看到自己在生活中遇到的很多不如意,很多...
    婉彤心語(yǔ)閱讀 347評(píng)論 0 5
  • 冬請(qǐng)珍重 文/零度晶晶 歲月如梭 邂逅一捧溫暖 四季輪回 我愿將 久藏于心底的思緒 用無(wú)塵的詩(shī)句 輕輕融入墨香里 ...
    零度晶晶閱讀 453評(píng)論 3 7

友情鏈接更多精彩內(nèi)容