如果设置了过滤器,浏览器发送的所有请求会被过滤器拦截下来,在里面进行一些规则处理;过滤器可以设置很多个,最后到达 Servlet ,然后处理完请求再返回客户端。
3、编写过滤器——实现 Filter 接口
编写过滤器需要先实现 Filter 接口,接着要重写三个方法:
以前编写 Servlet 的案例中,经常要处理编码格式,可以编写一个过滤器,每次要处理编码格式时,就调用该过滤器就行。
public class EncodingFilter implements Filter {
//编码格式
private String encoding = null;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//在这里读取 filter 的配置,读到编码格式
//读取 init-param 中的配置参数
encoding = filterConfig.getInitParameter("encoding");
if (encoding == null) {
//说明用户在 web.xml 中没有配置初始化参数
encoding = "UTF-8";
}
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//为所有经过 filter 的请求设置编码格式
servletRequest.setCharacterEncoding(encoding); // 这里也可以写死 utf-8,就不用写上面那些了。
//让请求继续向下走,如果不执行下面这行代码,这个请求就卡到这里了。(就是放行的意思)
//只有继续往下走,才会到达 Servlet,不继续往下走,就不会到达 Servlet
filterChain.doFilter(servletRequest, servletResponse);
}
5、过滤器的配置
跟 Servlet 一样,有 xml 配置跟注解配置
a、xml 文件配置 b、注解配置
两个文件,一个做登录,一个做过滤:
登录:
@WebServlet(urlPatterns = "/doLogin")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//在 doPost 中处理登录请求
//提取用户传递来的登录参数
String username = req.getParameter("username");
String password = req.getParameter("password");
if ("zhangsan".equals(username) && "123".equals(password)) {
//登录成功
//将用户登录成功的用户名保存到 session 中
req.getSession().setAttribute("loginUser", username);
//跳转到 index.html 页面
resp.sendRedirect("/pf/index.html");
} else {
//登录失败
//回到登录页面
resp.sendRedirect("/pf/login.html");
}
}
}
过滤器:
@WebFilter(urlPatterns = "
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//将当前请求强转为 HttpServletRequest,HttpServletRequest 是 ServletRequest 的子类
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
//获取到当前 session 对象
HttpSession session = req.getSession();
//获取当前请求的 url 地址
String requestURI = req.getRequestURI();
if (requestURI.contains("/login.html") || requestURI.contains("/doLogin")) {
//这些地址都不用拦截
//所以请求直接继续向下走
filterChain.doFilter(servletRequest, servletResponse);
} else {
//这些地址是需要拦截判断的地址
//获取当前登录的用户名
Object loginUser = session.getAttribute("loginUser");
if (loginUser == null) {
//说明用户没有登录
resp.sendRedirect("/pf/login.html");
} else {
//说明用户已经登录过了,请求继续向下走
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
@Override
public void destroy() {
}
}
8、getRequestURI 和 getRequestURL 的区别
9、过滤器链和优先级
a、过滤器链
java开发方式:
现有问题:
简化的Servlet设计,在HTML标签中嵌套Java代码,用以高效开发Web应用的动态网页。
作用:替换显示页面部分的Servlet(使用*.jsp文件替换XxxJSP.java)。
3、使用jsp使用<%= %>标签编写Java代码在页面中打印当前系统时间。
jsp的使用方式跟 Servlet 一样:
本质上就是把 Java 和 HTML 代码混合在一起写。
5、jsp 和 Servlet 的区别和实现原理区别:
实现原理:
既然能把 Java 和 HTML 代码混合在一起写,肯定有区分两者的方法:
a、<% … %>——普通脚本普通脚本可以使用所有Java语法,除了自定义方法(因为 jsp 页面编译之后,里面的内容会出现在 _jspService 中;而方法中不可以定义方法)。(注意:脚本与脚本之间不可嵌套,脚本与HTML标签不可嵌套。)
注意:
1、声明脚本声明的变量是全局变量。
2、声明脚本的内容必须在普通脚本<% %>中调用。
3、如果声明脚本中的函数具有返回值,可以使用输出脚本调用<%= %>。
注意:输出脚本可以输出带有返回值的函数,输出脚本中不能加分号 ;
使用 jsp 写一个 九九乘法表的页面:
| <%=i%>*<%=j%>=<%=i*j%> | <% } %>
JSP注释主要有两个作用:为脚本代码作注释以及HTML内容注释。
例子:
然后查看网页源代码:
再查看反编译之后的代码:
变量冲突,比如A页面有 num 变量,引入B页面,B页面也有 num 变量,这就是变量冲突。



