案例一:验证用户登录案例
1、需求
1、 访问一个网站的资源。验证其是否登录
2、 如果登录了,则直接放行。
3、 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录"。
2、代码实现
1 import javax.servlet.*;
2 import javax.servlet.annotation.WebFilter;
3 import javax.servlet.http.HttpServletRequest;
4 import java.io.IOException;
5
6 @WebFilter("/*") // 拦截所有的访问
7 public class LoginFilter implements Filter {
8 public void destroy() {
9 }
10
11 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
12 // 强转为HttpServletRequest 对象
13
14 HttpServletRequest request = (HttpServletRequest) req;
15 // 1 .获取资源请求路径
16 String uri = request.getRequestURI();
17
18 // 2 判断是否包含登录相关资源路径
19 // login.jsp,要排除图片,验证码等资源
20 if(uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/css/") || uri.contains("/js/") || uri.contains("/fonts/") || uri.contains("/checkCodeServlet")) {
21 // 包含,用户想登录,放行与登录相关的资源
22 chain.doFilter(req, resp);
23 } else {
24 // 不包含,验证用户是否登录
25 // 3 从session 中获取 user
26 Object user = request.getSession().getAttribute("user");
27
28 if(user != null) {
29 // 登录成功,放行
30 chain.doFilter(req,resp);
31 } else {
32 request.setAttribute("login_msg","尚未登录,请登录");
33 request.getRequestDispatcher("/login.jsp").forward(request,resp);
34 }
35 }
36
37
38 }
39
40 public void init(FilterConfig config) throws ServletException {
41
42 }
43
44 }
3、
案例二:敏感词汇过滤案例
1、需求:
1、 对day17_case案例录入的数据进行敏感词汇过滤
2、 敏感词汇参考 src路径下的《敏感词汇.txt》
3、 如果是敏感词汇,替换为 ***
2、分析
1、 对request对象进行增强。增强获取参数相关方法
2、 放行。传递代理对象
3、代码实现
1 import org.springframework.cglib.proxy.InvocationHandler;
2 import org.springframework.cglib.proxy.Proxy;
3
4 import javax.servlet.*;
5 import javax.servlet.annotation.WebFilter;
6 import java.io.BufferedReader;
7 import java.io.FileReader;
8 import java.io.IOException;
9 import java.lang.reflect.Method;
10 import java.util.ArrayList;
11 import java.util.List;
12
13 /**
14 * 敏感词汇过滤器
15 */
16 @WebFilter("/*")
17 public class SensitiveWordsFilter implements Filter {
18
19
20 public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
21 // 1 创建代理对象,增强 getparameter 方法
22 ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
23 @Override
24 public Object invoke(Object o, Method method, Object[] args) throws Throwable {
25
26 // 增强 getparameter 方法
27 // 判断是否是该方法
28 if(method.getName().equals("getParameter")) {
29 // 增强返回值
30 // 获取返回值
31 String value = (String) method.invoke(req,args);
32
33 if(value != null) {
34 for (String str : list) {
35 if(value.contains(str)){
36 value = value.replaceAll(str,"***");
37 }
38 }
39 }
40
41 return value;
42 }
43
44 return method.invoke(req,args);
45 }
46 });
47 // 2 放行,传递增强的代理对象
48
49 chain.doFilter(proxy_req, resp);
50 }
51
52
53 private List<String> list = new ArrayList<String>(); // 敏感词汇集合
54 public void init(FilterConfig config) throws ServletException {
55
56
57 try {
58 // 1 加载文件
59 // 获取文件的真实路径
60 ServletContext servletContext = config.getServletContext();
61 String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt");
62 // 2 读取文件
63
64 BufferedReader br = new BufferedReader(new FileReader(realPath));
65
66 // 3 将文件的每一行添加到 list 中
67
68 String line = null;
69 while((line = br.readLine()) != null) {
70 list.add(line);
71 }
72
73 br.close();
74
75 System.out.println(list);
76 } catch (Exception e) {
77 e.printStackTrace();
78 }
79
80 }
81
82
83 public void destroy() {
84 }
85
86 }
4、
5、
案例三:使用字符过滤器解决乱码
字符过滤器:
1 /**
2 * 解决中文乱码
3 */
4 public class CharacterFilter implements Filter {
5
6 private String charset = "UTF-8";
7
8 public CharacterFilter() {}
9
10 @Override
11 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
12 throws IOException, ServletException {
13 // 设置请求响应编码
14 request.setCharacterEncoding(charset);
15 response.setCharacterEncoding(charset);
16 // 将HttpSerlvetRequest替换成我们包装后的。
17 chain.doFilter(new MyHttpServletRequestWapper((HttpServletRequest) request), response);
18 }
19
20 /**
21 * 创建一个HttpServletRequest的包装类
22 *
23 * @author njf
24 *
25 */
26 static class MyHttpServletRequestWapper extends HttpServletRequestWrapper {
27
28 private HttpServletRequest request;
29
30 public MyHttpServletRequestWapper(HttpServletRequest request) {
31 super(request);
32 this.request = request;
33 }
34
35 @Override
36 public String getParameter(String name) {
37 // 如果是get请求
38 if ("get".equalsIgnoreCase(request.getMethod())) {
39 // 先获取原来的乱码值
40 String value = super.getParameter(name);
41 if (value != null) {
42 try {
43 // 然后编码,解码
44 value = new String(value.getBytes("ISO-8859-1"),
45 request.getCharacterEncoding());
46 } catch (UnsupportedEncodingException e) {
47 e.printStackTrace();
48 }
49 }
50 return value;
51 } else {
52 return super.getParameter(name);
53 }
54 }
55
56 }
57
58 @Override
59 public void init(FilterConfig fConfig) throws ServletException {
60 // 获取初始化配置的编码
61 String t = fConfig.getInitParameter("charset");
62 if (t != null) {
63 charset = t;
64 }
65 }
66
67 @Override
68 public void destroy() {}
69
70 }
web.xml 中配置信息:
<filter>
<filter-name>CharacterFilter</filter-name>
<filter-class>com.njf.filter.CharacterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
分类:
Java Web
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现