过滤器是用来过滤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>表示的是要被过滤的页面,这里是签到测试页面,表示只有登陆了才能签到。