怎么利用过滤器实现权限验证功能
如何利用过滤器实现权限验证功能?. 过滤的实现调用链所有过滤器都服从调用的过滤器链,并通过定义明确的接
如何利用过滤器实现权限验证功能?
. 过滤的实现调用链所有过滤器都服从调用的过滤器链,并通过定义明确的接口得到执行。
一个执行过滤器的 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; ?? ??
- /******************************************************************************* ? ?*?在过滤器中实现权限控制类,用来检验用户是否有权限进入当前页面 ?
- ?*? ? ?*?@作者:kiral ?
- ?*?@日期:2006-6-24 ? ?*?@版本:?1.0 ?
- ?******************************************************************************/?? 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; ??
- ?? ????/** ?
- ?????*?重定向的URL ? ?????*/??
- ????private?String?redirectURl?=?null; ?? ??
- ????public?void?init(FilterConfig?filterConfig)?throws?ServletException?{ ?? ????????//?得到允许的角色,这个参数是由web.xml里的allowRole所指定 ??
- ????????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来进行权限控制。
?