说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Filter究竟是什么?该怎么用?

编辑:说三道四文库 发布时间:2018-07-17 12:17
HTML文档下载 WORD文档下载 PDF文档下载
filter 框架 session zk spring 小弟一直不理解Filter究竟是什么。最近在用Hibernate+Spring+ZK(View层框架)做项目,做到了权限控制(user role authority)、访问控制(直接访问内部页面直接跳到Login),查了资料发现。
做访问控制的方法是Login的时候Session存个值,直接访问页面先session先get这个值 如果是null就自动跳到login,比较好的方法就是配置Filter,然后感觉对Filter有了个模糊大概的理解,解读代码发现是针对Servlet的。
问题:但是我用的是ZK框架,没用JSP(没Servlet),难道那种方式的Filter对我的框架不适用么?我需要配置针对我ZK框架的Filter?
或者有什么更好的做法么?本人首次单独开发项目,请各位大神指点,最好有代码啦,没配过Filter!
可以用spring的拦截器,跟filter差不多。效果比filter好
	<!-- LoginFilter -->
<filter>  
    <filter-name>LoginFilter</filter-name>  
    <filter-class>com.web.LoginFilter</filter-class>  
</filter>  
<filter-mapping>  
    <filter-name>LoginFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>

package com.web;

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;

public class LoginFilter implements Filter {
private String encoding;
@Override
public void init(FilterConfig filterconfig) throws ServletException {
encoding = "utf-8";
}

@Override
public void destroy() {
}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse res=(HttpServletResponse)response;
HttpSession session=req.getSession();

if(session.getAttribute("jobNumber")!=null){
chain.doFilter(request, response);
}else{
res.sendRedirect(req.getContextPath()+"/login.jsp");
}
}
}




我访问非登录页面 也会自动转到login.jsp 的url , 但是就是不显示,去掉web.xml有效。我难道 xml配置有问题么?
过滤的时候要排除掉自己的登录页面
引用 3 楼 xinlan1022 的回复:
过滤的时候要排除掉自己的登录页面

我想排除login.jsp,那么我该怎么写呢
filter就好比你房间的门。要进入这个门,你必须要有这个门的钥匙也就是符合进入这个门的条件。
不会 来学习学习
引用 1 楼 wo99128608 的回复:
可以用spring的拦截器,跟filter差不多。效果比filter好
过滤器,主要是过滤用户请求的!
引用 2 楼 aquariusk 的回复:
	<!-- LoginFilter -->
<filter>  
    <filter-name>LoginFilter</filter-name>  
    <filter-class>com.web.LoginFilter</filter-class>  
</filter>  
<filter-mapping>  
    <filter-name>LoginFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>

package com.web;

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;

public class LoginFilter implements Filter {
private String encoding;
@Override
public void init(FilterConfig filterconfig) throws ServletException {
encoding = "utf-8";
}

@Override
public void destroy() {
}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse res=(HttpServletResponse)response;
HttpSession session=req.getSession();

if(session.getAttribute("jobNumber")!=null){
chain.doFilter(request, response);
}else{
res.sendRedirect(req.getContextPath()+"/login.jsp");
}
}
}




我访问非登录页面 也会自动转到login.jsp 的url , 但是就是不显示,去掉web.xml有效。我难道 xml配置有问题么?

在filter的判断要在chain.doFilter(request, response);后面,不然你没有登录的时候拦截会出错的
filter就是过滤器,和struts的中央控制器一样的配置,主要来说适合用filter的就用,不适合用也可以,主要看你个人爱好
举个例子吧:
filter:酒店房间刷卡,进入只要刷卡就可以了,出来就直接关门,而不用刷卡,这相当于的filter的功能。
拦截器:上下班,上班打卡,下班打卡,这个就相当于拦截器的功能...
像水印,图片压缩,中文乱码之类的,用filter就行了,用拦截器有点浪费了,而已影响性能
我就是来学习的
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