过滤器
作用:对服务器web资源进行拦截(权限控制,通过拦截资源进行权限控制,是否可以访问)
Servlet API 中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。
Servlet API 中,与过滤器有关的API共有三个接口,分别是
● Filter
● FilterChain
● FilterConfig
Filter接口是过滤器类必须实现的接口,该接口中有三个方法。
init(FilterConfig filterConfig):该方法是对filter对象进行初始化的方法,仅在容器初始化filter对象结束后被调用一次。参数FilterConfig可以获得filter的初始化参数。FilterConfig 是 Servlet API 提供的一个用于获取 Filter 程序在 web.xml 文件中的配置信息的接口 。
doFilter(ServletRequest request, ServletResponse response, FilterChain chain):该方法是filter进行过滤操作的方法,是最重要的方法。过滤器实现类必须实现该方法。方法体中可以对request和response进行预处理。其中FilterChain可以将处理后的request和response对象传递到过滤链上的下一个资源。
destroy():该方法在容器销毁过滤器对象前被调用。
package webback.filter;
import javax.servlet.*;
import java.io.IOException;
/*
* 编码过滤器
* */
public class EncodingFilter implements Filter {
//过滤器生命周期开始于服务器的启动
//过滤器需要执行的功能
String charset;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("编码过滤器初始化");
//FilterConfig 是 Servlet API 提供的一个用于获取 Filter 程序在 web.xml 文件中的配置信息的接口
//getInitParameter(String name),该方法用来获得过滤器的初始化参数值。
charset = filterConfig.getInitParameter("charset");
}
/*
过滤器需要执行的功能
* */
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("编码过滤器");
servletRequest.setCharacterEncoding(charset);
// filterChain(过滤链)让请求离开过滤器,继续向下执行
filterChain.doFilter(servletRequest,servletResponse);
}
}
web.xml中的配置
<!--配置过滤器-->
<filter>
<filter-name>encoding</filter-name>
<filter-class>webback.filter.EncodingFilter</filter-class>
<!--为过滤器配置参数-->
<init-param>
<param-name>charset</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<!--配置哪些请求可以进入到此过滤器-->
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern><!--表示所有请求都进入到过滤器-->
</filter-mapping>
过滤器:过滤器用来实现通用的功能,减少代码冗余,提高可维护性
一个过滤器可以配置给多个资源使用
一个资源也可以配置多个过滤器,按照配置顺序调用
web会话跟踪机制
从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。
会话(Session)跟踪是web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与session。
Http是无状态协议
session 第一次连接到后端,在服务器端创建的一个对象,生产一个id,可以在服务器端存储用户信息
Cookie 使用来在前端浏览器中保存sessionid 默认是会话级别的(浏览器关闭消失)
/*
* 登录成功后,需要在后端将用户信息保存在session中
* */
HttpSession session = req.getSession();
System.out.println("dopost:"+session.getId());
session.setAttribute("user",user);//将用户信息存储到session中
session生命周期:session对象,创建于前端连接到后端服务器开始
销毁:1.服务器关闭
2.非活动时间到期(多久不用,会自动销毁)tomcat默认是30分钟
3.退出,主动销毁session invalidate()
System.out.println(session.getMaxInactiveInterval());//获得最大非活动时间
session.setMaxInactiveInterval(3600);//设置最大非活动时间
System.out.println(session.isNew());//是不是第一次创建
过滤器验证用户是否登录
建立IsLoginFilter过滤器
<!--后端验证用户是否登录-->
<filter>
<filter-name>isLogin</filter-name>
<filter-class>webback.filter.IsLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>isLogin</filter-name>
<url-pattern>/back/*</url-pattern>//过滤url中属于/back/*的url
</filter-mapping>
建立StudentServlet并在web.xml中配置学生管理servlet
<!--配置学生管理servlet-->
<servlet>
<servlet-name>StudenServlet</servlet-name>
<servlet-class>webback.servlet.StudentServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>StudenServlet</servlet-name>
<url-pattern>/back/StudenServlet</url-pattern><!--定义url-->
</servlet-mapping>// <servlet-mapping>告诉别人怎么找到你的servlet
建立StudentServlet、logOutServlet
在web.xml中配置logOutServlet
<!--退出-->
<servlet>
<servlet-name>logOutServlet</servlet-name>
<servlet-class>webback.servlet.logOutServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>logOutServlet</servlet-name>
<url-pattern>/back/logOutServlet</url-pattern><!--定义url-->
</servlet-mapping>
过滤器顺序:编码过滤器-->跨域过滤器-->验证用户是否登录过滤器