最近,在做权限验证的时候,要通过用户登录,判断用户的权限,根据权限显示不同的东西和操作。这样就登录验证就必须要做了。进入系统的用户必须得登录才能进入系统。否则跳转到登录页面。
在网上也找了不少的资料,大体是用两种方法可以实现。
一、使用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实例
- ActionContext ctx = invocation.getInvocationContext();
- Map session = ctx.getSession();
- //取出名为user的Session属性
- NiUser user = (NiUser)session.get("user");
- //如果没有登陆,都返回重新登陆
- if (user != null)
- {
- return invocation.invoke();
- }
- //没有登陆,将服务器提示设置成一个HttpServletRequest属性
- ctx.put("tip" , "您还没有登陆,请输入scott,tiger登陆系统");
- //直接返回login的逻辑视图 此处和配置文件对应
- return Action.LOGIN;
- }
- }
此种做法可以实现url的拦截,但是,有一点,他只能在拦截器所配置的package下起作用,其他的package下仍然可以不登录通过url访问。还需要在每个package下都配置一遍,我不知道还有没有其他的方法。拦截器给我的感觉就是很灵活,灵活的代价是增加了代码量。不知道理解的对不对?
二、Filter(基于javax.servlet.Filter)
它需要在web.xml中做如下配置
- <!-- loginFilter 交给spring管理 -->
- <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 {
- //do something
- }
- 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"))){//若访问后台资源 过滤到login
- NiUser user=(NiUser)session.getAttribute("user");
- if(user==null){//转入管理员登陆页面
- response.sendRedirect(contextPath+"/login.action");
- return;
- }
- }
- filterChain.doFilter(sRequest, sResponse);
- }
- }
以上两种方法都能实现防止不经登录直接url访问,但Filter似乎简单些,不知道有没有其他的缺点或者不安全的地方。
原文地址:http://blog.csdn.net/markzwei/article/details/6305812