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

让用户可以直接访问jsp本来就违反了mvc的本意了
1 直接使用filter
web.xml配置

<filter> 
        <filter-name>SecurityServlet</filter-name> 
        <filter-class>com.*.web.servlet.SecurityServlet</filter-class> 
    </filter> 
    <filter-mapping> 
        <filter-name>SecurityServlet</filter-name> 
        <url-pattern>*.jsp</url-pattern> 
    </filter-mapping> 
    <filter-mapping> 
        <filter-name>SecurityServlet</filter-name> 
        <url-pattern>*.do</url-pattern> 
    </filter-mapping>

SecurityServlet 类

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 {
    }

}

注意:

if(url!=null && !url.equals("") && ( url.indexOf("Login")<0 && url.indexOf("login")<0 )的问题,登录界面不要为index.jsp。即使你把if语句中的login改为index,过滤器会一直的index.jsp页面来跳转。所以登录界面不能为index.jsp

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

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

2 Spring拦截

Spring配置

<bean id="springSessionInterceptor" class="com.*.web.servlet.SpringLoginInterceptor" >
     </bean>
<bean id="autoPorxyFactoryBean1"
        class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="interceptorNames">
            <list>
                <value>springLoginInterceptor</value>
            </list>
        </property>
        <property name="beanNames" >
        <list>
            <value>*Controller</value>
            </list>
        </property>
    </bean>
SpringLoginInterceptor实现类

package com.web.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionMapping;

public class SpringLoginInterceptor implements MethodInterceptor {
    private static final Logger log = Logger
    .getLogger(SpringLoginInterceptor .class);

@Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        log.info("拦截开始!");
        Object[] args = invocation.getArguments(); 
        HttpServletRequest request = null;
        HttpServletResponse response = null;
        ActionMapping  mapping = null;
        for (int i = 0 ; i < args.length ; i++ )    {
          if (args[i] instanceof HttpServletRequest) request = (HttpServletRequest)args[i];  
          if (args[i] instanceof HttpServletResponse) response = (HttpServletResponse)args[i];  
          if (args[i] instanceof ActionMapping) mapping = (ActionMapping)args[i];  
        }
        if (request != null && mapping != null) {
            String url=request.getRequestURI();  
            HttpSession session = request.getSession(true);    
            String usercode = (String) request.getRemoteUser();// 登录人
            String user_role = (String)session.getAttribute("user_role");//登录人角色
           
            if (usercode == null || usercode.equals("")) {
                if ( url.indexOf("Login")<0 && url.indexOf("login")<0 ) {
                   
                    return mapping.findForward("loginInterceptor");
                } 
                return invocation.proceed();
            }
            else {
                return invocation.proceed();
            }
        }
        else {
            return invocation.proceed();
        }
    }
}
//================================================================
在 SPRING 3 MVC 模式下,还可以如下实现:

  • import Javax.servlet.http.HttpServletRequest;
  • import Javax.servlet.http.HttpServletResponse;
  • public interface HandlerInterceptor {
  • // preHandle()方法在业务处理器处理请求之前被调用
  • boolean preHandle(HttpServletRequest request, 
    HttpServletResponse response,
  • Object handler)
  • throws Exception;
  • // postHandle()方法在业务处理器处理请求之后被调用
  • void postHandle(
  • HttpServletRequest request, HttpServletResponse 
    response, Object
  • handler, ModelAndView modelAndView)
  • throws Exception;
  • // afterCompletion()方法在DispatcherServlet完全处理完请求后被调用
  • void afterCompletion(
  • HttpServletRequest request, HttpServletResponse
    response, Object
  • handler, Exception ex)
  • throws Exception;
  • }

