Filter 过滤器

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
	}

}







 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值