在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ shiro為什么攔截不存在的請求

shiro為什么攔截不存在的請求

spring整合shiro后,在登陸認證之前會攔截不存在的請求:

這是我的loginrul配置:<property name="loginUrl" value="/signIn" />
項目啟動后我輸入一個不存在的地址:http://localhost:8080/demo/abc123,也會進入loginurl配置的signIn,demo是我的項目名,dbc123是一個不存在的請求。



web.xml配置:



    <!-- 加載spring容器 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/applicationContext-*.xml</param-value>
    </context-param>
    <!-- spring內(nèi)監(jiān)聽器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 防止spring內(nèi)存溢出監(jiān)聽器 -->
    <listener>
        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
    </listener>




    <!-- post亂碼過慮器 -->
    <!-- 除了加過濾器,由于tomcat默認編碼ISO-8859-1,還需要修改 %tomcat%/conf/server.xml Connector 標簽加屬性 URIEncoding="UTF-8" -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>



    <!-- shiro的filter -->
    <!-- shiro過慮器,DelegatingFilterProxy通過代理模式將spring容器中的bean和filter關(guān)聯(lián)起來 -->
    <filter>
        <filter-name>shiroFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        <!-- 設(shè)置true由servlet容器控制filter的生命周期 -->
        <init-param>
            <param-name>targetFilterLifecycle</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>shiroFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>







    <!-- springmvc前端控制器,rest配置 -->
    <servlet>
        <servlet-name>springmvc_rest</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc_rest</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>


    <!-- 靜態(tài)資源解析 -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/script/*</url-pattern>
        <url-pattern>/style/*</url-pattern>
        <url-pattern>/WEB-INF/html/*</url-pattern>
        <url-pattern>/login.html</url-pattern>
    </servlet-mapping>

spring-shiro配置:


    <!-- web.xml中shiro的filter對應(yīng)的bean -->
    <!-- Shiro 的Web過濾器 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">

        <property name="securityManager" ref="securityManager" />
        <!-- loginUrl認證提交地址,如果沒有認證將會請求此地址進行認證,請求此地址將由formAuthenticationFilter進行表單認證 -->
        <property name="loginUrl" value="/signIn" />
        <!-- 認證成功統(tǒng)一跳轉(zhuǎn)到first.action,建議不配置,shiro認證成功自動到上一個請求路徑 -->
        <property name="successUrl" value="/index"/>

        <!-- 自定義filter配置 -->
        <property name="filters">
            <map>
                <!-- 將自定義 的FormAuthenticationFilter注入shiroFilter中-->
                <entry key="authc" value-ref="formAuthenticationFilter" />
            </map>
        </property>



        <!-- 過慮器鏈定義,從上向下順序執(zhí)行,一般將/**放在最下邊 -->
        <property name="filterChainDefinitions">
            <value>
                <!-- 對靜態(tài)資源設(shè)置匿名訪問 -->
                /script/**       = anon
                /style/**        = anon
                /WEB-INF/html/** = anon
                <!--/login.html      = anon-->


                <!-- 請求 logout.action地址,shiro去清除session-->
                /logout = logout


                <!-- /** = authc 所有url都必須認證通過才可以訪問-->
                /** = authc
            </value>
        </property>
    </bean>



    <!-- securityManager安全管理器 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="ssmRealm" />
        <property name="sessionManager" ref="sessionManager" />
    </bean>



    <!-- realm -->
    <bean id="ssmRealm" class="com.shiro.realm.SsmRealm"></bean>



    <!-- 會話管理器 -->
    <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
        <property name="sessionIdUrlRewritingEnabled" value="false" />
        <!-- session的失效時長,單位毫秒 -->
        <property name="globalSessionTimeout" value="600000"/>
        <!-- 刪除失效的session -->
        <property name="deleteInvalidSessions" value="true"/>
    </bean>


    <!-- 自定義form認證過慮器 -->
    <!-- 基于Form表單的身份驗證過濾器,不配置將也會注冊此過慮器,表單中的用戶賬號、密碼及l(fā)oginurl將采用默認值,建議配置 -->
    <bean id="formAuthenticationFilter" class=" com.shiro.filter.CustomFormAuthenticationFilter"></bean>

CustomFormAuthenticationFilter.java:

public class CustomFormAuthenticationFilter extends FormAuthenticationFilter {


    /**
     * 認證成功跳轉(zhuǎn)到指定地址
     * @param token
     * @param subject
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    @Override
    protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request, ServletResponse response) throws Exception {

        WebUtils.getAndClearSavedRequest(request);
        WebUtils.redirectToSavedRequest(request,response,"/index");

        return false;
    }
}

我大概知道問題是出在shiro的攔截器,可是我不明白為什么shiro攔截器會攔截不存在的請求,此時應(yīng)該是404;
希望有了解過的人抽點時間幫我參考下,非常感謝!

回答
編輯回答
離夢

沒做機測,發(fā)表下我的想法,這應(yīng)該和訪問url有關(guān)系,abc123不一定是path,也可以參數(shù)${}類似這種形式,這樣還是在訪問你的工程,你設(shè)置的是/**=auth 應(yīng)該會去校驗權(quán)限,你試試多測試別的url,會不會出現(xiàn)。

2017年2月11日 02:57