过滤器(y型过滤器图例是什么)
2023-08-13 13:40:09
1.什么是过滤器
Servlet过滤器从字面上的字意理解为经过一层次的过滤处理才达到使用的要求,而其实Servlet过滤器就是服务器与客户端请求与响应的中间层组件,在实际项目开发中Servlet过滤器主要用于对浏览器的请求进行过滤处理,将过滤后的请求再转给下一个资源。

2.过滤器特点
过滤器可以对ServletRequest和ServletResponse对象进行修改,使请求和响应满足一定的规范。例如,使用拦截器设置请求和响应的编码格式。过滤器可以有多个,串联起来形成一条过滤链,形成管道效应,协同修改请求和响应对象可以通过web.xml轻松地配置过滤器的拦截范围,灵活有效。3.过滤器的生命周期
随着服务器的启动而创建、随着服务器的关闭或项目的移除而销毁。
4.多个过滤器的执行顺序
如果在web.xml中配置多个拦截器,形成拦截链,其执行顺序为:所有满足拦截条件的拦截器在web.xml中的配置的顺序,服务器会自动将下一个拦截器封装成FilterChain对象传递给拦截器,拦截器中调用FilterChain对象的doFilter方法向下执行拦截链。
5.过滤器实现案例
过滤器必须实现javax.servlet.Filter接口,并实现接口的三个方法:init(FilterConfig filterConfig)
在过滤器初始化是被调用,即服务器启动时被调用doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
在服务器接收到请求后,请求被过滤器拦截,服务器处理请求之前被调用,对请求和响应做相应的处理,处理完后,将请求和响应交个下一个资源处理。 FilterChain对象,表示下一个拦截链的对象。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP 页面被激活。destroy() 在拦截器被销毁时调用,即服务器关闭时。2. 在web.xml中配置过滤器
配置和servler的配置类似。在url_pattern中配置拦截路径。“/*”表示拦截所有请求。 注意: 拦截路径配置成“/*”,会将静态资源文件也拦截,需要在过滤器的doFilter方法中将静态资源放行。
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>cn.xyl.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3. 进行请求和响应的处理。
例如设置请求和响应编码格式、静态资源放行、登录验证、权限验证等功能的过滤器。
public class MyFilter implements javax.servlet.Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//在执行request.setCharacterEncoding()之前不能执行request.getParameter()方法;否则编码格式设置失效
//应该是在执行第一个getParameter()的时候,Java将会按照编码分析所有的提交内容,而后续的getParameter()
//不再进行分析,所以setCharacterEncoding()无效。而对于GET方法提交表单是,提交的内容在URL中,一开始就
//已经按照编码分析提交内容,setCharacterEncoding()自然就无效。
request.setCharacterEncoding("utf-8");//post请求有效,对get请求无效;对于get请求,应该在server.xml中指定:URIEncoding=utf-8;tomcat8默认为utf-8
//强制转型
HttpServletRequest req=(HttpServletRequest) request;
HttpServletResponse resp=(HttpServletResponse) response;
String uri = req.getRequestURI();
String method = req.getParameter("method");
//放行静态资源
if(uri.startsWith("/project3/css/")||uri.startsWith("/project3/js/")||uri.startsWith("/project3/images/")){
chain.doFilter(req, resp);
}else {
//设置编码格式
response.setContentType("text/html;charset=utf-8");
//放行登录页面、注册页面、登录请求和静态资源
if(uri.equals("/project3/login.jsp")||
uri.equals("/project3/register.jsp")||
(uri.equals("/project3/data") && (method.equals("loginServlet")||method.equals("registerServlet")))
){
chain.doFilter(req, resp);
}else {
//检查session是否失效
HttpSession session = req.getSession();
Object user = session.getAttribute("user");
if(user==null) {
resp.sendRedirect("login.jsp");//重定向
}else {
//权限判断
List<Permission> list = (List<Permission>) session.getAttribute("permission");
for(Permission p : list) {
if(uri.equals(p.getLocation()) || p.getLocation().equals(method)) {
chain.doFilter(req, resp);
return;
}
}
resp.getWriter().write("hava_no_permission");
}
}
}
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
以上就是关于《过滤器(y型过滤器图例是什么)》的全部内容,本文网址:https://www.7ca.cn/baike/65879.shtml,如对您有帮助可以分享给好友,谢谢。
声明