读书人

怎么利用过滤器实现权限验证功能

发布时间: 2012-08-27 21:21:57 作者: rapoo

如何利用过滤器实现权限验证功能?

. 过滤的实现调用链所有过滤器都服从调用的过滤器链,并通过定义明确的接口得到执行。

一个执行过滤器的 Java 类必须执行这一 javax.servlet.Filter 接口。这一接口含有三个过滤器必须执行的方法: doFilter(ServletRequest, ServletResponse, FilterChain):这是一个完成过滤行为的方法。这同样是上游过滤器调用的方法。引入的FilterChain对象提供了后续过滤器所要调用的信息。

init(FilterConfig):这是一个容器所调用的初始化方法。它保证了在第一次doFilter()调用前由容器调用。您能获取在 web.xml 文件中指定的初始化参数。

?destroy():容器在破坏过滤器实例前,doFilter()中的所有活动都被该实例终止后,调用该方法。嵌套调用在 doFilter() 方法执行中发生。除非您建立一个过滤器明确阻止所有后续处理(通过其它过滤器及资源处理器),否则过滤器一定会在 doFilter 方法中作以下的调用: ...

?

如果没有对页面进行权限控制,用户只要输入URL就能进入任何页面。

???? 下面就演示一下最基本的使用Fiter来控制页面的权限。

???? 1.写一个FILTER,用来判断用户是否有权限进入指定页面。

java 代码
  1. import?java.io.IOException; ?? ??
  2. import?javax.servlet.Filter; ?? import?javax.servlet.FilterChain; ??
  3. import?javax.servlet.FilterConfig; ?? import?javax.servlet.ServletException; ??
  4. import?javax.servlet.ServletRequest; ?? import?javax.servlet.ServletResponse; ??
  5. import?javax.servlet.http.HttpServlet; ?? import?javax.servlet.http.HttpServletRequest; ??
  6. import?javax.servlet.http.HttpServletResponse; ?? import?javax.servlet.http.HttpSession; ??
  7. ?? import?org.apache.log4j.Logger; ??
  8. ?? import?com.kiral.action.UserAction; ??
  9. import?com.kiral.model.User; ?? ??
  10. /******************************************************************************* ? ?*?在过滤器中实现权限控制类,用来检验用户是否有权限进入当前页面 ?
  11. ?*? ? ?*?@作者:kiral ?
  12. ?*?@日期:2006-6-24 ? ?*?@版本:?1.0 ?
  13. ?******************************************************************************/?? public?class?FilterServlet?extends?HttpServlet?implements?Filter?{ ??
  14. ????private?static?final?long?serialVersionUID?=?5162189625393315379L; ?? ??
  15. ????private?static?Logger?LOG?=?Logger.getLogger(FilterServlet.class); ?? ??
  16. ????/** ? ?????*?配置允许的角色 ?
  17. ?????*/?? ????private?String?allowRole?=?null; ??
  18. ?? ????/** ?
  19. ?????*?重定向的URL ? ?????*/??
  20. ????private?String?redirectURl?=?null; ?? ??
  21. ????public?void?init(FilterConfig?filterConfig)?throws?ServletException?{ ?? ????????//?得到允许的角色,这个参数是由web.xml里的allowRole所指定 ??
  22. ????????allowRole?=?filterConfig.getInitParameter("allowRole"); ?? ????????//?指定要重定向的页面 ??
  23. ????????redirectURl?=?"/locker/index.html"; ?? ????} ??
  24. ?? ????/** ?
  25. ?????*?在过滤器中实现权限控制 ? ?????*/??
  26. ????public?void?doFilter(ServletRequest?sRequest,?ServletResponse?sResponse, ?? ????????????FilterChain?filterChain)?throws?IOException,?ServletException?{ ??
  27. ????????HttpServletRequest?request?=?(HttpServletRequest)?sRequest; ?? ????????HttpServletResponse?response?=?(HttpServletResponse)?sResponse; ??
  28. ????????HttpSession?session?=?request.getSession(); ?? ??
  29. ????????//?如果回话中的用户为空,页面重新定向到登陆页面 ?? ????????if?(session.getAttribute(UserAction.CURRENT_USER)?==?null)?{ ??
  30. ????????????response.sendRedirect(redirectURl); ?? ????????} ??
  31. ????????//?会话中存在用户,则验证用户是否存在当前页面的权限 ?? ????????else?{ ??
  32. ????????????User?user?=?(User)?session.getAttribute(UserAction.CURRENT_USER); ?? ????????????try?{ ??
  33. ????????????????//?如果用户没有当前页的权限,页面重新定向到登陆页面 ?? ????????????????if?("0".equals(allowRole)?||?user.hasPower(allowRole))?{ ??
  34. ????????????????????filterChain.doFilter(sRequest,?sResponse); ?? ????????????????}?else?{ ??
  35. ????????????????????//?过滤器经过过滤后,过滤链继续传递请求和响应 ?? ????????????????????response.sendRedirect(redirectURl); ??
  36. ????????????????} ?? ????????????}?catch?(Throwable?e)?{ ??
  37. ????????????????LOG.error("权限过滤时候出现错误",?e); ?? ????????????????throw?new?RuntimeException("权限过滤时候出现错误",?e); ??
  38. ????????????} ?? ????????} ??
  39. ????} ?? ??
  40. ????public?void?destroy()?{ ?? ????} ??
  41. ?? }??

?

在web.xml中配置 要过滤的页面和能进入当前页面的角色

xml 代码
  1. <!---->?? ????<filter>??
  2. ????????<filter-name>UserAdminfilter-name>?? ????????<!---->??
  3. ????????<filter-class>com.emap.web.FilterServletfilter-class>?? ????????<!---->??
  4. ????????<init-param>??
  5. ??????????? <!---->?? ????????????<param-name>allowRoleparam-name>??
  6. ????????????<param-value>1param-value>?? ????????init-param>??
  7. ????filter>?? ??? <filter-mapping>??
  8. ????????<filter-name>UserAdminfilter-name>?? ????????<url-pattern>/jsp/security/*url-pattern>??
  9. ????filter-mapping>??

上面配置的意思是说,当用户进入/jsp/security文件夹下的页面的时候,程序会进入FilterServlet?里的doFilter方法里,进行权限判断。

?其他的页面权限控制:

? 1.你可以在filter里判断用户是否登录,然后需要特殊权限能访问的页面,在页面里进行判断。

? 2.推荐使用开源框架ACEGI来进行权限控制。

?

读书人网 >软件架构设计

热点推荐