最近,在做权限验证的时候,要通过用户登录,判断用户的权限,根据权限显示不同的东西和操作。这样就登录验证就必须要做了。进入系统的用户必须得登录才能进入系统。否则跳转到登录页面。
在网上也找了不少的资料,大体是用两种方法可以实现。
一、使用struts2的拦截器(Interceptor)
struts2的拦截器很灵活,可以在每个action中配置不同的拦截器,也可以配置通用的。像下面这样……
- <interceptors>
- <interceptor name="authority" class="cn.common.AuthorityInterceptor"/>
- <interceptor-stack name="myStack">
- <interceptor-ref name="defaultStack"/>
- <interceptor-ref name="authority"/>
- </interceptor-stack>
- </interceptors>
- <default-interceptor-ref name="myStack"></default-interceptor-ref>
- <!-- 全局的跳转结果 和下面的action中是对应的 -->
- <global-results>
- <result name="login">/login.jsp</result>
- </global-results>
AuthorityInterceptor.java如下
- public class AuthorityInterceptor extends AbstractInterceptor {
-
- @Override
- public String intercept(ActionInvocation invocation) throws Exception {
-
-
- ActionContext ctx = invocation.getInvocationContext();
- Map session = ctx.getSession();
-
- NiUser user = (NiUser)session.get("user");
-
- if (user != null)
- {
- return invocation.invoke();
- }
-
- ctx.put("tip" , "您还没有登陆,请输入scott,tiger登陆系统");
-
- return Action.LOGIN;
-
- }
- }
此种做法可以实现url的拦截,但是,有一点,他只能在拦截器所配置的package下起作用,其他的package下仍然可以不登录通过url访问。还需要在每个package下都配置一遍,我不知道还有没有其他的方法。拦截器给我的感觉就是很灵活,灵活的代价是增加了代码量。不知道理解的对不对?
二、Filter(基于javax.servlet.Filter)
它需要在web.xml中做如下配置
-
- <filter>
- <filter-name>loginFilter</filter-name>
- <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
- <init-param>
- <param-name>targetFilterLifecycle</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>loginFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
同样要有个java文件与之对应
- public class LoginFilter extends HttpServlet implements Filter {
-
- private static final long serialVersionUID = 1L;
- public void init(FilterConfig arg0) throws ServletException {
-
- }
- public void doFilter(ServletRequest sRequest, ServletResponse sResponse,
- FilterChain filterChain) throws IOException, ServletException{
- HttpServletRequest request = (HttpServletRequest) sRequest;
- HttpServletResponse response = (HttpServletResponse) sResponse;
- HttpSession session = request.getSession();
- String url=request.getServletPath();
- String contextPath=request.getContextPath();
- if(url.equals(""))url+="/";
- if((url.startsWith("/")&&!url.startsWith("/login"))){
- NiUser user=(NiUser)session.getAttribute("user");
- if(user==null){
- response.sendRedirect(contextPath+"/login.action");
- return;
- }
- }
- filterChain.doFilter(sRequest, sResponse);
- }
-
- }
以上两种方法都能实现防止不经登录直接url访问,但Filter似乎简单些,不知道有没有其他的缺点或者不安全的地方。
|