目录
MVC和三层架构模型的联系
m-->model即模型是三层架构模型的业务层(service)和持久层(dao)
v-->views即视图是三层架构模型的表现层(web)
c-->controller即控制器也是三层架构模型的表现层(web)
Filter
概念
Filter表示过滤器属于java.servlet.Filter接口类型,过滤器可以对访问的静态和动态资源进行过滤,既可以过滤请求,也可以过滤响应
作用
1.拦截客户端对web资源的请求
web资源
静态:html,css,js,img
动态:jsp,servlet
2.拦截web资源对客户端的响应
应用场景
1.解决post请求中文乱码(全栈)
2.敏感字符过滤
3.登录权限进行校验
步骤
1.自定义类实现Filter接口
2.在实现类实现接口的所有代码
3.在doFilter方法中书写过滤资源的代码
4.在web.xml中配置过滤器
5.访问被过滤的资源
简单入门
java//自定义类实现Filter接口 public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { //不要调用父类的方法,否则会报错 //Filter.super.init(filterConfig); } //在doFilter中书写拦截资源的代码 //每次访问被过滤的资源都要执行该方法 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("doFilter..."); } @Override public void destroy() { } }
在web.xml配置Filter
html<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> <!-- 配置Filter--> <filter> <filter-name>MyFilter</filter-name> <filter-class>com.hhh.filter.MyFilter</filter-class> </filter> <!-- 配置的是当前过滤器过滤的资源路径,表示Myfilter过滤器过滤demo1.html的请求和响应--> <filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/demo1.html</url-pattern> </filter-mapping> </web-app>
tomcat底层解析xml获取过滤类的全路径,使用反射技术调用Myfilter类中的无参构造方法创建对象,使用对象调用MyFilter类的doFilter方法
Class c=Class.forName("过滤类的全路径");
MyFilter f=c.newInstance();
f.doFilter(request,response);
前端代码
html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>我是被过滤的</h1> </body> </html>
浏览器:
可以发现不显示前端的内容,因为已经被过滤
但是在控制台有结果
该怎么查看被过滤的资源呢
在doFilter中书写放行代码
javaimport javax.servlet.*; import java.io.IOException; //自定义类实现Filter接口 public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { //不要调用父类的方法,否则会报错 //Filter.super.init(filterConfig); } //在doFilter中书写拦截资源的代码 //每次访问被过滤的资源都要执行该方法 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("doFilter..."); //放行 filterChain.doFilter(servletRequest,servletResponse); } @Override public void destroy() { }
结果