public class SecurityFilter extends HandlerInterceptorAdapter  {

@Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        System.out.println("==>>Begin to Filter session====");
        HttpSession session = request.getSession();
        String user = (String) session.getAttribute("user");
        System.out.println("===??Current User=="+user);
        String curPath=request.getRequestURL().toString();
        System.out.println("===>> curpath:"+curPath);
        if (curPath.indexOf("GPS/User/Index")>=0){
            return true;
        }
        if(null==user || "".equals(user)){
            return true;
            /**
             * handle session and security if you want.
             */
            //request.getRequestDispatcher("/index.jsp").forward(request, response);
        }       
        return super.preHandle(request, response, handler);
    }

}
在 name-servlet.xml spring 的配置文件中注明:
<bean id="urlMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" >
        <property name="interceptors">  
           <list>  
               <bean class="com.ibm.tds.filter.SecurityFilter"/>  
           </list>  
        </property>
    </bean>

就可以用了。

近在研究struts,把以前做项目时候用拦截器实现的一些功能回想起来跟大家分享一下:

先创建一个拦截器,实现MethodFilterInterceptor这个抽象类,可以进行方法的限制和包含过滤。

该拦截器实现未登录不能进行访问的功能,可以扩展成对权限进行控制。

package com.struts2.interceptor;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsStatics;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

public class LoginInterceptor extends MethodFilterInterceptor {
 @Override
 protected String doIntercept(ActionInvocation invocation) throws Exception {
  // TODO Auto-generated method stub
  ActionContext context = invocation.getInvocationContext();
  
  //通过ActionContext来获取httpRequest
  HttpServletRequest request = (HttpServletRequest)context.get(StrutsStatics.HTTP_REQUEST); 
  //也可以通过ServletActionContext来获取httpRequest
  //HttpServletRequest request = ServletActionContext.getRequest();
  //取得根目录的绝对路径
  String currentURL = request.getRequestURI();   
  //截取到访问的相对路径,可以通过这个和权限表比较来进行相应的权限控制
  String targetURL = currentURL.substring(currentURL.indexOf("/", 1), currentURL.length());
  System.out.println(currentURL+".............."+targetURL);
  
  //通过ActionContext获取session的信息,以Map形式返回
  Map session = context.getSession();
  //获取容器里面的username值,如果存在说明该用户已经登录,让他执行操作,如果未登录让他进行登录
  String username = (String)session.get("username");
  if(username!=null){
   invocation.invoke();
  }
  context.put("nologin", "对不起,你没有登录,不能进行该操作");
  return "login";
  
 }

}

然后将这个拦截器配置的struts.xml里面:

<!-- 配置拦截器 -->
 <package name="my-default" extends="struts-default">
     <interceptors>
         <!-- 配置未登录进行操作的拦截器 -->
         <interceptor name="loginInterceptor" class="com.struts2.interceptor.LoginInterceptor">
             <param name="param">测试参数</param>
         </interceptor>
         <!-- 重新封装一个默认的拦截器栈 -->
         <interceptor-stack name="myDefaultStack">
               <interceptor-ref name="loginInterceptor" />
               <interceptor-ref name="defaultStack" />
         </interceptor-stack>
     </interceptors>
     <!-- 为这个包设置默认的拦截器栈 -->
     <default-interceptor-ref name="myDefaultStack" />
     <!-- 设置全局的返回值 -->
     <global-results>
          <result name="login">/login.jsp</result>
     </global-results>
 </package>

转载于:https://blog.51cto.com/4925054/1038230

