网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
引出
1.过滤器是啥,能干啥;
2.如果定义一个过滤器;
1.过滤器简介
过滤器可以做下面的事情:
1.拦截浏览器的请求,让请求不能进入服务器;
2.经过过滤器的doFilter后放行;
2.用过滤器实现全局编码控制
之前每个servlet中都需要设置编码,请求和响应的编码需要设置成UTF-8,即以下代码
// 编码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
用过滤器就可以实现全局的编码控制
(1)导包import javax.servlet.*;
(2)如果是tomcat8.5,要把3个方法都实现
(3)代码如下,要点:放行,chain.doFilter(request, response)
package com.tianju.filter;
import javax.servlet.\*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/\*\*
\* 解决编码问题的过滤器
\*/
@WebFilter("/\*")
public class CharacterEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 编码问题
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
// 一定要记得放行
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
【bug】过滤器的相关bug
报错信息:写成了@WebServlet @WebFilter(“/*”)
Servlet[com.tianju.filter.CharacterEncodingFilter]当前不可用
如果忘记放行,项目可以启动,但所有资源都不可访问
(4)过滤器代码升级,配置文件解耦
上面的代码可以解决编码的问题,但是无法更改编码,通过web.xml的配置,可以实现解耦
web.xml文件代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app\_4\_0.xsd"
version="4.0">
过滤器中可以配置一个参数-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>com.tianju.filter.CharacterEncodingFilter</filter-class>
<!-- 带上变量-->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>htmlShow</param-name>
<param-value>text/html;charset=utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
此时过滤器CharacterEncodingFilter.java的代码如下,
package com.tianju.filter;
import javax.servlet.\*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/\*\*
\* 解决字符编码的问题
\*/
public class CharacterEncodingFilter implements Filter {
// 获取web.xml文件中的配置utf-8
private String encoding;
private String htmlShow;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 从web.xml的过滤器的init-param中,对应的值,在赋值给全局变量
encoding = filterConfig.getInitParameter("encoding");
htmlShow =filterConfig.getInitParameter("htmlShow");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 设置编码;
servletRequest.setCharacterEncoding(encoding);
servletResponse.setCharacterEncoding(encoding);
servletResponse.setContentType(htmlShow);
// 放行
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
3.用过滤器进行权限控制
(1)权限控制流程
任何一个系统,都会有登陆权限的问题:
系统中所有请求的资源,servlet、静态资源等,或者登陆后才能访问;或者不登录也可以访问
以一个图书管理系统为例,不登录就可以访问的如下:
|| requestURI.contains("/js/")
|| requestURI.contains("/bootstrap/")
|| requestURI.contains("/css/")
|| requestURI.contains("/img/"
其他资源必须登陆后才能访问:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
…(img-Rg6NMkSc-1715790970460)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!