Java 三大器之过滤器Filter

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenbetter1996/article/details/82828573

       过滤器是用来过滤web请求的,比如有一个网站域名打开的是首页,如果登陆的用户可以点击首页的去查看个人信息啥的,但是没有登陆的用户是没有个人信息的,也无权访问这些页面。所有可以使用过滤器来过滤这些非法未登陆的url, 在重定向,就是没登陆的用户访问个人信息会强制自动跳转到登陆页面。而登陆成功的用户可以正常访问。

       过滤器完全在后台编写,前端什么都不需要参与,过滤器Filter和前端的cookies类似,不过这是完全在后台的,争对的个体单位是ip, 同一个ip,登陆了,退出登陆,退出浏览器重新进入session依然存在(默认设置),依然可以在未登陆情况下访问个人信息。

代码:

创建 一个实现 javax.servlet.Filter 接口的类

package io.bbc13.controller;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 
 * @Lin 
 * @过滤首页(+其他页面)未登陆的情况
 * @重定向到登陆页面
 *
 */
public class LoginFilter implements Filter {
       
	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest httpRequest = (HttpServletRequest)request;
		HttpServletResponse httpResponse = (HttpServletResponse)response;
		HttpSession session= httpRequest.getSession();
		
		if(session.getAttribute("username") != null) {
			System.out.println("通过session获取到的username=" + session.getAttribute("username") + "不为空:");
			chain.doFilter(request, response);
		} else {
			// 重定向到登陆页面
			System.out.println("controller.LoginFilter 未登录进入指定页面,现在跳转到登陆页面");
                        // testLogin.html是需要被重定向到的登陆页面
			httpResponse.sendRedirect(httpRequest.getContextPath() + "/testLogin.html");
		}
		
		
	}


	public void init(FilterConfig fConfig) throws ServletException {
		
	}

}

对于只需过滤一个页面的简单过滤器,我们只需关注doFilter(..)函数。

FilterChain chain 是过滤链,比如说对于同一个url,如果写了多个filter,这些filter就会形成一个过滤链,层次过滤。

先将request, response转化为HttpServlet..

session是在HttpServletRequest对象中获取的,新建session只能通过 HttpServletRequest对象.getSession(boolean arg)获取。

session.getAttribute("username") 这是获取从session中存的key为"username"的值value

session.setAttribute("username", "test") 可以加入设置key-value到session。 这句就放在登陆成功的servlet里面,登陆成功就设置这句,那么登陆的用户打开请求个人信息的url时session就有值了,证明已经登陆。没有登陆的,也就没有运行登陆成功的servlet里面的这句,所已”username“的值是空的,会被过滤器重定向。

// 以下两句写在登陆的servlet里(要写在正确登陆后)
// 信息正确,可以登陆...
HttpSession session = request.getSession();
session.setAttribute("username", "test");

同时要配置web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>bobo</display-name>
  
  <!-- 注册过滤器 -->
  <filter>
  	<filter-name>LoginFilter</filter-name>
  	<filter-class>io.bbc13.controller.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>LoginFilter</filter-name>
  	<url-pattern>/testSign.html</url-pattern>
  </filter-mapping>
  
  <!-- 注册监听器 -->
  
  
  <!-- 注册servlet -->
  
  
</web-app>

过滤器要放在监听器前面(字母f排在l前面)

配置和servlet类似,<url-pattern>表示的是要被过滤的页面,这里是签到测试页面,表示只有登陆了才能签到。

猜你喜欢

转载自blog.csdn.net/chenbetter1996/article/details/82828573