package com.softeem.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.http.HttpServletRequest;
/**
* 过滤器(Filter):在对项目中的资源发起请求的时候,可以通过配置的过滤规则,对指定的资源请求进行拦截,执行完过滤器中的
* 逻辑之后,再根据过滤器的放行规则决定是否对请求的资源放行
* 实现原理:基于java的设计模式之代理模式完成
*
* 过滤器的创建方式(3.0-)
* 1.创建普通类实现Filter接口
* 2.实现接口中方法init,doFilter,destroy
* 3.在web.xml中配置过滤器
*/
public class HelloFilter implements Filter{
String encoding;
@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("过滤器被初始化");
encoding = config.getInitParameter("encoding");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
System.out.println("执行编码过滤");
HttpServletRequest request = (HttpServletRequest)req;
request.setCharacterEncoding(encoding);
resp.setCharacterEncoding(encoding);
resp.setContentType("text/html;charset="+encoding);
//放行
chain.doFilter(req, resp);
}
@Override
public void destroy() {
System.out.println("过滤器被销毁");
}
}
package com.softeem.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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 1.创建类实现Filter接口
* 2.实现Filter中的三个方法
* 3.注册、配置Filter
*/
public class LoginFilter implements Filter{
private String[] pages;
@Override
public void init(FilterConfig config) throws ServletException {
//获取初始化参数
pages = config.getInitParameter("pass").split(",");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
System.out.println("过滤");
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
//1.取得客户端请求的资源名称
String uri = request.getRequestURI();
//截取最后一个/之后的资源名称
uri = uri.substring(uri.lastIndexOf("/")+1);
boolean isPass = false;//假设当前请求不允许放行(标记)
//2.判断请求资源是否在放行之列
for (String page : pages) {
if(page.equals(uri)){
isPass = true;
break;
}
}
if(isPass){
chain.doFilter(request, response);
}else{
//获取session中的数据
Object obj = request.getSession().getAttribute("user");
//3.如果不在放行之列,检查session中有没有用户信息
if(obj != null){
chain.doFilter(request, response);
}else{
//4.有则放行,无则拦截
request.setAttribute("error", "骚年,请登录后再试!");
request.getRequestDispatcher("../login.jsp").forward(request, response);
}
}
}
@Override
public void destroy() {
System.out.println("销毁loginFilter");
}
}
servlet之过滤器
最新推荐文章于 2022-07-29 16:58:39 发布