1.过滤器是啥,能干啥;
2.如果定义一个过滤器;
过滤器可以做下面的事情:
1.拦截浏览器的请求,让请求不能进入服务器;
2.经过过滤器的doFilter后放行;
之前每个servlet中都需要设置编码,请求和响应的编码需要设置成UTF-8,即以下代码
// 编码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
用过滤器就可以实现全局的编码控制
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() {
}
}
报错信息:写成了@WebServlet @WebFilter(“/*”)
Servlet[com.tianju.filter.CharacterEncodingFilter]当前不可用
如果忘记放行,项目可以启动,但所有资源都不可访问
上面的代码可以解决编码的问题,但是无法更改编码,通过web.xml的配置,可以实现解耦
web.xml文件代码如下:
<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>characterEncodingFilterfilter-name>
<filter-class>com.tianju.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
<init-param>
<param-name>htmlShowparam-name>
<param-value>text/html;charset=utf-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>characterEncodingFilterfilter-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() {
}
}
任何一个系统,都会有登陆权限的问题:
系统中所有请求的资源,servlet、静态资源等,或者登陆后才能访问;或者不登录也可以访问
以一个图书管理系统为例,不登录就可以访问的如下:
|| requestURI.contains("/js/")
|| requestURI.contains("/bootstrap/")
|| requestURI.contains("/css/")
|| requestURI.contains("/img/"
其他资源必须登陆后才能访问:
(1)如果没有登陆,就去登陆页面;
(2)如果登陆了,就放行;
控制 Jsp静态资源 + Servlet的访问权限
package com.tianju.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* 登陆权限的确认;
* 注意要实现3个方法,如果不加会报错
*/
@WebFilter("/*")
public class LoginAuthorServlet implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("DemoFilter init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
String requestURI = req.getRequestURI();
// 1.不登录也可以访问的连接,就放行
// TODO:如果把contains换成equals
if (requestURI.contains("/user/login")
|| requestURI.contains("/user/register.jsp")
|| requestURI.contains("/user/register")
|| requestURI.contains("/user/register.jsp")
|| requestURI.contains("/image/get")
// 需要放行这些静态文件
|| requestURI.contains("/js/")
|| requestURI.contains("/bootstrap/")
|| requestURI.contains("/css/")
|| requestURI.contains("/img/")
// || requestURI.contains("/index.jsp")
){
// 对于登陆,注册,验证码请求的连接,就放行
filterChain.doFilter(servletRequest, servletResponse);
}else{
// 2.其他连接必须登陆才能访问
HttpSession session = req.getSession();
Object user = session.getAttribute("user");
// 如果没有登陆,就去登陆页面
if (user==null){
resp.sendRedirect(req.getContextPath()+"/user/login.jsp");
}else {
//登陆了,就放行
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
@Override
public void destroy() {
System.out.println("DemoFilter destroy");
}
}
1.过滤器可以拦截浏览器的请求,让请求不能进入服务器,或者经过过滤器的doFilter后放行;
2.过滤器实现全局编码控制,记得放行;
3.过滤器进行权限控制,(1)不登录就可以访问的资源直接放行;(2)登陆后才能访问:如果没登录,去登陆页面;如果登陆了,就放行;