1. 程式人生 > >Spring Filter過濾器,Spring攔截未登入使用者許可權限制

Spring Filter過濾器,Spring攔截未登入使用者許可權限制

 實現的功能:判斷使用者是否已登入,未登入使用者禁止訪問任何頁面或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 {
    }

}
配置中的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 模式下,還可以如下實現:
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>

就可以用了。

相關推薦

Spring Filter過濾器,Spring攔截登入使用者許可權限制

 實現的功能:判斷使用者是否已登入,未登入使用者禁止訪問任何頁面或action,自動跳轉到登入頁面。 比較好的做法是不管什麼人都不能直接訪問jsp頁面,要訪問就通過action,這樣就變成了一個實實在在的許可權控制了。 那麼就有3種方法可以解決樓主的問題 1,直接使

day32Struts2Day02(屬性和模型驅動獲取資料 攔截器定義配置和使用 攔截登入使用者)

回顧 1、Struts2框架的概述,前端控制器的模式,核心的過濾器 2、入門 編寫 struts.xml配置檔案 3、配置檔案 配置檔案的載入 4、Action類的編寫和訪問 在Struts2框架中使用Servlet的API 1、在Action類中也可以獲取到Servlet一些常用的API

五十、Filter過濾器,Interceptor攔截器,ControllerAdvice,Aspect切片

Filter過濾器,Interceptor攔截器,ControllerAdvice,Aspect切片 上圖為在web專案中,在處理request請求時得處理順序 在專案中我們改怎麼使用呢?  Filter過濾器 /** * Created by GAOMINGQIA

Filter 過濾器 && 自動登入

                                          &nb

filter(過濾器)與攔截器(AOP)區別

攔截器和過濾器的區別:   1、攔截器是基於java的反射機制,過濾器是基於java的函式回撥   2、攔截器不依賴於servlet容器,而過濾器依賴於servlet容器   3、攔截器只能對action請求起作用,過濾器幾乎對所有的請求起作用   4、攔截器可以訪問action上下文,值棧裡的物

filter過濾器攔截器的區別?

filter過濾器,在springmvc中還有攔截器,它們都能過濾請求,但是到底有什麼區別呢? 一、定義 攔截器 :是在面向切面程式設計的就是在你的service或者一個方法,前呼叫一個方法,或者在方法後呼叫一個方法比如動態代理就是攔截器的簡單實現,在你呼叫方法前打印出字

Filter過濾器+cookie實現自動登入和安全登入

實現思想: 我們只要登陸成功就把登入資訊儲存到cookie中,將使用者名稱存入session中,下一次進入介面只要通過AutoLoginfilter攔截獲取cookie,如果有登入資訊的cookie就取出來,進行自動登入處理,每一次訪問通過secureLo

Java Filter過濾器攔截路徑的配置+攔截方式的配置+生命週期+多個過濾器的先後執行順序)

Java Filter過濾器+Listen監聽器 啥是過濾器 顧名思義即過濾掉一些東西,比如我們經歷的高考中考都是過濾器,他過濾掉一些在學習這一方面不是很好的人,而那些成績好的人則升入高中,大學。 但是java中的過濾器與生活中的過濾器的作用是相差無幾的,即按照制定的一些規則來控制一些物件 Filer的作

springBoot整合spring security+JWT實現單點登入許可權管理前後端分離--築基中期

## 寫在前面 在前一篇文章當中,我們介紹了springBoot整合spring security單體應用版,在這篇文章當中,我將介紹springBoot整合spring secury+JWT實現單點登入與許可權管理。 本文涉及的許可權管理模型是**基於資源的動態許可權管理**。資料庫設計的表有 user

spring過濾器filter)、攔截器(interceptor)和切面(aop)的執行順序

1.程式執行的順序是先進過濾器,再進攔截器,最後進切面。注意:如果攔截器中preHandle方法返回的為false時,則無法進入切面,例子如下 @RestController @RequestMapping("/user") public class UserController {

web 過濾器 FilterSpring 攔截器 interceptor

拋出異常 internal 針對 turn 被調用 enc 過濾 過濾器 文件 1、過濾器(Filter)(在web.xml中註冊過濾器)   首先說一下Filter的使用地方,我們在配置web.xml時,總會配置下面一段設置字符編碼,不然會導致亂碼問題: <

Spring Boot實戰:攔截器與過濾器

www container extends post 代理 init 切面 請求 一個 一、攔截器與過濾器   在講Spring boot之前,我們先了解一下過濾器和攔截器。這兩者在功能方面很類似,但是在具體技術實現方面,差距還是比較大的。在分析兩者的區別之前,

Spring boot 配置Filter過濾器

1、通過 @WebFilter 註解來配置 @Component @WebFilter(urlPatterns = "/webapi/*", filterName = "authFilter")

Spring MVC中的攔截器/過濾器HandlerInterceptorAdapter的使用

一般情況下,對來自瀏覽器的請求的攔截,是利用Filter實現的 而在Spring中,基於Filter這種方式可以實現Bean預處理、後處理。 比如注入FilterRegistrationBean,然後在這個Bean上傳遞自己繼承Filter實現的自定義Filter進入即可。 而Spr

spring boot三大器之Filter過濾器實現

1、通過 @WebFilter 註解來配置 @Component @WebFilter(urlPatterns = "/webapi/*", filterName = "authFilter") public class AuthFilter implement

Spring web過濾器-各種filter講解

http://liuluo129.iteye.com/blog/1965268 圖來自上面連線 http://blog.csdn.net/geloin/article/details/7441330 整理於上面 Spring的web包中中有很多過濾器,這些過濾器

spring boot 攔截登入判斷及跳轉

1.使用teymeleaf及屬性 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf&

spring使用Filter過濾器對Response返回值進行修改

返回值輸出代理類:這個類主要是為了吧Response裡面的返回值獲取到,因為直接Response沒有提供直接拿到返回值的方法。所以要通過代理來取得返回值 package com.channel.filter; import java.io.ByteArrayOutp

Spring過濾器攔截

什麼是攔截器 ​ 攔截器(Interceptor): 用於在某個方法被訪問之前進行攔截,然後在方法執行之前或之後加入某些操作,其實就是AOP的一種實現策略。它通過動態攔截Action呼叫的物件,允許開發者定義在一個action執行的前後執行的程式碼

Spring Cloud系列教程 | 第七篇:使用Spring Cloud Zuul實現過濾器攔截器功能案例

推薦 Spring Cloud 視訊: 使用Spring Cloud Zuul實現過濾器或攔截器功能案例   Spring Cloud的API閘道器不但可以實現類似NGINX+Lua強大的路由分發,實現動靜頁面的分流,更重要可以實現對所有發往後端微服務請求的攔