Spring Filter过滤器,Spring拦截未登录用户权限限制相关推荐

  1. struts2拦截器--拦截未登录用户

    拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重 ...

  2. SpringBoot——使用拦截器拦截未登录用户

    前置知识SpringBoot配置拦截器基于HandlerInterceptor接口实现,关键三个方法 preHandle()执行目标之前 postHandle()执行目标之后 afterComplet ...

  3. shiro 同时实现url和按钮的拦截_Shiro是如何拦截未登录请求的(一)

    问题描述 之前在公司搭项目平台的时候权限框架采用的是shiro,由于系统主要面向的是APP端的用户,PC端仅仅是公司内部人员在使用,而且考虑到系统的可用性和扩展性,服务端首先基于shiro做了一些改造 ...

  4. jsp中未登录用户也可以浏览页面的功能实现代码

    jsp中未登录用户也可以浏览页面的功能实现代码 <%!                int count=0;               %>                  < ...

  5. html页面怎么判断未登录,未登录用户.html

     未登录用户 $axure.utils.getTransparentGifPath = function() { return 'resources/images/transparent.gif'; ...

  6. B站(bilibili)对未登录用户视频观看进行暂停和弹窗的分析与简单解决方案

    怎么说呢,这个方法发出来也不知道多快被和谐. 所以也不知道会不会直接就加入强行更新和谐的方法,毕竟用户只是使用方. 水那么一下只是为了吐槽我找了两个小时没人给出答案. 也是对B站限制登录的营销手段有点 ...

  7. 关于B站(bilibili)对未登录用户视频观看进行暂停和弹窗的分析与简单解决方案

    关于B站(bilibili)对未登录用户视频观看进行暂停和弹窗的分析与简单解决方案 情况介绍 简要分析 初步的解决方案 总结(太长不看点这里) 情况介绍 于近日的某次更新后,B站(bilibili)网 ...

  8. js实现未登录用户跳转到登录页面登录完成后返回原页面

    首先要获取未登录用户浏览的当前页面的路径: var preUrl=window.location.href; 在提示登录的跳转链接里利用url传参: window.open("../logi ...

  9. 三层结构的任务管理系统可以实现登录,判断登录用户权限等操作

    任务要求 idea jdk1.8 三层结构的任务管理系统可以实现登录,判断登录用户权限等操作 任务管理系统 一.系统需求 查询所有任务信息:展示所有任务信息 录入任务信息: 用户输入:任务名, 预计完 ...

最新文章

  1. matlab 取消figure显示时在屏幕最前
  2. pandas获取dataframe中索引值最大值所在的数据行(get dataframe row of max index value)
  3. OAuth2.0 基础概述
  4. sai u 2016
  5. jar包的生成和使用简单例子
  6. (转)git常用命令
  7. mysql %3e -u -r_mysql基础
  8. 高级Blazor:从Edge共享程序集和调试
  9. java int 指针_如何在Java中使用指针?
  10. ui曲线谁是横坐标_【鼎阳硬件智库原创 | 测试测量】关于示波器的幅频特性曲线...
  11. 让IT不加班,让业务不等待,一文讲透自助式分析的前世今生
  12. mysql源码包和二进制包_Linux下MySQL安装(二进制包和源码包)
  13. Java关于周跨年的周数计算,编写一个JAVA类,用于计算两个日期之间的周数。
  14. 未能找到主机服务器是什么鬼,未能找到指定主机服务器是什么意思
  15. 软件架构风格——4+1视图、5大传统架构风格及其它风格
  16. wincc 脚本 实现计算机重启,安装WINCC过程中提示需要重启电脑,请问如何解决?-工业支持中心-西门子中国...
  17. 博士申请 | 香港城市大学计算机学院徐伟涛老师组招收人工智能全奖博士生
  18. 谈谈Oracle甲骨文可视化文件查看器:AutoVue
  19. HTML5文件夹隐藏了怎么打开,win10怎么打开隐藏文件夹
  20. 戴尔服务器虚拟 介质,使用Dell R710 IDRAC挂载虚拟介质

热门文章

  1. java8 同步队列_秋招之路8:JAVA锁体系和AQS抽象队列同步器
  2. 三调 图斑地类面积_国土三调攻坚冲刺,大疆无人机为调查举证提供加速度
  3. Java多线程复习:1(进程和线程、并发和并行)
  4. Java学习总结:14
  5. Java项目:在线水果商城系统(java+JSP+Spring+SpringMVC +MyBatis+html+mysql)
  6. 合并道路_资质改革已经确定!盘点被合并的资质!有这资质的要注意了
  7. quickpcb添加pcb库_quickpcb使用说明
  8. oracle 与 client端执行结果不一致_不同模式下Spark应用的执行过程
  9. Linux基础知识汇总(2)...持续更新中
  10. ubuntu如何修改字符集编码