在這里小小推薦下我的個(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ò)濾掉了!


接下來(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)目后,就可以看到攔截效果了?。?!