Filter链,FilterConfig接口,Filter实现用户自动登录

一:Filter链
在一个 Web 应用程序中可以注册多个 Filter 程序,每个 Filter 程序都可以针对某一个 URL 进行拦截。如果多个 Filter 程序都对同一个 URL 进行拦截,那么这些 Filter 就会组成一个 Filter 链(也叫过滤器链) Filter 链用 FilterChain 对象来表示, FilterChain 对象中有一个 doFilter ()方法,该方法的作用就是让 Fiter 链上的当前过滤器放行,使请求进入下一个 Filter 。接下来通过一个图例来描述 Filter 链的拦截过程,如图 所示
在这里插入图片描述
在图8-6中,当浏览器访问 Web 服务器中的资源时需要经过两个过滤器Filter1和Filter2。首先Filer1会对这个请求进行拦截,在Filter1过滤器中处理好请求后,通过调用Filter1的 doFilter ()方法将请求传递给Fiter2.Filter2将用户请求处理后同样调用 doFilter ()方法 最终将请求发送给目标资源。当 Web 服务器对这个请求做出响应时,也会被过滤器拦截,这个拦截顺序与之前相反,最终将响应结果发送给客户端。
(1)在chapter08项目的 cn . itcast .chapter08.filter包中新建两个过述器MyFilter01和MyFilter02,

MyFilter01.java

package cn.itcast.chapter08.filter;
import java.io.*;
import javax.servlet.*;
public class MyFilter01 implements Filter {
   
	public void init(FilterConfig fConfig) throws ServletException {
   
		// 过滤器对象在初始化时调用,可以配置一些初始化参数
	}
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
   
		// 用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用
		PrintWriter out=response.getWriter();
		out.write("Hello MyFilter01<br />");
		chain.doFilter(request, response);
	}
	public void destroy() {
   
		// 过滤器对象在销毁时自动调用,释放资源
	}
}


MyFilter02.java

package cn.itcast.chapter08.filter;
import java.io.*;
import javax.servlet.Filter;
import javax.servlet.*;
public class MyFilter02 implements Filter {
   
	public void init(FilterConfig fConfig) throws ServletException {
   
		// 过滤器对象在初始化时调用,可以配置一些初始化参数
	}
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
   
		// 用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用
		PrintWriter out=response.getWriter();
		out.write("MyFilter02 Before<br />");
		chain.doFilter(request, response);
		out.write("<br />MyFilter02 After<br />");	
	}
	public void destroy() {
   
		// 过滤器对象在销毁时自动调用,释放资源
	}
}

为了防止其他过滤器影响此次 Filter 链的演示效果,请先在 web . xml 文件中注释掉其他过滤器的配置信息。然后,将MyFiter01和MyFilter02过滤器的映射信息配置在 MyServlet 配置信息前面

<filter>
    <filter-name>MyFilter01</filter-name>
    <filter-class>cn.itcast.chapter009.filter.MyFilter01</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>MyFilter01</filter-name>
    <url-pattern>/MyServlet</url-pattern>
  </filter-mapping>
  <filter>
    <filter-name>MyFilter02</filter-name>
    <filter-class>cn.itcast.chapter08.filter.MyFilter02</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>MyFilter02</filter-name>
    <url-pattern>/MyServlet</url-pattern>
  </filter-mapping>
  <servlet>
    <description></description>
    <display-name>MyServlet</display-name>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>cn.itcast.chapter08.filter.MyServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现用户自动登录功能需要在用户登录时,将用户登录信息存储到本地浏览器的cookie或localStorage中。然后在每次用户访问网站时,通过检查本地存储的登录信息,判断用户是否已经登录,如果已经登录,则自动登录。 下面是使用filter实现用户自动登录功能的步骤: 1. 创建一个filter类,并实现doFilter方法。 2. 在doFilter方法中获取用户的cookie或localStorage中的登录信息。 3. 如果存在登录信息,则将用户登录状态设置为已登录。 4. 如果不存在登录信息,则将用户登录状态设置为未登录。 5. 在web.xml文件中配置filter。 下面是一个示例代码: ```java public class AutoLoginFilter implements Filter { private static final String LOGIN_TOKEN = "login_token"; private static final String LOGIN_USER = "login_user"; @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; HttpSession session = req.getSession(); String token = (String) session.getAttribute(LOGIN_TOKEN); if (token != null) { // 已经登录,设置登录状态 User user = getUserByToken(token); if (user != null) { session.setAttribute(LOGIN_USER, user); } } else { // 未登录,设置登录状态 session.setAttribute(LOGIN_USER, null); } chain.doFilter(req, res); } private User getUserByToken(String token) { // 根据token获取用户信息 // 如果token无效,返回null } // 初始化和销毁方法 @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void destroy() { } } ``` 在web.xml文件中配置filter: ```xml <filter> <filter-name>AutoLoginFilter</filter-name> <filter-class>com.example.AutoLoginFilter</filter-class> </filter> <filter-mapping> <filter-name>AutoLoginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 这样,当用户访问网站时,filter自动检查本地存储的登录信息,如果存在登录信息,则将用户登录状态设置为已登录,并将用户信息存储到session中,以便后续使用。如果不存在登录信息,则将用户登录状态设置为未登录。通过这种方式,就可以实现用户自动登录功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值