Filter(过滤器)
作用:
在一个请求去访问某个资源的时候,filter可以在这个请求访问到这个资源之前,把请求拦下,然后做出一系列的处理或者判断(比如编码的转换,信息的过滤、权限的判断、是否已经登录的验证等等),最后filter再决定是否要让这个请求去访问那个资源.
如何写一个filter:
写一个java类,然后实现javax.Servlet.Filter接口
这个接口中有三个方法:
init destroy doFilter
init:这个过滤器类被服务器创建对象的时候会调用到这个方法。
destroy:过滤器对象被销毁的时候会调用这个方法。
doFilter:当过滤器拦截到请求的时候,会调用这个doFilter.
注意:
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain)
这个方法有三个参数,第三个参数表示的一个过滤器链对象,因为同一个请求有可能要依次的通过俩个或者多个过滤器,在web中把这样多个过滤器看做一个过滤器链条对象,就是用这个FilterChain类型的对象来表示。
chain.doFilter(req,res)表示把当前的req和res传给这个过滤器链条中的下一个过滤器进行过滤,如果说链条中已经没有下一个过滤器,那么就把这次访问放行,让它去访问它真正要访问的资源.
注意:如果这次访问没有符合过滤器中的条件,那么我们就不用调用chain.doFilter(req,res)这个方法把这次访问放行了,而是可以直接进行跳转(服务器内部跳转或者客户端重定向),跳转到一个页面,页面中提示用户一下,为什么这次不让他去访问,比如说 还没有登录、权限不够等等原因。
最后还需要在web.xml文件中进行配置:
例如:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.briup.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这个配置和servlet的配置很相似。
<url-pattern>/*</url-pattern>
表示当前这个过滤器,要拦截的路径是/*,表示项目中所有的资源。
<url-pattern>/servlet/*</url-pattern>
表示当前这个过滤器,要拦截的路径是/servlet/*,也就是项目下面的servlet路径下面的所有资源.
<url-pattern>/firstServlet</url-pattern>
表示当前这个过滤器,要拦截的路径是/firstServlet,也就是说这个过滤器只会拦截这一个路径.
如果要拦截的路径有俩个,我们可以配置俩个<filter-mapping>标签分别都去和同一个<filter>标签对应。
注意:1.这里的/代表地址栏中项目名字后的/
2.某一个资源是不是会被拦截,要看地址栏中会不会出现我们在web.xml文件所配置的要拦截的路径.
package com.briup.web.Filter;
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;
public class EncodingFilter
implements Filter{
//过滤器销毁调用的方法
@Override
public void destroy() {
// TODO Auto-generated method stub
}
//doFilter对资源校验的方法
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
req.setCharacterEncoding("UTF-8");
res.setCharacterEncoding("UTF-8");
//放行(原来该请求什么资源接着请求
//什么资源)
System.out.println("before.....");
chain.doFilter(req, res);
System.out.println("after.......");
}
//初始化
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
//web.xml文件中配置
<filter>
<filter-name>encond</filter-name>
<filter-class>com.briup.web.Filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encond</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
※ 通过拦截器拦截访问用户信息
1.登录页面 login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<base href="<%=basePath %>">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<form action="loginServ" method="post">
姓名:<input type="text" name="name"/><br>
密码:<input type="password" name="passwd"/><br>
<input type="checkbox" name="auto" value="1"/>自动登录<br>
<input type="submit" value="登录"/>
</form>
</body>
</html>
2.主页面(超链接跳转到用户信息界面) index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>主页</title>
</head>
<body>
<a href="user/userinfo.jsp">查看用户信息</a>
</body>
</html>
3.用户信息界面 userinfo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<base href="<%=basePath %>">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户的基本信息</title>
<style type="text/css">
table {
text-align: center;
margin: auto;
}
</style>
</head>
<body>
<form action="loginServ" method="post">
<table>
<caption>用户基本信息</caption>
<tr>
<td>姓名:</td>
<td><input type="text" name="name" value="${sessionScope.user.name}"/></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="passwd" value="${sessionScope.user.passwd}"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="修改"/></td>
</tr>
</table>
</form>
</body>
</html>
4.User.java(user实例对象,用户存储用户信息,session中用户信息,此时应该是将信息保存到数据库中)
package com.briup.web.bean;
public class User {
private String name;
private String passwd;
public User() {
}
public User(String name, String passwd) {
this.name = name;
this.passwd = passwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
}
5.loginServ.java(servlet构建登录对象,设置跳转到主页或登录失败)
package com.briup.web.Servelt;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.briup.web.bean.User;
@WebServlet("/loginServ")
public class loginServ extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name=
request.getParameter("name");
String passwd=
request.getParameter("passwd");
HttpSession session=request.getSession();
//name-->oracle--User
if(name.equals("tom")){
if(passwd.equals("123")){
//判断用户和密码正确才将User保存在session中,否则无法在过滤器判断session是否有User
User u=new User(name,passwd);
session.setAttribute("user", u);
request.getRequestDispatcher("index.jsp")
.forward(request, response);
}else{
request.getRequestDispatcher("login.jsp")
.forward(request, response);
}
}else{
request.getRequestDispatcher("login.jsp")
.forward(request, response);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
6.LonginYNFilter.java 设置过滤器,有主页跳转到用户信息页面时,如果没有登录(session对象)返回登录页面
package com.briup.web.Filter;
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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/*
* @WebFilter标记的是什么资源过滤
* 等价于web.xml中
* <filter>
<filter-name>login</filter-name>
<filter-class>com.briup.web.Filter.LoginYNFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>login</filter-name>
<url-pattern>/user/userinfo.jsp</url-pattern>
</filter-mapping>
*/
@WebFilter("/user/*")
public class LoginYNFilter implements Filter {
public LoginYNFilter() {
// TODO Auto-generated constructor stub
}
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=
(HttpServletRequest) request;
HttpSession session=req.getSession();
Object obj=session.getAttribute("user");
if(obj==null){
req.getRequestDispatcher("/login.jsp").forward(req, response);
}else{
chain.doFilter(req, response);
}
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}