登录过滤器(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似乎简单些,不知道有没有其他的缺点或者不安全的地方。
在网上也找了不少的资料,大体是用两种方法可以实现。
一、使用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似乎简单些,不知道有没有其他的缺点或者不安全的地方。
相关文章推荐
- Java transient Volatile关键字
- SpringMVC 多控制器,静态资源访问,配置文件位置更改
- Java实现给定任一字符串,长度为任意,要求找出其出现次数最多的字符及其出现次数。
- java中final的作用
- Java中判断字符串中相同字符的个数
- Eclipse注释快捷键
- Java学习之路(三) 运算符、控制语句
- Struts2 OGNL使用详解(转)
- 002-创建的Eclipse项目中红叹号问题解决思路
- Java学习——正则表达式入门
- 【转】Eclipse下配置CDT和MinGW终极方法。
- spring @Value加载配置值
- 交通灯管理系统
- 从0开始学Java——@override的作用
- java基础学习笔记
- 基于Spring+CXF技术开发WebService
- 密码加密解密
- Java web ftp
- java(4)--设计模式之模板方法模式
- java String 加法重载是在哪里实现的