您的位置:首页 > 编程语言 > Java开发

登录过滤器(Struts2)

2015-10-16 11:11 369 查看
最近,在做权限验证的时候,要通过用户登录,判断用户的权限,根据权限显示不同的东西和操作。这样就登录验证就必须要做了。进入系统的用户必须得登录才能进入系统。否则跳转到登录页面。

在网上也找了不少的资料,大体是用两种方法可以实现。

一、使用struts2的拦截器(Interceptor)

struts2的拦截器很灵活,可以在每个action中配置不同的拦截器,也可以配置通用的。像下面这样……

[java] view
plaincopy

<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如下

[c-sharp] view
plaincopy

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中做如下配置

[xhtml] view
plaincopy

<!-- 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文件与之对应

[java] view
plaincopy

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似乎简单些,不知道有没有其他的缺点或者不安全的地方。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: