如何利用过滤器实现权限验证功能?
. 过滤的实现调用链所有过滤器都服从调用的过滤器链,并通过定义明确的接口得到执行。
一个执行过滤器的 Java 类必须执行这一 javax.servlet.Filter 接口。这一接口含有三个过滤器必须执行的方法: doFilter(ServletRequest, ServletResponse, FilterChain):这是一个完成过滤行为的方法。这同样是上游过滤器调用的方法。引入的FilterChain对象提供了后续过滤器所要调用的信息。
init(FilterConfig):这是一个容器所调用的初始化方法。它保证了在第一次doFilter()调用前由容器调用。您能获取在 web.xml 文件中指定的初始化参数。
destroy():容器在破坏过滤器实例前,doFilter()中的所有活动都被该实例终止后,调用该方法。嵌套调用在 doFilter() 方法执行中发生。除非您建立一个过滤器明确阻止所有后续处理(通过其它过滤器及资源处理器),否则过滤器一定会在 doFilter 方法中作以下的调用: ...
如果没有对页面进行权限控制,用户只要输入URL就能进入任何页面。
下面就演示一下最基本的使用Fiter来控制页面的权限。
1.写一个FILTER,用来判断用户是否有权限进入指定页面。
java 代码
-
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.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
-
- import org.apache.log4j.Logger;
-
- import com.kiral.action.UserAction;
- import com.kiral.model.User;
-
-
-
-
-
-
-
-
- public class FilterServlet extends HttpServlet implements Filter {
-
private static final long serialVersionUID = 5162189625393315379L;
-
-
private static Logger LOG = Logger.getLogger(FilterServlet.class);
-
-
-
-
-
private String allowRole = null;
-
-
-
-
-
private String redirectURl = null;
-
-
public void init(FilterConfig filterConfig) throws ServletException {
-
-
allowRole = filterConfig.getInitParameter("allowRole");
-
-
redirectURl = "/locker/index.html";
-
}
-
-
-
-
-
public void doFilter(ServletRequest sRequest, ServletResponse sResponse,
-
FilterChain filterChain) throws IOException, ServletException {
-
HttpServletRequest request = (HttpServletRequest) sRequest;
-
HttpServletResponse response = (HttpServletResponse) sResponse;
-
HttpSession session = request.getSession();
-
-
-
if (session.getAttribute(UserAction.CURRENT_USER) == null) {
-
response.sendRedirect(redirectURl);
-
}
-
-
else {
-
User user = (User) session.getAttribute(UserAction.CURRENT_USER);
-
try {
-
-
if ("0".equals(allowRole) || user.hasPower(allowRole)) {
-
filterChain.doFilter(sRequest, sResponse);
-
} else {
-
-
response.sendRedirect(redirectURl);
-
}
-
} catch (Throwable e) {
-
LOG.error("权限过滤时候出现错误", e);
-
throw new RuntimeException("权限过滤时候出现错误", e);
-
}
-
}
-
}
-
-
public void destroy() {
-
}
-
-
}
在web.xml中配置 要过滤的页面和能进入当前页面的角色
xml 代码
-
-
<filter>
-
<filter-name>UserAdminfilter-name>
-
-
<filter-class>com.emap.web.FilterServletfilter-class>
-
-
<init-param>
-
-
<param-name>allowRoleparam-name>
-
<param-value>1param-value>
-
init-param>
-
filter>
-
<filter-mapping>
-
<filter-name>UserAdminfilter-name>
-
<url-pattern>/jsp/security/*url-pattern>
-
filter-mapping>
上面配置的意思是说,当用户进入/jsp/security文件夹下的页面的时候,程序会进入FilterServlet 里的doFilter方法里,进行权限判断。
其他的页面权限控制:
1.你可以在filter里判断用户是否登录,然后需要特殊权限能访问的页面,在页面里进行判断。
2.推荐使用开源框架ACEGI来进行权限控制。