判断用户是否已登录,未登录用户禁止访问任何页面或action,自动跳转到登录页面

实现的功能:判断用户是否已登录,未登录用户禁止访问任何页面或action,自动跳转到登录页面。
比较好的做法是不管什么人都不能直接访问jsp页面,要访问就通过action,这样就变成了一个实实在在的权限控制了。
那么就有3种方法可以解决楼主的问题
1,直接使用filter
2,直接使用webwork的interceptor,
3,将action交给spring管理,使用spring的Aop机制

让用户可以直接访问jsp本来就违反了mvc的本意了
1 直接使用filter
web.xml配置
Xml代码 复制代码 收藏代码
  1. <filter>   
  2.     <filter-name>SecurityServlet</filter-name>   
  3.     <filter-class>com.*.web.servlet.SecurityServlet</filter-class>   
  4. </filter>   
  5. <filter-mapping>   
  6.     <filter-name>SecurityServlet</filter-name>   
  7.     <url-pattern>*.jsp</url-pattern>   
  8. </filter-mapping>   
  9. <filter-mapping>   
  10.     <filter-name>SecurityServlet</filter-name>   
  11.     <url-pattern>*.do</url-pattern>   
  12. </filter-mapping>  



SecurityServlet 类
Java代码 复制代码 收藏代码
  1. package com.*.web.servlet; 
  2.  
  3. import java.io.IOException; 
  4. import javax.servlet.Filter; 
  5. import javax.servlet.FilterChain; 
  6. import javax.servlet.FilterConfig; 
  7. import javax.servlet.ServletException; 
  8. import javax.servlet.ServletRequest; 
  9. import javax.servlet.ServletResponse; 
  10. import javax.servlet.http.HttpServlet; 
  11. import javax.servlet.http.HttpServletRequest; 
  12. import javax.servlet.http.HttpServletResponse; 
  13. import javax.servlet.http.HttpSession; 
  14. public class SecurityServlet extends HttpServlet implements Filter { 
  15.     private static final long serialVersionUID = 1L; 
  16.  
  17.     public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { 
  18.            HttpServletRequest request=(HttpServletRequest)arg0;    
  19.            HttpServletResponse response  =(HttpServletResponse) arg1;     
  20.            HttpSession session = request.getSession(true);      
  21.            String usercode = (String) request.getRemoteUser();// 登录人 
  22.            String user_role = (String)session.getAttribute("role");//登录人角色 
  23.            String url=request.getRequestURI();    
  24.            if(usercode==null || "".equals(usercode) || user_role == null || "".equals(user_role)) {       
  25.                 //判断获取的路径不为空且不是访问登录页面或执行登录操作时跳转    
  26.                 if(url!=null && !url.equals("") && ( url.indexOf("Login")<0 && url.indexOf("login")<0 )) {    
  27.                     response.sendRedirect(request.getContextPath() + "/login.jsp");    
  28.                     return ;    
  29.                 }               
  30.             }    
  31.             arg2.doFilter(arg0, arg1);    
  32.             return;    
  33.     } 
  34.     public void init(FilterConfig arg0) throws ServletException { 
  35.     } 
  36.  
package com.*.web.servlet;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SecurityServlet extends HttpServlet implements Filter {
	private static final long serialVersionUID = 1L;

	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
	  	   HttpServletRequest request=(HttpServletRequest)arg0;   
		   HttpServletResponse response  =(HttpServletResponse) arg1;    
		   HttpSession session = request.getSession(true);     
		   String usercode = (String) request.getRemoteUser();// 登录人
		   String user_role = (String)session.getAttribute("role");//登录人角色
		   String url=request.getRequestURI();   
		   if(usercode==null || "".equals(usercode) || user_role == null || "".equals(user_role)) {      
	            //判断获取的路径不为空且不是访问登录页面或执行登录操作时跳转   
	            if(url!=null && !url.equals("") && ( url.indexOf("Login")<0 && url.indexOf("login")<0 )) {   
	                response.sendRedirect(request.getContextPath() + "/login.jsp");   
	                return ;   
	            }              
	        }   
            arg2.doFilter(arg0, arg1);   
            return;   
	}
	public void init(FilterConfig arg0) throws ServletException {
	}

}

配置中的filter-mapping,定义的是需过滤的请求类型,上面的配置即过滤所有对jsp页面和action的请求。过滤器的实现与struts2、spring框架无关,在用户请求被相应前执行,在过滤器中,可使用response.sendRedirect("")等方法

跳转到需要的链接,如登录页面、错误页面等,不需要跳转时,arg2.doFilter(arg0, arg1);即可继续执行用户的请求。注意使用filter时避免连续两次跳转,否则会报java.lang.IllegalStateException错误,具体配置方法网上有,除非必要,不建议使用/*(过滤所有访问)的配置方式,这样配置,图片、js文件、css文件等访问都会被过滤


2 Spring拦截

Spring配置
Xml代码 复制代码 收藏代码
  1. <bean id="springSessionInterceptor" class="com.*.web.servlet.SpringLoginInterceptor" > 
  2.      </bean> 
  3. <bean id="autoPorxyFactoryBean1" 
  4.         class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 
  5.         <property name="interceptorNames"> 
  6.             <list> 
  7.                 <value>springLoginInterceptor</value> 
  8.             </list> 
  9.         </property> 
  10.         <property name="beanNames" > 
  11.         <list> 
  12.             <value>*Controller</value> 
  13.             </list> 
  14.         </property> 
  15.     </bean> 

SpringLoginInterceptor实现类

Java代码 复制代码 收藏代码

  1. package com.web.servlet; 
  2.  
  3. import javax.servlet.http.HttpServletRequest; 
  4. import javax.servlet.http.HttpServletResponse; 
  5. import javax.servlet.http.HttpSession; 
  6.  
  7. import org.aopalliance.intercept.MethodInterceptor; 
  8. import org.aopalliance.intercept.MethodInvocation; 
  9. import org.apache.log4j.Logger; 
  10. import org.apache.struts.action.ActionMapping; 
  11.  
  12. public class SpringLoginInterceptor implements MethodInterceptor { 
  13.     private static final Logger log = Logger 
  14.     .getLogger(SpringLoginInterceptor .class); 
  15.  
  16.     @Override 
  17.     public Object invoke(MethodInvocation invocation) throws Throwable { 
  18.         log.info("拦截开始!"); 
  19.         Object[] args = invocation.getArguments();   
  20.         HttpServletRequest request = null
  21.         HttpServletResponse response = null
  22.         ActionMapping  mapping = null
  23.         for (int i = 0 ; i < args.length ; i++ )    { 
  24.           if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args[i];    
  25.           if (args[i] instanceof HttpServletResponse) response = (HttpServletResponse)args[i];    
  26.           if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];    
  27.         } 
  28.         if (request != null && mapping != null) { 
  29.             String url=request.getRequestURI();    
  30.             HttpSession session = request.getSession(true);      
  31.             String usercode = (String) request.getRemoteUser();// 登录人 
  32.             String user_role = (String)session.getAttribute("user_role");//登录人角色 
  33.              
  34.             if (usercode == null || usercode.equals("")) { 
  35.                 if ( url.indexOf("Login")<0 && url.indexOf("login")<0 ) { 
  36.                      
  37.                     return mapping.findForward("loginInterceptor"); 
  38.                 }   
  39.                 return invocation.proceed();  
  40.             } 
  41.             else
  42.                 return invocation.proceed(); 
  43.             } 
  44.         } 
  45.         else
  46.             return invocation.proceed(); 
  47.         } 
  48.     } 

 

http://pouyang.iteye.com/blog/695429

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值